gpt4 book ai didi

java - 是什么让AES with Base64对同一个明文产生不同的加密结果?

转载 作者:行者123 更新时间:2023-11-30 08:22:01 25 4
gpt4 key购买 nike

这是一个名为 test() 的示例虚拟代码,我运行了 100K 次,我得到了相同纯文本的不同加密消息(显然,我得到的解密是原始纯文本)。

我猜这背后的原因是为了避免频率;但是为什么一次解密可以有多次加密呢?不应该一对一吗?

public static void test()
{
String plainMessage = "I'm gonna bid 100 USD on this project";
String password = "A99922000001000004581F0F0CCD0000";

Set<String> set = new HashSet<String>();

for (int x=0; x<100000; x++)
{
String enc = AESEncryption.encryptMessage(plainMessage, password);
System.out.println(enc);
set.add(enc);

String dec = AESEncryption.decryptMessage(enc, password);
if (!dec.equals(plainMessage))
{
System.out.println("wrong decryption"); //never gets here
break;
}
}

System.out.println(">"+set.size()); //just to make sure they are all unique
}

加密

    public static String encryptMessage(final String plainMessage, final String symKeyHex) 
{
final byte[] symKeyData = DatatypeConverter.parseHexBinary(symKeyHex);
final byte[] encodedMessage = plainMessage.getBytes(Charset.forName("UTF-8"));

try {

final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
final int blockSize = cipher.getBlockSize();

// create the key
final SecretKeySpec symKey = new SecretKeySpec(symKeyData, "AES");

// generate random IV using block size (possibly create a method for
// this)
final byte[] ivData = new byte[blockSize];
final SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG");
rnd.nextBytes(ivData);
final IvParameterSpec iv = new IvParameterSpec(ivData);

cipher.init(Cipher.ENCRYPT_MODE, symKey, iv);

final byte[] encryptedMessage = cipher.doFinal(encodedMessage);

// concatenate IV and encrypted message
final byte[] ivAndEncryptedMessage = new byte[ivData.length + encryptedMessage.length];
System.arraycopy(ivData, 0, ivAndEncryptedMessage, 0, blockSize);
System.arraycopy(encryptedMessage, 0, ivAndEncryptedMessage, blockSize, encryptedMessage.length);

final String ivAndEncryptedMessageBase64 = DatatypeConverter.printBase64Binary(ivAndEncryptedMessage);
return ivAndEncryptedMessageBase64;


}catch (InvalidKeyException e)
{
throw new IllegalArgumentException("key argument does not contain a valid AES key");

}catch (GeneralSecurityException e)
{
throw new IllegalStateException("Unexpected exception during encryption", e);
}
}

最佳答案

为注释添加一些清晰度:

ivinitialization vector 就像一个第二个 key ,用于加密 数据。

由于您每次都使用随机 iv(这很好),因此您每次都会得到不同的加密文本。这第二个 key 实际上包含在加密文本 中,因此您不需要单独传递它。

只有 iv 并不能使您破解加密(这就是为什么您可以将它与加密文本 一起传递的原因),但通过使用它,您可以多次发送具有相同密码的相同纯文本(使用不同的ivs)并得到完全不同的结果加密值

关于java - 是什么让AES with Base64对同一个明文产生不同的加密结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24701068/

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