2012-09-10 2 views
2

나는이 다음 테스트 응용 프로그램 : 다음과 같은 결과를 출력암호화 및 ByteString 경계

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"는 는 I "는 \ 250 \ DC4 \ DC4 \ 255 223 \ 221C \ ETBx \ 239sF \ nuUu \"

I는 평문을 변경하는 경우에 "1134567812345678"GET 출력이 "\ 250 \ ETB \ DC4 \ 255 \ 223 \ 221C"입니다. \ ETBx \ 239sF \ nuZu "

IMHO가 발생해서는 안되는 입력 및 출력간에 예측 가능한 상관 관계가 명확하게 나타나 매우 놀랍습니다. 만약 내가 깨끗한 텍스트의 앞면에서 뭔가를 변경하면 출력의 맨 앞으로 만 영향을받습니다. 어떻게 든 8 바이트 또는 16 바이트의 바이트 문자열로 할 수 있습니까? 어떻게 해결할 수 있습니까? 뭔가 내가 여기 오해 한 것이 있니?

CTR 모드와 별개로 AES는 4x4 바이트 배열로 작동하며 질문은 단일 배열 암호화에 관한 것입니다. AES는 4 회의 믹싱을 수행해야하며 1 바이트 (16 개 중 하나)의 변경으로 비트의 50 % 이상이 달라야합니다. 따라서 필자는 16 바이트 평문 끝 부분의 변경 사항이 암호문의 끝을 정확히 바꿔 앞에서 바꾼 앞면 등을 바꿀 수는 없다는 것을 이해할 수 있습니다. 제 이해를 위해서 IV는 카운터 여러 개의 4x4 어레이가 관련 될 때.

답변

7

haskell과 아무런 관련이 없습니다.

읽기 http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Initialization_vector_.28IV.29 두 번이 안전하지 CTR 모드에서 메시지를 암호화하기 위해 동일한 IV를 사용하고 있기 때문에

. 암호화 알고리즘에 대해 읽고 보안 허점이있을 가능성이 높으므로 자신의 암호화 코드를 쓰는 것을 피하십시오.

CTR 모드의 요구 사항은 (키, IV) 쌍이 고유해야합니다. 간단한 솔루션은 암호화 한 모든 새 메시지에 대해 새로운 IV를 생성합니다.

CTR 모드 F (IV + 카운터 키) XOR 평문 = CIPHER에서 https://crypto.stackexchange.com/questions/2991/why-must-iv-key-pairs-not-be-reused-in-ctr-mode

[CTR 모드 보안 결함의 설명] .. 그래서 넌스 키가 동일하게 유지이라면 F는 보통 모두 동일 텍스트 .. 그래서 $ C_1 $는 $ P_1 $의 암호이며, $ C_2 $는

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

다음 지원 코드 $ P_2 $의 암호 인 경우 :

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를 재사용하면 통신이 도청당하는 경우 안전하지 않게됩니다. 생각할 수없는 예측 불가능한 원칙에 영향을 미치지 않습니다. 나는 여기에 IV로'B.empty'를 사용할 수 있었고 IMHP는 나의 예가 여전히 유효 할 수있었습니다. –

+4

@JFritsch 제공 한 스택 교환 링크를 참조하십시오. 고유 키, IV 쌍에 대한 암호 텍스트를 예측할 수 없습니다. 문제는 1 개의 암호문과 일반 텍스트로 주어지며 같은 (키, 4) 쌍을 사용할 때 두 번째 일반 텍스트의 다른 암호문을 예측할 수 있습니다. – Satvik

+0

해당 사항 없음. AES는 4x4 매트릭스를 사용합니다. 따라서 16 바이트 배열/문자열/일반 텍스트 **에서 변경되는 모든 사항은 최소한 비트의 50 %가 변경되는 출력으로 이어져야합니다. 그렇지 않으면 구현에 결함이 있습니다. IV를 무시합니다. –