我正在尝试在Android应用程序中使用在我的设备上生成的RSA密钥解密字符串。加密是通过一个php服务完成的,该服务使用应用程序提供的公共RSA密钥。我的问题出在解密过程中,它一直失败。
我正在进行以下操作:
- 在Android上生成KeyPair(使用KeyPairGenerator.getInstance(“RSA”))-> OK - 两个密钥(公钥和私钥)在编码为Base64.encode(pubKey.getEncoded())并将其相同的私钥存储到文件中后保存。-> OK - 当我调用web服务时,在POST变量中传递我的公钥(以base 64格式)-> OK - web服务(php服务)使用公钥用openssl_public_encrypt函数加密短字符串,加密后的字符串转换为base64。 -> 看起来不错,该函数没有返回FALSE。 - 应用程序检索服务的结果,并对其进行解码(Base64.decode())-> OK(我已经检查,接收到的字节与由openssl_public_encrypt()函数生成的字节匹配) - 最后一件事是解密这个字符串,我正在执行以下操作:->NOT 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);
解密的结果与我的原始字符串不匹配。
我有什么遗漏的吗?
我正在进行以下操作:
- 在Android上生成KeyPair(使用KeyPairGenerator.getInstance(“RSA”))-> OK - 两个密钥(公钥和私钥)在编码为Base64.encode(pubKey.getEncoded())并将其相同的私钥存储到文件中后保存。-> OK - 当我调用web服务时,在POST变量中传递我的公钥(以base 64格式)-> OK - web服务(php服务)使用公钥用openssl_public_encrypt函数加密短字符串,加密后的字符串转换为base64。 -> 看起来不错,该函数没有返回FALSE。 - 应用程序检索服务的结果,并对其进行解码(Base64.decode())-> OK(我已经检查,接收到的字节与由openssl_public_encrypt()函数生成的字节匹配) - 最后一件事是解密这个字符串,我正在执行以下操作:->NOT 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);
解密的结果与我的原始字符串不匹配。
我有什么遗漏的吗?
Cipher.getInstance("RSA")
默认使用“纯文本RSA”——没有填充——这是一点都不安全的。我不知道PHP代码使用什么样的填充,因为你没有展示它,但你应该在两端都改为OAEP填充。 - ntoskrnl