haskell - 加密和 ByteString 边界

标签 haskell encryption aes

我有以下测试应用程序:

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

最佳答案

与haskell无关。

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

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

CTR模式的要求是(key,IV)对必须是唯一的。 最简单的解决方案是为您加密的每条新消息生成一个新的 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 .. 因此,如果随机数和 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]

关于haskell - 加密和 ByteString 边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12352282/

相关文章:

haskell - 如何从记录haskell中提取多个值

web-services - 为什么要使用 x.509 证书来加密 xml?为什么不直接通过 https 传输?

php - Laravel AES-256加密和MySQL

haskell - 每次都初始化计数器?

haskell - 我可以制作带有 Monad 约束的 Lens 吗?

Haskell: 'do' 构造中的最后一个语句必须是表达式

java - Java中使用tink时解密错误

php - PHP 加密,IOS 解密

swift - CryptoSwift 由于 Base64 编码的 aesKey 和 aesIV 而抛出 invalidKeySize

swift - 如何使用 cryptojs 加密 AES 256 并快速解密