为什么Java类Cipher在Android平台上的加密和解密模式下会产生相同的结果?

时间:2018-09-06 07:47:58

标签: java android encryption rsa

我正在尝试使用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:解密错误

===更新===

1 个答案:

答案 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

第三,没有自动检测功能,但是密码可以检测到解密资料已损坏或无效-在您的情况下,错误的填充会导致错误。