10

情况

我正在使用 Java 中的 RSA 加密。我正在尝试在配备 Cyanogenmod 的 Android 2.2 的 HTC Saphire (32B) 开发人员手机上加密数据,然后在运行 Mandriva Linux 2010 的 64 位服务器上解密所述数据。我在两台机器上使用相同的公钥、私钥对,可以在Android手机上正确加密/解密数据,可以在Linux服务器上正确加密/解密数据,但是我无法在手机上加密数据,然后在服务器上解密。我得到糟糕的填充异常。我已经确认手机正确发送了数据,并且服务器正在正确解析数据。因此,我无法弄清楚为什么解密失败。谁能帮我这个?也许Java中的RSA算法对字长有一些基本假设?

更多的信息:

  • 我的加密/解密库基于此处找到的指南。
  • 我的加密密钥长度为 2048 位,但我看到具有不同密钥大小的类似行为。
  • 我已将我的 RSA 加密/解密代码打包成一个 jar 文件。它是在服务器机器上通过 Eclipse 编译的。
  • 安卓手机上使用加密库的程序就是使用上面的库。它也是使用 Eclipse 构建的。
  • 服务器程序是使用 Netbeans 构建的(因为当时这样做更容易)。

其他问题

  • 是否还有其他可用于 Java 的免费公钥加密算法/库?他们是否跨平台工作?人们期望他们有什么样的表现?等等,等等。我已经调查过了,但没有发现太多;也许我正在寻找错误的关键字。

呸!我想就是这样。提前感谢您的帮助!

4

2 回答 2

11

无论环境如何,RSA 加密(或任何加密算法)都应该有效。但是,某些系统可能会对默认填充和操作模式做出不同的假设。确保在执行加密和解密时不仅完全指定算法,而且还指定操作模式(CBC 等)和填充。如果这不起作用,我建议从设备和服务器上发布您的代码,以便我们可以更仔细地检查它。

编辑为了解决您的问题,在 Java 中,当您从 crypto 包中获取密码时,通常使用以下代码:

Cipher cipher;
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

提供的字符串getInstance指示运行时获取将使用 AES 算法、密码块链接操作模式和 PKCS5 填充的密码实例。有许多受支持的算法和填充。我会查看Oracle的这份文档,以获取有关 Java 加密的更多信息。

更具体地说,您用于请求密码的字符串的格式为

<algorithm>/<mode of operation>/<padding>

更糟糕的是,尽管 Java 提供了许多算法、操作模式和填充,但并非所有这些都可以一起工作。您需要阅读文档以找到可行的配置字符串。

于 2011-02-07T20:42:03.397 回答
0

也许您应该对数据进行校验和,并确保它正是您想要传递给加密/解密 API 的内容。

于 2011-02-07T20:37:50.897 回答