여기서 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에 대한 자세한 내용은 온라인에서 확인할 수 있습니다.
모드를 변경해야하지만 이는 좋지 않은 생각입니다. –
@ t.m.adam 아니오, 모든 0x00 바이트의 ANIV로 모드가 정상입니다. 동일한 IV가 동일한 데이터와 키에 사용되면 실제로 IV가 정상입니다. – zaph
@zaph 알아요.하지만 그들은 출력이 어떻게 든 달라 지다고 주장합니다. 어쨋든 내 의견은 질문의 제목에 관한 것입니다. (소금에 의해 그들이 iv를 의미한다고 가정) –