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 回答