2012-09-10 64 views
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」

我現在感到很奇怪,因爲顯然有輸入和恕我直言,不應該發生的輸出之間的相關性預測的。如果我在cleartext的前面改變了某些東西,那麼只有輸出的前端會受到影響等等。難道可能會以某種方式與字節字符串的8或16 Byte邊界有關,我該如何解決這個問題?這裏有誤導我的東西嗎?

從CTR模式獨立但應當注意到,AES可與4×4字節數組和問題是關於單個陣列的加密。 AES應該根據我的理解執行四輪混合,並且單個字節(16箇中的一個)的更改應該導致至少50%的比特不同。因此,在我看來,16字節明文末尾的變化正好改變了密文的結尾,前面的變化改變了前面等等。就我的理解而言,IV僅作爲計數器發揮作用涉及多個4x4陣列時。

回答

7

它無關哈斯克爾。

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

由於您使用的是相同的IV下CTR模式下,它是不安全的兩倍消息進行加密。 閱讀密碼算法並儘量避免編寫自己的加密代碼,因爲它更可能存在安全漏洞。

CTR模式的要求是(密鑰,IV)對應該是唯一的。 這個簡單的解決方案將爲您加密的每條新消息生成一個新的IV。

https://crypto.stackexchange.com/questions/2991/why-must-iv-key-pairs-not-be-reused-in-ctr-mode

在CTR模式下F(IV +計數器,密鑰)XOR明文= CIPHER [CTR模式安全漏洞的說明] ..因此,如果隨機數和密鑰保持相同,則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] 
+0

我認爲你是不正確的。在通信被竊聽的情況下,在CTR中重新使用IV會導致不安全。它不影響我認爲的不可預測性原則。我可以在這裏使用'B.empty'作爲IV,IMHP我的例子仍然有效。 –

+4

@JFritsch查看我提供的stackexchange鏈接。您的密文不可預測唯一的密鑰,IV對。這個問題給出了1個密文和它的純文本,當你使用相同的(密鑰,IV)對時,你可以預測第二個純文本的其他密文。 – Satvik

+0

不適用恕我直言。 AES正在使用4x4矩陣。因此,我在16字節數組/字符串/明文**中改變的所有內容都必須導致至少有50%的位被更改的輸出。否則實施是有缺陷的。無視任何IV。 –