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));
我在使用 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));