2009-08-16 5 views
3

저는 pyDes를 사용하여 일부 데이터를 암호화하고 있습니다. 키 또는 초기 값에서 한 비트라도 변경해도 암호화 된 데이터가 완전히 다른 것을 보여주고 싶었습니다. +/- 1로 마지막 문자를 변경하기 위해 16 바이트 키를 설정하여 적어도 하나의 비트를 다르게합니다. 그러나 이렇게해도 암호화 된 데이터의 3 가지 인스턴스가 모두 다르지는 않습니다. 단언의트리플 DES 키 또는 초기 값에서 한 비트를 변경하면 다른 암호화 된 데이터가 제공되지 않는 이유는 무엇입니까?

from pyDes import * 

data = 'Hello' 

# CBC : Cipher-Block-Chaining 
# \0..\1: arbitrary initial value for CBC 
# pad=None: let pyDes take care of padding bytes 
k1 = triple_des("16-byte-key-here", CBC, "\0\0\0\0\0\0\0\1", pad=None, padmode=PAD_PKCS5) 
k2 = triple_des("16-byte-key-herf", CBC, "\0\0\0\0\0\0\0\1", pad=None, padmode=PAD_PKCS5) 
k3 = triple_des("16-byte-key-herd", CBC, "\0\0\0\0\0\0\0\1", pad=None, padmode=PAD_PKCS5) 

d1 = k1.encrypt(data) 
d2 = k2.encrypt(data) 
d3 = k3.encrypt(data) 

assert d1 != d2 
assert d2 != d3 
assert d1 != d3 

하나는 내가 단지 키 또는 초기 값 중 하나에 작은 변화를 만들 경우 실패 할 것 같다; 내가 무엇을 바꾸 느냐에 따라 d1 != d2d1 != d3이 실패하는 것을 보았습니다. 또한 'Hello''Hello' * 50으로 변경하여 입력 데이터가 너무 짧지 않은지 확인했습니다.

전적으로 무작위 키를 만들면 어설 션이 성공합니다. 위의 프로그램에서 d1 != d3은 실패합니다 (해당 키는 1 비트 씩 떨어져 있고 k1-k2는 2 비트가 다릅니다).

필자는 결코 암호화 전문가는 아니지만 한 비트 씩 떨어져있는 두 개의 키가 동일한 암호화 된 데이터를 생성하는 경우 이는 키를 무차별 공격하기 위해 필요한 노력이 2 배만큼 떨어 졌음을 의미합니다. 권리?

나는 분명한 뭔가를 놓치고 있습니까? 트리플 DES는 매우 유사한 키에 대해 고유 한 결과를 제공하지 않아야합니까? 아니면 PyDes의 버그입니까? 어쩌면 다른 사람이 다른 구현에서이 동작을 확인할 수 있습니까?


@Chris Jester-Young은 키의 일부 비트가 패리티 비트라고 대답했습니다. 그리고 this article에 따라 밝혀 : DES에 대한 입력 키는 64 비트 길이이지만, DES에 의해 사용되는 실제 키 길이가 단지 56 비트임을

참고. 각 바이트의 최하위 비트 (가장 오른쪽)는 패리티 비트이므로 모든 바이트에 항상 1이 홀수가되도록 설정해야합니다. 이러한 패리티 비트는 무시되므로 각 바이트의 최상위 비트 7 개만 사용되므로 키 길이는 56 비트가됩니다. 이것은 세 개의 키 각각에 암호화 프로세스 중에 사용되지 않는 8 개의 패리티 비트가 포함되어 있기 때문에 Triple DES의 실제 키 강도가 실제로 168 비트임을 의미합니다.

(강조 내였다)

그리고 그 패리티 비트 I가 변경 예에서 정확히 비트이었다.

크리스!

답변

4

DES에서 키의 일부 비트는 패리티 비트이며 실제로 암호화/암호 해독에 영향을주지 않습니다.