4

AESを使用して、いくつかのパスワードを自家製のパスワード セーフに安全に保存しようとしていますが、何らかの理由で から元のデータを取得できませんAES.decrypt。これが私がテストしているコードです:

from Crypto.Cipher import AES
from Crypto.Hash import SHA256

def sha1(text):
    s = SHA256.new()
    s.update(text)
    return s.hexdigest()

aes = AES.new('JG9A90cqiveJ8K7n', AES.MODE_CFB, 'g4vhFIR1KncRIyvO')

text = 'This is some text that will be encrypted'
encrypted_text = aes.encrypt(text)
decrypted_text = aes.decrypt(encrypted_text)

print 'Original:\t' + sha1(text)
print 'Encrypted:\t' + sha1(encrypted_text)
print 'Decrypted:\t' + sha1(decrypted_text)

それは出力です:

オリジナル: 099e17130a9c796c8b7f21f269a790e877c7f49b6a39deda33d4e7b63b80c049
暗号化: 71006ff5dc695a32c020dbb27c45b4861ec10a76e40d349bf078bca56b57d5bb
復号化: 2683455f4ae01e3cd1cba6c2537712fee8783621f32c865b8d4526130ff0096d

任意の長さの文字列を暗号化および復号化できるようにするため、サイファー フィードバック モードを使用しています。文字列。

ここで何が間違っていますか?

4

2 に答える 2

10

aes暗号化と復号化に同じオブジェクトを使用しているためです。暗号化後、初期値が変更されました。したがって、復号化に同じ初期値を使用していません。以下は機能します(aesを再宣言します):

from Crypto.Cipher import AES
from Crypto.Hash import SHA256

def sha1(text):
    s = SHA256.new()
    s.update(text)
    return s.hexdigest()

aes = AES.new('JG9A90cqiveJ8K7n', AES.MODE_CFB, 'g4vhFIR1KncRIyvO')

text = 'This is some text that will be encrypted'
encrypted_text = aes.encrypt(text)

aes = AES.new('JG9A90cqiveJ8K7n', AES.MODE_CFB, 'g4vhFIR1KncRIyvO')
decrypted_text = aes.decrypt(encrypted_text)

print 'Original:\t' + sha1(text)
print 'Encrypted:\t' + sha1(encrypted_text)
print 'Decrypted:\t' + sha1(decrypted_text)
于 2012-07-24T11:42:02.043 に答える
0

理由はわかりませんが、これは機能します:

key = b"JG9A90cqiveJ8K7n"
mode = AES.MODE_CFB
iv = b"g4vhFIR1KncRIyvO"

text = 'This is some text that will be encrypted'

aes_enc = AES.new(key, mode, iv)
enc = aes_enc.encrypt(text)

aes_dec = AES.new(key, mode)
dec = aes_dec.decrypt(iv + enc)

assert text == dec[16:]

ivとパディングの詳細も調べる必要があります:)

編集:

http://packages.python.org/pycrypto/Crypto.Cipher.blockalgo-module.html#MODE_CFBを参照してください。

于 2012-07-24T11:37:20.627 に答える