gpt4 book ai didi

java - Initial Vector的CTR模式使用(四)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:45:51 26 4
gpt4 key购买 nike

据我所知,CTR 模式不使用初始 vector 。它只需要一个计数器,用给定的 key 对其进行加密,然后将结果与明文进行异或以获得密文。

其他分组密码模式(如 CBC)在进行加密之前会使用初始 vector 对明文进行 XOR。

所以这是我的问题。我在 Java 中有以下代码(使用 bouncycaSTLe 库):

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");

cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] result = cipher.doFinal("Some plaintext");

使用相同的键对上述代码的每次不同调用都会产生不同的输出!但是在做的时候:

byte[] IV = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");

cipher.init(Cipher.ENCRYPT_MODE, key, IV);

byte[] result = cipher.doFinal("Some plaintext");

我在上面的代码的每次调用中都得到了相同的结果。但这是为什么呢?我的意思是,CTR 不需要 IV,那么为什么当我不在每次调用中给出 IV 时我得到不同的结果,而当我给出 IV 时它返回相同的结果?如果我在使用 CTR 时总是使用上面的 IV(全零),那会安全吗?

任何想法都会很有帮助。谢谢

最佳答案

CTR 模式的最重要警告是您永远、永远对相同的键重复使用相同的计数器值。如果您这样做,您实际上已经泄露了您的明文。

为此,在 CTR 模式的一些实际实现中,要传递给 block 密码的 block 被分成两部分,标记为 IV 和计数器(而不是将整个事物称为计数器) . IV随机生成,计数器从0开始。

只要您从不重复使用“IV”部分,您就可以将多条消息的“计数器”部分从零开始。

请注意,这只是一个标签约定。从数学上讲,这与将整个事物称为“计数器”并以每条消息的某个整数的随机倍数启动计数器相同。

我不确定 Bouncy CaSTLe 实现的具体工作方式 - 它可能让您使用 IV 值设置整个初始 block 、计数器和所有 block 。如果您不提供一个合理的 IV,它显然会为您生成一个合理的 IV,这就是为什么您使用相同的输入获得不同的输出。最重要的是,这是,而正是您想要的 - 提供全零是,而不是您想要的。

关于java - Initial Vector的CTR模式使用(四),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4951468/

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