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