我可能肯定迟到了,我可能忽略了以前的答案,但我没有找到一个明确的说明,说明应该如何(至少恕我直言)根据 PyCrypto 包完成。
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
print
# 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