【发布时间】:2013-07-23 01:17:21
【问题描述】:
我正在尝试使用在我的设备上生成的 RSA 密钥解密我的 android 应用程序中的字符串。加密由 php 服务使用我的应用程序提供的公共 rsa 密钥完成。我的问题是解密失败。
我正在做以下事情:
在 Android 上生成密钥对(使用 KeyPairGenerator.getInstance("RSA"))-> 确定
两个密钥(公钥和私钥)在使用 Base64.encode(pubKey.getEncoded()) 进行“base64”编码后保存到文件中,与私钥相同。 -> 好的
当我调用我的 web 服务时,我在 post 变量中传递了我的公钥(以 64 为基数) -> OK
Web 服务(一个 php 服务)使用公钥加密一个短字符串,带有 openssl_public_encrypt 函数。加密的字符串被转换为 base64。 -> 看起来不错,该函数不返回 FALSE。
应用程序检索服务结果,并对其进行解码 (Base64.decode()) -> OK(我已检查,接收到的字节与 openssl_public_encrypt() 函数生成的字节匹配)
-
最后一件事是解密这个字符串,我正在做以下事情:-> 不行
密码密码 = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = cipher.doFinal(cryptedBytes);
String decryptedString = new String(decryptedBytes);
System.out.println(decryptedString);
解密的结果和我原来的字符串不符。
我错过了什么?
【问题讨论】:
-
Cipher.getInstance("RSA")默认为“textbook RSA”——没有填充——这根本不安全。我不知道PHP代码使用什么样的填充,因为你没有展示它,但你应该把它两端都改为OAEP。 -
@ntoskrnl 您可以将其更改为我猜的答案。请注意,默认的“RSA/NONE/NoPadding”仅适用于 Bouncy Castle,Java SE(或更准确地说,Sun JCE)默认为“RSA/ECB/PKCS1Padding”。
-
@owlstead 好点——也说明了显式声明模式而不是依赖于实现之间不同的默认值的重要性。
标签: android encryption openssl rsa