gpt4 book ai didi

Android RSA 解密(失败)/服务器端加密(openssl_public_encrypt)

转载 作者:太空狗 更新时间:2023-10-29 15:42:04 25 4
gpt4 key购买 nike

我正在尝试使用在我的设备上生成的 RSA key 来解密我的 android 应用程序中的字符串。加密由 php 服务完成,使用我的应用程序提供的公共(public) rsa key 。我的问题是解密失败。

我正在做以下事情:

  • 在 Android 上生成 key 对(使用 KeyPairGenerator.getInstance("RSA"))-> 确定

  • 两个 key (公钥和私钥)在使用 Base64.encode(pubKey.getEncoded()) 进行“base64”编码后保存到文件中,与私钥相同。 -> 确定

  • 当我调用我的 web 服务时,我在一个 post 变量中传递我的公钥(基于 64 位)-> OK

  • 网络服务(一个 php 服务),使用公钥加密一个短字符串,使用 openssl_public_encrypt 函数。加密的字符串被转换为 base64。 -> 似乎没问题,函数不返回 FALSE。

  • 最后一件事是解密这个字符串,我正在做以下事情:-> 不行

    密码cipher = Cipher.getInstance("RSA");

    cipher.init(Cipher.DECRYPT_MODE, privateKey);

    byte[] decryptedBytes = cipher.doFinal(cryptedBytes);

    String decryptedString = new String(decryptedBytes);

    System.out.println(解密字符串);

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

我错过了什么?

最佳答案

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

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

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


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

关于Android RSA 解密(失败)/服务器端加密(openssl_public_encrypt),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17819183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com