相关疑难解决方法(0)

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

情况

我正在使用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的免费公钥加密算法/库?他们跨平台工作吗?人们对他们的期望是什么?等等我调查了这个并没有找到太多; 也许我正在寻找错误的关键词.

唷!我想就是这样.感谢您的帮助!

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

10
推荐指数
1
解决办法
5735
查看次数

指定Cipher.getInstance()参数?

我在Android应用程序和独立的Java应用程序中使用以下内容:

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(clear);
    ...
Run Code Online (Sandbox Code Playgroud)

我在android和我的独立java应用程序上获得了不同的加密字符串(两者都使用相同的代码和密钥).我得到了同样的异常(javax.crypto.BadPaddingException:Blocktype mismatch:0),如下所示:

RSA加密:Java和Android之间的区别

建议的解决方案是指定填充策略,如:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
Run Code Online (Sandbox Code Playgroud)

但我使用的是"AES",而不是"RSA",并且不确定如何结合AES指定填充.在这种情况下,我如何构造传递给Cipher.getInstance()的字符串?我试了一下:

Cipher cipher = Cipher.getInstance("AES/PKCS1Padding");
Run Code Online (Sandbox Code Playgroud)

但得到一个关于无效的例外.

谢谢

java encryption android

9
推荐指数
2
解决办法
4万
查看次数