2017-11-24 23 views
0

파이썬에서 AES를 사용하여 일부 데이터를 암호화하려고합니다. 동일한 데이터의 두 가지 암호화가 동일한 출력을 제공합니다 (양쪽 암호화에서 동일한 키 사용). 나는 정적 인 IV를 사용하려고 노력했지만, 여전히 하나의 입력으로 두 개의 다른 출력을 얻는다. 여기소금없이 Python에서 AES로 암호화하는 방법은 무엇입니까?

내가 무슨 짓을 :

from Crypto.Cipher import AES 

iv = 16 * '\x00' 
cipher = AES.new(key, AES.MODE_CBC, iv) 

나는 동일한 데이터를 여러 번 암호화하기로 결정한 경우 내가 같은 암호를 얻을 싶습니다. 소금 사용을 방지하는 방법을 알고 있습니까? 감사합니다.

+0

모드를 변경해야하지만 이는 좋지 않은 생각입니다. –

+0

@ t.m.adam 아니오, 모든 0x00 바이트의 ANIV로 모드가 정상입니다. 동일한 IV가 동일한 데이터와 키에 사용되면 실제로 IV가 정상입니다. – zaph

+0

@zaph 알아요.하지만 그들은 출력이 어떻게 든 달라 지다고 주장합니다. 어쨋든 내 의견은 질문의 제목에 관한 것입니다. (소금에 의해 그들이 iv를 의미한다고 가정) –

답변

2

여기서 cipher 개체는 상태이며 제공된 키 데이터와 초기화 벡터를 사용하여 초기화됩니다. 이 초기화 된 키스톤을 사용하기 시작하면 CBC 모드를 사용할 때 암호화 한 각 블록에 대해 수정됩니다. 그것이 작동중인 암호 블록 체인입니다. 별도의 두 가지 암호화를 사용하려면 두 개의 별도 키 시스템을 사용해야합니다. 또는 언급 한 바와 같이 블록을 암호화 할 때 키 시스템에 영향을주지 않는 모드 (ECB)를 사용할 수 있습니다.

데모 (python3) :

from Crypto.Cipher import AES 
key = 16 * b'\0' 
iv = 16 * b'\0' 
plaintext = 16 * b'\x41' 
a = AES.new(key, AES.MODE_CBC, iv) 
b = AES.new(key, AES.MODE_CBC, iv) 
ar = a.encrypt(plaintext) 
br = b.encrypt(plaintext) 
>>> ar 
b'\xb4\x9c\xbf\x19\xd3W\xe6\xe1\xf6\x84\\0\xfd[c\xe3' 
>>> br 
b'\xb4\x9c\xbf\x19\xd3W\xe6\xe1\xf6\x84\\0\xfd[c\xe3' 

ECB 모드의 단점은 매번 우리는이 키를 사용하여이 일반 텍스트를 암호화하고 IV 우리는이 결과를 얻을 것이다. CBC 모드를 사용하면 다른 블록을 암호화 할 때마다 키 구조가 변경되고 이전에 암호화 된 내용에 따라 다른 출력이 생성됩니다.

ECB 모드

>>> ecb = AES.new(16 * b'\0', AES.MODE_ECB) 
>>> ecb.encrypt(16 * b'\x41') 
b'\xb4\x9c\xbf\x19\xd3W\xe6\xe1\xf6\x84\\0\xfd[c\xe3' 
>>> ecb.encrypt(16 * b'\x41') 
b'\xb4\x9c\xbf\x19\xd3W\xe6\xe1\xf6\x84\\0\xfd[c\xe3' 

각 암호화는 동일한 결과를 생성한다. 아니요.

CBC 모드

>>> cbc = AES.new(16 * b'\0', AES.MODE_CBC, 16 * b'\0') 
>>> cbc.encrypt(16 * b'\x41') 
b'\xb4\x9c\xbf\x19\xd3W\xe6\xe1\xf6\x84\\0\xfd[c\xe3' 
>>> cbc.encrypt(16 * b'\x41') 
b'o\x9fv\x9a\x9c\xaa\x03\x13\xba\x17\x8c\x1c.\x0f`v' 
>>> cbc.encrypt(16 * b'\x41') 
b'\n1\x165\xb5?\x04h\xa8\r>k\xdbK\xbc4' 

첫번째 블록 ECB 모드와 동일한 암호화하지만 후속 블록이 상이하다.

블록 암호 용 modes of operation에 대한 자세한 내용은 온라인에서 확인할 수 있습니다.