我有以下测试应用程序:
import Codec.Crypto.AES
import qualified Data.ByteString.Char8 as B
key = B.pack "Thisismykey....."
iv = B.pack "0000000000000001"
main = do
let myenc = crypt' CTR key iv Encrypt (B.pack "1234567812345678")
print (B.unpack myenc)
打印以下结果:“\250\DC4\DC4\255\223\221C\ETBx\239sF\nuZu”
如果我将明文“1234567812345678”更改为“1234567812345688”,我会得到“\250\DC4\DC4\255\223\221C\ETBx\239sF\nuUu”
如果我将明文更改为“1134567812345678”,我会得到输出“\250\ETB\DC4\255\223\221C\ETBx\239sF\nuZu”
我现在非常惊讶,因为输入和输出之间显然存在可预测的相关性,恕我直言不应该发生。如果我在明文前面更改了某些内容,那么只有输出的前面会受到影响等等。这是否与字节字符串的 8 或 16 字节边界有关,我该如何解决这个问题?有什么东西在误导我吗?
与 CTR 模式无关,应该注意 AES 与 4x4 字节数组一起工作,问题是关于单个数组的加密。据我了解,AES 应该执行四轮混合,单个字节(16 个字节)的变化应该导致至少 50% 的位不同。因此,在我看来,16 字节明文末尾的更改可能不会完全更改密文的末尾,而前面的更改会更改前面等。据我了解,IV 仅作为计数器起作用当涉及多个 4x4 阵列时。