gpt4 book ai didi

Java AES CBC 与内联安全随机 IV - 生成相同的密文?

转载 作者:行者123 更新时间:2023-12-01 16:51:04 25 4
gpt4 key购买 nike

我正在尝试内联我的 IV,这样我就可以在不知道初始 IV(只知道 key )的情况下解密我的消息。

我生成我的 key 。我使用 SecureRandom 生成 IV我随机化 IV 字节数组。(我用 iv+message 创建一条消息)最后,我使用唯一的 IV 加密消息。

正如预期的那样,如果我删除接收端的 IV,我就可以解密消息。但是,生成的密文始终是相同的。

我不知道为什么会这样,并且尚未在网上找到解决方案。

下面是我的代码和输出。

谁能帮我理解这是为什么?

enter code 
String mssg = "Hello hellow hello";
byte[] key = "kljhn1234512345abcde123451234512".getBytes();
SecretKeySpec spec = new SecretKeySpec(key, "AES");

SecureRandom rand = new SecureRandom();
for (int i = 0; i < 5; i++) {

//
//initialzize empty byte array for random IV

byte[] iv = new byte[16];
System.out.println("IV pre rand: " + Arrays.toString(iv));
rand.nextBytes(iv); //RANDOMIZE
System.out.println("IV POST rand: " + Arrays.toString(iv));

//CONCATENTATE IV TO FRONT OF MESSAGE TO ENCRYPT
//CONCATENATE MESSAGE TO END OF IV

ByteArrayOutputStream bout = new ByteArrayOutputStream();
try {
bout.write(iv);
bout.write(mssg.getBytes());
} catch (IOException e) {
e.printStackTrace();
}

byte[] message = bout.toByteArray();

try {

//ENCRYPT USING RANDIMIZED IV.. THIS SHOULD RESULT IN NON EQUAL CIPHER TEXT FOR SAME MESSAGE.
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, spec, new IvParameterSpec(iv));
byte[] ct = cipher.doFinal(message);
System.out.println("CIPHER TEXT: " + Arrays.toString(ct));

//DECRYPT. AND USING A WRONG IV.
cipher.init(Cipher.DECRYPT_MODE, spec, new IvParameterSpec(new byte[16]));
System.out.println("DECRYPTED: " + new String(cipher.doFinal(ct)));

} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}


}

这里

输出:

迭代 1IV 预随机数:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

IV 后兰特:[13, 68, 83, 113, 86, 48, 50, -71, -75, -25, 56, 100, -25, 34, -27, -23]

密文:[-102, -52, -21, -92, -85, 119, -10, -18, -52, 0, -39, -19, 11, -83, 70, 44, 101、-92、-93、-60、4、73、-17、73、-58、119、81、66、-114、54、-107、-83、11、42、-92、121、- 15、-61、92、83、24、10、89、-21、110、100、116、119]

解密:������������������������������你好你好

迭代 2:IV 预随机数:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

IV 后兰特:[90, 115, 91, 124, 27, -80, -32, -46, -66, -50, -85, 43, 34, -18, -74, -3]

密文:[-102, -52, -21, -92, -85, 119, -10, -18, -52, 0, -39, -19, 11, -83, 70, 44, 101、-92、-93、-60、4、73、-17、73、-58、119、81、66、-114、54、-107、-83、11、42、-92、121、- 15、-61、92、83、24、10、89、-21、110、100、116、119]

解密:������������������������������你好你好

迭代 3

IV 前置:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

IV 后兰特:[113, 112, 9, 47, -125, -4, 80, 10, -97, 44, 42, 90, -58, -44, -46, 17]

密文:[-102, -52, -21, -92, -85, 119, -10, -18, -52, 0, -39, -19, 11, -83, 70, 44, 101、-92、-93、-60、4、73、-17、73、-58、119、81、66、-114、54、-107、-83、11、42、-92、121、- 15、-61、92、83、24、10、89、-21、110、100、116、119]

解密:������������������������������你好你好

最佳答案

如果你看the nice picture in Wikipedia of how CBC works您将看到,通过将 IV 放在 CBC 明文的开头,您实际上取消了 IV 并破坏了它旨在提供的语义安全性。具体来说,使用 CBC 加密可以:

  • 将 IV 与第一个明文 block 进行异或,并将其加密为第一个密文 block 。由于您将第一个明文 block 制作为 IV 的副本,因此始终会加密零 block 并每次产生相同的结果。

  • 将第一个密文 block 与第二个明文 block (这里是搞砸之前的实际明文)进行异或,并将其加密为第二个密文 block 。由于您将第一个密文 block 设置为固定值,并且在测试中实际的明文是相同的,因此每次都会产生相同的结果。

  • 等等等等

做你应该做的事:

  • 使用( secret ) key 和(随机)IV 加密实际明文,然后将 IV 与密文组合起来传输;连接是一种简单的方法,但不是唯一的方法

  • 接收时将 IV 与密文分开或分离,并使用( secret ) key 和(随机但可见)IV 解密密文

关于Java AES CBC 与内联安全随机 IV - 生成相同的密文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40050594/

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