php aes加密 ctr,使用aes+ctr的加密问题

我可能会迟到,我可能忽略了之前的答案,但我没有找到一个明确的声明,说明如何(至少是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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值