26

我正在使用 RSA 在 Android 上加密用户名和密码并在服务器(tomcat 6、java 1.6)上解密它们。安卓加密:

    PublicKey pubKey = readPublicKeyFromFile(mod, ex);
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    byte[] cipherData = cipher.doFinal(data);
    return cipherData;

Java Tomcat解密:

    PrivateKey pubKey = readPrivateKeyFromFile(mod, ex);
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, pubKey);
    byte[] cipherData = cipher.doFinal(data);
    return cipherData;

如果我使用 OUTSIDE android 的 android 部分(只是在一个主要方法中)它工作正常。但不在我的安卓(模拟器)里面。在服务器端,我收到以下错误:

javax.crypto.BadPaddingException: Blocktype mismatch: 0
    at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:311)
    at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:255)
    at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)

我将 mod 和 ex 保留为 BigIntegers 常量,因此我不会将它们写入文件。我知道java1.6和java 1.5加密是有区别的,所以都是用java 1.6编译的。

一些调试信息:

在 android 中调试期间,我可以看到 pubKey 包含十六进制的模数和指数。如果我在 main 方法中调试(同样的代码),我可以看到 pubKey 包含十进制的模数和指数。

我究竟做错了什么?

谢谢

4

3 回答 3

43

我在 Android 2.2+ 中进行 RSA 加密并在 tomcat 6 java 1.6 服务器上解密。

我遇到了这个确切的问题,到处阅读,部分归功于@Femi 的回答,我遇到了我需要的东西。

解决方案是对密码使用以下算法规范:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

这适用于从 Android 和 BlackBerry 智能手机进行加密。我知道这个问题被问到已经四个月了,但以防万一其他人遇到这个问题。

于 2011-10-13T21:00:10.893 回答
12

我建议您使用特定的密码初始化:例如,

Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");

将适用于两者。您得到的异常(BadPaddingException)正在发生,因为桌面 JVM 和 Android JVM 之间的默认密码初始化填充似乎不同。

于 2011-05-23T08:32:44.060 回答
1

首先,看起来您正在使用公钥初始化两个密码。加密使用公钥,解密使用私钥。我希望这只是一个错字。

我在 RSA 加密方面也遇到了很多麻烦,很多都是反复试验。我建议您尝试其他提供商。我设法使用 BouncyCastle 实现了 RSA。

Cipher wrapper = Cipher.getInstance("RSA", "BC");
wrapper.init(Cipher.ENCRYPT_MODE, publicKey);
encryptedData= wrapper.doFinal(unencryptedData);

虽然,我生成了自己的密钥对,因为这是一个会话加密。

kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(1024);
        KeyPair kp = kpg.genKeyPair();
        publicKey = kp.getPublic();
        privateKey = kp.getPrivate();
于 2011-05-23T08:15:52.383 回答