10

情况Java中的RSA加密:跨平台问题?

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

更多信息:

  • 我的加密/解密库是基于向导创建here.
  • 我的加密密钥长度为2048位,但我看到不同的密钥大小类似的行为。
  • 我已将RSA加密/解密代码打包到jar文件中。它是通过Eclipse在服务器的机器上编译的。
  • 使用Android手机上的加密库的程序使用上述库。它也是使用Eclipse构建的。
  • 服务器程序是使用Netbeans构建的(因为当时比较容易)。

其他问题

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

唷!我认为就是这样。感谢您的帮助!

+0

任何算法必须跨平台工作,问题出在你的代码(或配置)最有可能 – bestsss 2011-02-07 20:25:31

+0

配置,呃?什么是可配置的RSA?我将如何在Java中执行此操作?你能提供一个指导教程的链接吗?我不想花时间,但是有一位像你这样的专家(或经验丰富的人)可以指引我走向正确的方向,这会让我的生活变得更加轻松。 – 2011-02-07 20:33:32

+0

(sry跑掉了晚餐)我的意思是配置为公钥/私钥,不好的填充主要是由交换密钥错误导致的。如果您确定并由于某种原因,android不支持与sun的impl相同的填充。你可以试试http://www.bouncycastle.org/ btw,你如何在同一台设备/机器上加密/解密数据? – bestsss 2011-02-07 21:26:48

回答

12

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

编辑为了解决你的问题,在Java中,当你从加密封装得到一个密码,你通常用下面的代码这样做:

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

提供给getInstance的字符串指示运行时获取将使用AES算法,密码块链操作模式和PKCS5填充的密码实例。有一些支持的算法和填充。有关Java中加密的更多信息,请参阅this document from Oracle

更具体地讲,该字符串使用请求加密的格式为

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

更糟糕的是,尽管Java的提供了大量的算法,操作模式和补白,不是所有的他们将一起工作。您将需要阅读文档以查找可用的配置字符串。

0

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