我是Android安全概念的新手。
我一直在阅读一些博客,以了解我们可以使用公钥加密数据并可以使用各自的私钥解密数据。加密似乎没有任何问题,但是当我尝试对其进行解密时,它会抛出:
javax.crypto.BadPaddingException:错误:0407106B:rsa例程:RSA_padding_check_PKCS1_type_2:块类型不是02。
我的代码如下:
public String RSAEncrypt(final String plain, PublicKey publicKey ) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte [] encryptedBytes = cipher.doFinal(plain.getBytes()); String encrypted = bytesToString(encryptedBytes); System.out.println("EEncrypted?????" + encrypted ); return encrypted; } public String RSADecrypt(String encryptedBytes,PrivateKey privateKey ) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException { Cipher cipher1 = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher1.init(Cipher.DECRYPT_MODE, privateKey); byte [] decryptedBytes = cipher1.doFinal(stringToBytes(encryptedBytes)); String decrypted = new String(decryptedBytes); System.out.println("DDecrypted?????" + decrypted); return decrypted; } public String bytesToString(byte[] b) { byte[] b2 = new byte[b.length + 1]; b2[0] = 1; System.arraycopy(b, 0, b2, 1, b.length); return new BigInteger(b2).toString(36); } public byte[] stringToBytes(String s) { byte[] b2 = new BigInteger(s, 36).toByteArray(); return Arrays.copyOfRange(b2, 1, b2.length); }
堆栈跟踪如下:
07-28 11:27:35.119: I/System.out(22933): KEYSTORE : String to encrypt = > Hello 07-28 11:27:35.119: I/System.out(22933): KEYSTORE : [B@41bbf4d0 07-28 11:27:38.422: I/System.out(22933): KEYSTORE : String to Decrypt = > UJGAchuDhu3mqH5YPjmYqKBapJYMjJRk9g6HIy8bANooWorzwqgiEo+dOse6Nfq7i0yzw/Wt7TSdTNiYROxehkZvEx/mW5+Niw1CgZ2y9b/ijTeNTF+7aGPrqfDXJ38hUFdTPc6oNl2FVOIafncGOSK9po1JOAYeK0JiA2KrACfPLPjsLQSRzseThyYGxttRM7qbx/N0VTmlTeuNpLFld8Gtw3fHR8UoLGkH/OTFYPLZBVNE8t/oCCy8FpcCu9SGXxF8vh1R4rq15bfyyh9sBU9RuVtoLM0wDSbKixHhNOwwx2Z/A+SHDaQD9C+x3p1AnS9FYZm0Y07E+VYQWqzOpw 07-28 11:27:38.562: W/System.err(22933): javax.crypto.BadPaddingException: error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02 07-28 11:27:41.515: D/WifiNative-wlan0(773): doString: SIGNAL_POLL 07-28 11:27:41.515: W/WifiHW(773): QCOM Debug wifi_send_command "IFNAME=wlan0 SIGNAL_POLL" 07-28 11:27:41.525: D/wpa_supplicant(16189): nl80211: survey data missing! 07-2 07-28 11:27:56.612: W/WifiHW(773): QCOM Debug wifi_send_command "IFNAME=wlan0 SIGNAL_POLL" 07-28 11:27:56.612: D/wpa_supplicant(16189): nl80211: survey data missing! 07-28 11:27:56.622: I/wpa_supplicant(16189): environment dirty rate=0 [0][0][0] 07-28 11:27:56.622: D/WifiStateMachine(773): fetchRssiAndLinkSpeedNative RSSI = -62 abnormalRssiCnt = 0 newLinkSpeed = 58 07-28 11:27:56.622: D/WifiStateMachine(773): fetchRssiAndLinkSpeedNative mLinkspeedCount = 2, mLinkspeedSum: 116
我不确定哪里出了问题。
甲 BadPaddingException 当填充(字节填满一个太小加密块)不匹配指定格式(例如PKCS1,OAEP,…)发生。这可能有几个原因:
由于您正在使用RSA进行初始化以getInstance("RSA")进行加密和getInstance("RSA/ECB/PKCS1Padding")解密,因此 ECB / PKCS1Padding 可能不是Android上的默认值(即使应该在Desktop-Java上也是如此)。
getInstance("RSA")
getInstance("RSA/ECB/PKCS1Padding")
因此,请尝试RSAEncrypt():
RSAEncrypt()
cipher.getInstance("RSA/ECB/PKCS1Padding");
如果这不起作用,请确保将cipher.doFinal()加密cipher.doFinal()中获得的字节[]传递给解密中相同的字节。
cipher.doFinal()
(您的代码在我的Desktop Java7 btw上确实有效。)