java - Java : Cross Platform Issues? 中的 RSA 加密

标签 java android cross-platform encryption-asymmetric public-key-encryption

情况

我正在使用 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/

相关文章:

javascript - 跨设备 CSS 问题

跨平台系统截图

delphi - 有人用CrossKylix进行真正的跨平台开发吗?

java - 以动态方式计算双变量的平均值

java - 运行 Eclipse 时 : java was started by returned exit code=13

java - web.xml 在启动时将类加载到上下文中

java - 多语言字符串的 SHA1 总和

java - Android:如何根据当前位置(地理位置/地理代码)获取时间或时区

java - 添加基于 spring 配置文件的新属性

java - 保存列表的大小而不更新它