我正在尝试通过Python中的PyCrypto库来使用AES加密。
我读取了用户的密码和文件中的salt。 然后我调用PBKDF2从文本密码
生成密钥PBKDF2(self.master_password, salt, 32)
然后我使用Random.get_random_bytes
生成IVIV = 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
如果有人能指出我走向正确的方向,那就很棒。
答案 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不是秘密,所以你可以将它与密文一起发送。通常,它只是在密文之前预先填写并在解密之前切掉。既然你知道它应该有多长,你知道你可以切掉多少。