据我所知,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 时它返回相同的结果呢?如果我在使用 CTR 时总是使用上述 IV(全零),那会安全吗?
任何想法都会非常有帮助。谢谢