2012-02-22 6 views
3

コードサンプル以下同じ結果が暗号化/復号化操作の後、元のテキストを返さない返さないと私はPythonのAESは/復号化が

from Crypto.Cipher import AES 

text = """This is plain text 
to use. 
It should be exqctly 128 characters long to avoid padding and it is split 
with new lines as in 
file""" 

password = "password........" 

block = 32 
mode = AES.MODE_CBC 

enc = AES.new(password, mode) 

encrypted = enc.encrypt(text) 

print "ORIGINAL: " + text 

print "ENCRYPTED: " + str(encrypted) 

print "DECRYPTED: " + str(enc.decrypt(encrypted)) 

一つは、なぜ最初の部分を伝えることができますなぜそれを把握しようとしています暗号化テキストの形式が間違っていますか?

答えて

4

私は、希望の結果を得るために、初期化ベクトル(IV)をリセットする必要があると思います。簡単な方法は、解読のために新しいAESオブジェクトを作成することです:

enc = AES.new(password, mode) 
encrypted = enc.encrypt(text) 
print "ORIGINAL: " + text 
print "ENCRYPTED: " + str(encrypted) 
dec = AES.new(password, mode) 
print "DECRYPTED: " + str(dec.decrypt(encrypted)) 
+0

明示的にIVを設定して取得できませんか?暗号化装置のIVを取得し、復号化装置のIVを設定する方がよい。 –

+0

コンストラクタで設定できます( 'AES.new'の3番目のパラメータ)。私は現在の実装ではデフォルトのIV(ランダムなものではない)を使用していると思うので、それを暗号化装置から復号化装置にコピーすることは厳密には必要ではありません(暗号化の前に*行う必要があります)。セキュリティ上の理由から、暗号化ごとに異なる(ランダムな)IVを使用するのが最善ですが、何とか復号器に渡す必要があるため、追加の努力をする価値はありません。http:// enを参照してください。詳細については、wikipedia.org/wiki/Initialization_vectorを参照してください。 – MartinStettner

関連する問題