2

我有以下测试应用程序:

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 阵列时。

4

1 回答 1

7

它与haskell无关。

阅读http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Initialization_vector_.28IV.29

由于您在 CTR 模式下使用相同的 IV 对消息进行两次加密,因此不安全。阅读加密算法并尽量避免编写自己的加密代码,因为它更有可能存在安全漏洞。

CTR 模式的要求是 (key,IV) pair 应该是唯一的。简单的解决方案是为您加密的每条新消息生成一个新的 IV。

【CTR模式安全漏洞说明】 https://crypto.stackexchange.com/questions/2991/why-must-iv-key-pairs-not-be-reused-in-ctr-mode

在 CTR 模式下 F(IV+counter,key) XOR Plaintext = CIPHER .. 所以如果 nonce 和 key 保持相同,那么 F 对于纯文本都是相同的 .. 所以如果 $C_1$ 是 $P_1$ 和 $C_2$ 的密码那么是 $P_2$ 的密码

xor($C_1$,$C_2$) = xor($P_1$,$P_2$) for same (key,IV) pair

支持代码:

import Codec.Crypto.AES
import qualified Data.ByteString.Char8 as B
import qualified Data.ByteString as BS
import Data.Bits (xor) 

key = B.pack "Thisismykey....."

iv = B.pack "1234567891012131"
p1 =  (B.pack "1234567812345678") 
p2 =  (B.pack "1234567812345688") 
x = crypt' CTR key iv Encrypt p1 
y = crypt' CTR key iv Encrypt p2 

main = do 
     print $ BS.zipWith xor x y  
     print $ BS.zipWith xor p1 p2

输出

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0]
于 2012-09-10T13:10:10.000 回答