2

我正在尝试使用设备上生成的 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);

    字符串解密字符串 = 新字符串(解密字节);

    System.out.println(decryptedString);

解密的结果与我的原始字符串不匹配。

我错过了什么?

4

1 回答 1

10

OpenSSLpadding = OPENSSL_PKCS1_PADDING默认使用。因此,要在两侧使用相同的填充机制,您应该使用Cipher.getInstance("RSA/ECB/PKCS1Padding"). 这也是您可以在 Java SE 中使用的。

请注意,依赖密码学中的默认操作模式是非常危险的。许多实现具有不同的默认值,并且很难查找。因此,请始终尝试完全指定要使用的算法/模式。

您可以尝试其他 RSA 填充模式,但请注意,不幸的是,Android 已从他们改编的 Bouncy Castle 源代码中禁用了许多算法和别名。


[编辑] 这是一个旧答案,现在强烈建议使用 OAEP 填充,或者使用 RSA-KEM 进行混合加密。

于 2013-07-23T20:56:41.733 回答