情况
我正在使用 Java 进行 RSA 加密。我正在尝试在配备 Cyanogenmod 的 Android 2.2 的 HTC Saphire (32B) 开发人员手机上加密数据,然后在运行 Mandriva Linux 2010 的 64 位服务器上解密所述数据。我在两台机器上使用相同的公钥、私钥对,可以在Android手机上正确加密/解密数据,可以在Linux服务器上正确加密/解密数据,但是我无法在手机上加密数据,然后在服务器上解密。我收到错误的填充异常。我已经确认手机正确发送了数据并且服务器正确解析了数据。因此,我无法弄清楚为什么解密失败。谁能帮我这个?也许 Java 中的 RSA 算法对字长有一些潜在的假设?
更多信息:
- 我的加密/解密库基于找到的指南 here.
- 我的加密 key 长度为 2048 位,但我看到不同 key 大小的类似行为。
- 我已经将我的 RSA 加密/解密代码打包到一个 jar 文件中。它是通过服务器机器上的 Eclipse 编译的。
- Android手机上使用加密库的程序使用上述库。它也是使用 Eclipse 构建的。
- 服务器程序是使用 Netbeans 构建的(因为当时这样做更容易)。
其他问题
- 是否有其他可用于 Java 的免费公钥加密算法/库?他们跨平台工作吗?人们期望他们有什么样的表现?等等,等等。我已经对此进行了调查,但发现不多;也许我在寻找错误的关键字。
呸!我想就是这样。提前感谢您的帮助!
最佳答案
无论环境如何,RSA 加密(或任何加密算法)都应该有效。但是,某些系统可能对默认填充和操作模式做出不同的假设。确保在执行加密和解密时,不仅要完全指定算法,还要完全指定操作模式(CBC 等)和填充。如果这不起作用,我建议从设备和服务器发布您的代码,以便我们可以更仔细地检查它。
编辑 为了解决您的问题,在 Java 中,当您从 crypto 包中获取密码时,通常使用以下代码:
Cipher cipher;
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
提供给 getInstance
的字符串指示运行时获取将使用 AES 算法、密码 block 链接操作模式和 PKCS5 填充的密码实例。有许多受支持的算法和填充。我会查看 this document from Oracle有关 Java 加密的更多信息。
更具体地说,您用于请求密码的字符串的格式为
<algorithm>/<mode of operation>/<padding>
更糟糕的是,尽管 Java 提供了许多算法、操作模式和填充,但并非所有这些都可以协同工作。您将需要阅读文档以找到有效的配置字符串。
关于java - Java : Cross Platform Issues? 中的 RSA 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4926126/