gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:50:43 26 4
gpt4 key购买 nike

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

===更新===

最佳答案

首先,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

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

关于java - 为什么Java类Cipher在Android平台上的加密和解密模式下产生相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52199032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com