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

问题描述 投票:0回答:1

我正在尝试使用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”时将抛出解密错误。

===更新===

java android encryption rsa
1个回答
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

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

© www.soinside.com 2019 - 2024. All rights reserved.