我正在使用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?他们跨平台工作吗?他们期待什么表现?等等,我已经研究了,没有发现太多;也许我正在查找错误的关键字.
唷!我想是这样.感谢您的帮助提前!
解决方法
编辑为了解决您的问题,在Java中,当您从加密包中获取密码时,您通常使用以下代码:
Cipher cipher; cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
提供给getInstance的字符串指示运行时获取将使用AES算法,密码块链接操作模式和PKCS5填充的密码实例.有一些支持的算法和填充.我将在this document from Oracle中查看有关Java中加密的更多信息.
更具体地说,用于请求密码的字符串是格式
<algorithm>/<mode of operation>/<padding>
更糟糕的是,尽管Java提供了许多算法,操作模式和填充,但并不是所有的算法都可以一起工作.您将需要阅读文档以找到可以正常工作的配置字符串.