如何在PyCrypto AES CTR模式下设置块大小

时间:2017-04-12 15:15:24

标签: python encryption aes pycrypto ctr-mode

我正在尝试通过Python中的PyCrypto库来使用AES加密。

我读取了用户的密码和文件中的salt。 然后我调用PBKDF2从文本密码

生成密钥
PBKDF2(self.master_password, salt, 32)

然后我使用Random.get_random_bytes

生成IV
IV = Random.get_random_bytes(len(key))

然后我从Crypto.Util包中创建一个Counter

ctr = Counter.new(32, IV)

然后我创建一个AES对象

e = AES.new(key, AES.MODE_CTR, counter=ctr)

但是当我打电话给e加密时

e.encrypt(user_name)

我收到以下错误

CTR counter function returned string not of length 16

从我理解的方式来看,这个错误意味着分组密码是16个字节,与我在

找到的文档相匹配

https://www.dlitz.net/software/pycrypto/api/current/Crypto.Cipher.AES-module.html

我尝试通过像这样

创建AES对象将其更改为32字节的块大小
AES_Encryptor = AES.new(key, AES.MODE_CTR, counter=ctr, block_size=32)

然后我收到以下错误

'block_size' is an invalid keyword argument for this function

如果有人能指出我走向正确的方向,那就很棒。

1 个答案:

答案 0 :(得分:4)

AES是块密码,固定块大小为128位(16字节)。它有三个有效的密钥大小,128位,192位和256位。 CTR模式的随机数,有时也称为IV,只要块大小为16字节,就需要最多

如果您想要256位块大小,则无法使用AES。还有其他几种允许256位块大小的算法,如Rijndael,但在pycrypto中没有实现。 AES是Rijndael的子集。

通常,我们为CTR模式生成64位或96位的随机数,以便对没有计数器冲突的加密块数进行一些控制。

nonce = Random.get_random_bytes(8)  # 8 bytes
ctr = Counter.new(64, nonce)        # 64 bits remaining

nonce = Random.get_random_bytes(12) # 12 bytes
ctr = Counter.new(32, nonce)        # 32 bits remaining

对于64位现时,您可以在遇到问题之前加密最多2个 64 块。这比世界上任何数据都要多,但问题是通过随机选择随机数,在2 32 加密后,你有一个概率为1来获得随机数碰撞由于生日悖论的关键。
对于96位随机数,您最多可以加密2个 32 块,这大约是68 GB的数据,但是你获得随机数碰撞的几率要低得多。

nonce不是秘密,所以你可以将它与密文一起发送。通常,它只是在密文之前预先填写并在解密之前切掉。既然你知道它应该有多长,你知道你可以切掉多少。