我正在尝试使用Java类Cipher来加密/解密我的一些数据。但我很困惑为什么在加密和解密模式下产生相同的结果。以下是我的代码:
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = generator.genKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
byte[] data = "12345".getBytes();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] encrypted = cipher.doFinal(data);
Cipher cipher2 = Cipher.getInstance("RSA");
cipher2.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decrypted = cipher2.doFinal(data);
这里加密的内容与解密完全相同。它真的让我感到困惑,无论我使用什么模式,为什么会产生相同的结果。
我试过了什么?
如果我使用Cipher.getInstance(“DES”)来解密“12345”.getBytes(),则会抛出异常。
这是否意味着类Cipher可以在使用RSA时自动检测是否应该使用加密或解密(忽略我在初始化Cipher类时指定的模式参数)?
非常感谢您的帮助。
===更新===我的不好,看起来Java与Android有不同的行为。我应该将我的问题仅限于Android平台。如果我将上述代码作为普通Java应用程序运行,则javax.crypto.BadPaddingException:解密“123456”时将抛出解密错误。
===更新===
首先,RSA是非对称的,因此您使用公钥进行加密和私钥解密。
其次,那些产生不同的输出。
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = generator.genKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
byte[] data = "12345".getBytes();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] encrypted = cipher.doFinal(data);
System.out.println(new String(encrypted));
Cipher cipher2 = Cipher.getInstance("RSA");
cipher2.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decrypted = cipher2.doFinal(encrypted);
System.out.println(new String(decrypted));
与输出
D =1 12345
第三,没有自动检测,但密码可以检测到解密材料已损坏或无效 - 在您的情况下导致错误的错误填充。