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

10

情况说明

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

更多信息:

  • 我的加密/解密库基于这里找到的指南。
  • 我的加密密钥长度为2048位,但我看到不同的密钥大小表现类似。
  • 我将我的RSA加密/解密代码打包到了一个jar文件中。它是通过服务器的Eclipse编译的。
  • 在Android手机上使用加密库的程序使用上述库。它也是使用Eclipse构建的。
  • 服务器程序是使用Netbeans构建的(当时更容易这样做)。

其他问题

  • Java中是否有其他免费的公钥加密算法/库?它们是否可跨平台工作?人们对它们期望什么性能?等等。我已经调查过了,没有发现太多;也许我用的关键字不对。

哇!我想那就是全部内容了。提前感谢您的帮助!


任何算法都必须跨平台工作,问题很可能在您的代码(或配置)中。 - bestsss
配置,嗯?RSA有哪些可配置的内容?我该如何在Java中实现这个功能?您能提供一个教程链接吗?我不想浪费您的时间,但像您这样的专家(或有经验的人)指点我方向将会让我的生活更轻松。 - Dylan Knowles
(抱歉刚才跑去吃晚饭了)我是指配置公钥/私钥,错误填充大多是由于密钥对交换不当造成的。如果您确定并且由于某种原因 Android 不支持与 Sun 实现相同的填充方式,则可以尝试 http://www.bouncycastle.org/ 顺便问一下,在同一台设备/机器上如何加密/解密数据? - bestsss
如何在同一设备/机器上加/解密数据?这是什么意思?此外,我曾经研究过Bouncycastle,但由于当时对密码学不熟悉,所以放弃了它。现在再看,我发现它有一个公钥加密算法(PKCS12)。也许我应该重新评估其潜在用途。我想先花点时间修复我的库,但无论如何,我会进行调查的。谢谢! - Dylan Knowles
@kanov-baekonfat,你如何在同一设备/机器上加密/解密数据?我的意思是:你是否将公钥/私钥对保存在同一台机器上? - bestsss
仅适用于我在调查此问题时进行的测试。 - Dylan Knowles
2个回答

11
RSA加密(或任何加密算法)应该在任何环境下都能够运行。然而,可能某些系统对于默认填充和操作模式有不同的假设。确保在进行加密和解密时,不仅要完全指定算法,还要指定操作模式(如CBC等)和填充方式。如果这样做没有效果,建议您将设备和服务器的代码都发布出来,以便我们更仔细地检查。
编辑:为了回答你的问题,在Java中,当你从加密包中获取一个密码时,通常会使用以下代码:
Cipher cipher;
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

getInstance方法所提供的字符串指示运行时获取一个密码实例,该实例将使用AES算法、密码块链接模式和PKCS5填充。有许多支持的算法和填充方式。我建议查看这篇来自Oracle的文档以获得有关Java加密的更多信息。

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

<algorithm>/<mode of operation>/<padding>
尽管Java提供了许多算法、操作模式和Padding,但有些并不兼容。你需要阅读文档以找到一个可行的配置字符串。

如何指定操作模式和填充方式?当使用RSA时,我并不知道所有可以切换的选项。有什么好的链接或一些一般性建议吗? - Dylan Knowles
您提供的链接和建议看起来极为有前途。目前我还无法尝试,但是从周三开始我可能会有机会;当我有了尝试结果,我会尽快回复您。只是为了确保我理解您的意思,每次我创建密码时,都需要指定算法、模式和填充方式,这样可能可以消除任何基于平台的假设,是吗? - Dylan Knowles
这个很好用;之前可能有一些假设是我无法控制的。感谢你的帮助! - Dylan Knowles

0
也许你应该对数据进行校验,确保它恰好是你想要传递到加密/解密API的内容。

啊,我已经在执行校验和了。就像我说的那样,数据似乎已经完好无损地到达了(并且可以在创建它的系统上解密),但是在手机上加密的数据无法在设备上解密。不过,还是谢谢你的建议! - Dylan Knowles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接