我可能会迟到,我可能忽略了之前的答案,但我没有找到一个明确的声明,说明如何(至少是imho)根据密码包来完成这项工作。
crypto.util.counter包提供了可调用的状态计数器,这非常有用,但至少对于我来说,不正确地使用它们是很容易的。
您必须创建一个计数器,例如
ctr = Counter.new('parameters here')
. 每当计数器模式的密码对象调用计数器来加密消息时,它就会递增。这对于良好的加密实践是必需的,否则,有关相等块的信息可能会从密文中泄漏。
现在您不能对同一个密码对象调用解密函数,因为它将再次调用同一个计数器,同时该计数器已递增,可能几次。您需要做的是用用相同参数初始化的不同计数器创建一个新的密码对象。这样,解密就可以正常工作,从完成加密的同一点开始计数器。
工作示例如下:
# Import modules
from Crypto.Cipher import AES
from Crypto import Random
from Crypto.Util import Counter
# Pad for short keys
pad = '# constant pad for short keys ##'
# Generate a random initialization vector, to be used by both encryptor and decryptor
# This may be sent in clear in a real communication
random_generator = Random.new()
IV = random_generator.read(8)
# Encryption steps
# Ask user for input and pad or truncate to a 32 bytes (256 bits) key
prompt = 'Input your key. It will padded or truncated at 32 bytes (256 bits).\n-: '
user_keye = raw_input(prompt)
keye = (user_keye + pad)[:32]
# Create counter for encryptor
ctr_e = Counter.new(64, prefix=IV)
# Create encryptor, ask for plaintext to encrypt, then encrypt and print ciphertext
encryptor = AES.new(keye, AES.MODE_CTR, counter=ctr_e)
plaintext = raw_input('Enter message to cipher: ')
ciphertext = encryptor.encrypt(plaintext)
print ciphertext
# Decryption steps
# Ask user for key: it must be equal to that used for encryption
prompt = 'Input your key. It will padded or truncated at 32 bytes (256 bits).\n-: '
user_keyd = raw_input(prompt)
keyd = (user_keyd + pad)[:32]
# Create counter for decryptor: it is equal to the encryptor, but restarts from the beginning
ctr_d = Counter.new(64, prefix=IV)
# Create decryptor, then decrypt and print decoded text
decryptor = AES.new(keyd, AES.MODE_CTR, counter=ctr_d)
decoded_text = decryptor.decrypt(ciphertext)
print decoded_text