cipher
オブジェクトは状態であり、提供されたキーデータと初期化ベクトルを使用して初期化されます。この初期化されたキーステートを使用し始めると、CBCモードを使用するときに暗号化するブロックごとに変更されます。それが実際の暗号ブロック連鎖です。 2つの別々の暗号化を使用するには、2つの別々のキーストアを使用する必要があります。または、前述したように、ブロックを暗号化するときにキーステートに影響を与えないモード(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でもOKです。 – zaph
@zaph私は知っていますが、彼らは何とか出力が異なっていると主張しています。とにかく私のコメントは質問のタイトルに関するものです。 (塩によって、それらがivを意味すると仮定して) –