android 棒棒糖上的 RSA 解密

RSA decrypt on android lollipop

我在使用 RSA 解密时遇到错误。 该代码适用于 android 4.4 kit kat,但同一应用程序不适用于 android 5.0 lollipop。

KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modulusBytes), new BigInteger(exponentBytes));
RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(pubKeySpec);

byte[] decrypted = null;
try {
    // get an RSA cipher object and print the provider
    final Cipher cipher = Cipher.getInstance("RSA/None/NoPadding");

    // decrypt the text using the public key
    cipher.init(Cipher.DECRYPT_MODE, publicKey);
    decrypted = cipher.doFinal(area_fissa_byte);

} catch (Exception ex) {
    ex.printStackTrace();
    Log.d("error","error");
}

错误是:java.security.SignatureException:error:04067084:rsa routines:RSA_EAY_PUBLIC_DECRYPT:data 对于模数 来说太大了。

我的 sdk 目标是:

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> 对于 android 4.4

你知道问题出在哪里吗?

编辑: 我注意到我有 2 个不同的 public 键,长度不同!!! Android 5: 我有 382/383 位(太小) Android 4.4:我有 384 位(好)

编辑2: 我发现 android 5.0 与 TLS/SSL 存在差异:https://developer.android.com/about/versions/android-5.0-changes.html 但我不知道如何解决这个问题。

一个错误是您创建 RSAPublicKeySpec 的方式:

new RSAPublicKeySpec(new BigInteger(modulusBytes), new BigInteger(exponentBytes));

如果 modulusBytes 或 exponentBytes 的第一位是 1,则数字将被解释为负值。

当您使用 RSA 数字和 BigInteger 时,始终使用构造函数 BigInteger (int signum, byte[] magnitude)signum=1 来指定数字为正数:

new RSAPublicKeySpec(new BigInteger(1, modulusBytes), new BigInteger(1, exponentBytes));