我正在尝试使用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(),则会引发异常。
这是否意味着使用RSA时, Cipher 类可以自动检测是否应使用加密或解密(忽略在初始化Cipher类时指定的 mode 参数) ?
非常感谢您的帮助。
===更新=== 糟糕的是,Java与Android的行为有所不同。我应该将问题仅限于Android平台。如果我将上述代码作为普通Java应用程序运行,则解密“ 123456”时将引发 javax.crypto.BadPaddingException:解密错误。
===更新===
答案 0 :(得分:1)
首先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
第三,没有自动检测功能,但是密码可以检测到解密资料已损坏或无效-在您的情况下,错误的填充会导致错误。