2017-04-26 11 views
0

同じ平文を暗号化するために同じキーおよびIVを使用して、異なる結果を得る私のコードです:AESは、ここでは繰り返し

from Crypto.Cipher import AES 
import binascii 

def encrypt(secret_key, sign, raw): 
    key = md5(secret_key).hexdigest()[::-2] 
    iv = md5(sign).hexdigest()[::-2] 
    raw += (16 - len(raw) % 16) * '\0' 
    generator = AES.new(key, AES.MODE_CBC, IV=iv) 

    #*********************************************** 
    #Problems occur at here ! 
    #If I execute "generator.encrypt(raw)" 
    #The results are not same every time 

    print generator.encrypt(raw) # result_1 
    print generator.encrypt(raw) # result_2 
    print generator.encrypt(raw) # result_3 

    #*********************************************** 

    return binascii.b2a_hex(generator.encrypt(raw)) 

たびに、私は「generator.encrypt(生)を実行するとき、私は異なる結果が得られます" 私は同じキーとIVを使用しているので、私は非常に混乱しています。

API-SY​​STEMを確立したいのですが、使用している言語にかかわらず、暗号化データを投稿する必要があります.AESで同じ結果を得たいだけです。

AESで安定した結果を得るにはどうすればよいですか?

同じKEYとIVを使用して同じ平文を暗号化すると、同じ結果が得られます。

+0

どこかでIVが再初期化されています。これはゴランAESの実装で私と一緒に起こった。各ステップの内容を確認するには、ドキュメントを調べる必要があります。 –

+0

AES.new(キー、AES.MODE_CBC、IV = iv)をジェネレータ= AES.new(キー、AES.MODE_CBC、iv)に変更し、 –

答えて

0

pycryptoのAES実装は、CBCモードのステートフルです。この状態は、IV値によってシミュレートすることができます。簡単のため、rawが16バイトより短いと仮定しましょう。その場合

コード

raw += (16 - len(raw) % 16) * '\0' 
generator = AES.new(key, AES.MODE_CBC, IV=iv) 

print generator.encrypt(raw) # result_1 
print generator.encrypt(raw) # result_2 
print generator.encrypt(raw) # result_3 

理由はIVがCBC modeの定義によれば、内部に前進されることである

raw += (16 - len(raw) % 16) * '\0' 
generator = AES.new(key, AES.MODE_CBC, IV=iv) 
ct1 = generator.encrypt(raw) 
print ct1 # result_1 

generator = AES.new(key, AES.MODE_CBC, IV=ct1) 
ct2 = generator.encrypt(raw) 
print ct2 # result_2 

generator = AES.new(key, AES.MODE_CBC, IV=ct2) 
ct3 = generator.encrypt(raw) 
print ct3 # result_3 

と等価です。これは、IVが最後の完全な暗号文ブロックに設定されていることを意味します。

rawは、任意の長さであると想定されている場合は、暗号文の最後のブロックは、次の暗号化のためのIVとして使用する場合、次は同等のようになります。そうしないと

raw += (16 - len(raw) % 16) * '\0' 
generator = AES.new(key, AES.MODE_CBC, IV=iv) 
ct1 = generator.encrypt(raw) 
print ct1 # result_1 

generator = AES.new(key, AES.MODE_CBC, IV=ct1[-16:]) 
ct2 = generator.encrypt(raw) 
print ct2 # result_2 

generator = AES.new(key, AES.MODE_CBC, IV=ct2[-16:]) 
ct3 = generator.encrypt(raw) 
print ct3 # result_3 

その場合は、generatorを元のIVで初期化する必要があります。

+0

を参照してくださいありがとうございます!それは本当に私の問題を解決しました! – Jolly23

関連する問題