2017-11-24 8 views
0

私は、同じデータの2つの暗号化が(両方の暗号化で同じ鍵を使用して)同じ出力を与えるように、PythonのAESを使っていくつかのデータを暗号化したいと思います。私は静的なIVを使用しようとしましたが、まだ1つの入力で2つの異なる出力が得られます。ここで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でもOKです。 – zaph

+0

@zaph私は知っていますが、彼らは何とか出力が異なっていると主張しています。とにかく私のコメントは質問のタイトルに関するものです。 (塩によって、それらがivを意味すると仮定して) –

答えて

2

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をオンラインで見つけることができます。

関連する問題