【问题标题】:Android RSA decryption (fails) / server-side encryption (openssl_public_encrypt)Android RSA 解密(失败)/服务器端加密(openssl_public_encrypt)
【发布时间】: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


【解决方案1】:

OpenSSL 默认使用padding = OPENSSL_PKCS1_PADDING。所以要在两边都有相同的填充机制,你应该使用Cipher.getInstance("RSA/ECB/PKCS1Padding")。这也是您可以在 Java SE 中使用的。

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

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


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

【讨论】:

  • 感谢@owlstead,使用getInstance("RSA/ECB/PKCS1Padding") 我的服务器端脚本可以正确解密我的 Android 应用程序加密的内容。但是,如果我使用getInstance("RSA/None/PKCS1Padding")(虽然服务器端的解密不起作用),我有“RSA 块的数据过多”异常,但也没有异常。有什么想法吗?
  • 这似乎是混合加密的一个明确案例。不应单独使用 RSA 加密;通常,您应该加密一个新的、随机生成的 AES 密钥,并使用该 AES 密钥对数据进行加密(例如,使用 CBC 操作模式),这样您就可以加密几乎无限量的明文。
  • @MaartenBodewes 导致 android 设备有根,我不想将解密密钥放在客户端,那么如何解密在服务器端加密的文件,在 android 设备中?请看我的相关问题:stackoverflow.com/questions/30951805/protected-document-viewer
猜你喜欢
  • 2015-01-09
  • 2015-10-29
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 2020-10-14
  • 2015-02-27
  • 1970-01-01
  • 2021-09-22
相关资源
最近更新 更多