CTR模式使用初始向量(IV)
据我所知,CTR模式不使用初始向量。
它只需要一个计数器,用给定的密钥对其进行加密,然后用明文对结果进行异或,以获得密文。
其他分组密码模式,如CBC,在进行加密之前,它们使用初始向量对明文进行异或。
所以这是我的问题。我在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时它会返回相同的结果?
如果我在使用点击率时总是使用上面的IV(全零),那会安全吗?
任何想法都会非常有用。
谢谢
没有找到相关结果
已邀请:
3 个回复
邵酮
值。如果你不提供一个显然为你产生合理的IV,这就是为什么你用相同的输入得到不同的输出。最重要的是,这很好,而且你想要的正是 - 提供所有零是坏的,而不是你想要的。
冕偷淮款
”)选择IV。该空间足够大,以至于您可以忽略在某个时刻重复使用计数器值的风险。 要完成,如果您确保只使用一次给定的密钥,则可以容忍固定的IV。使用相同的密钥重用相同的计数器值时会出现安全问题。但是,为每条消息设置一个新密钥至少与为每条消息设置一个新的密钥一样困难。
屉杆绊