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



我正在尝试通过Python中的PyCrypto库获得AES加密。

我从用户那里读了密码,从文件中读了盐。 然后,我调用 PBKDF2 从文本密码生成密钥

PBKDF2(self.master_password, salt, 32)

然后,我使用Random.get_random_bytes生成IV

IV = Random.get_random_bytes(len(key))

然后,我从 Crypto.Util 包创建一个计数器

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

如果有人能指出我正确的方向,那就太好了。

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位随机数,您最多可以在遇到问题之前加密 264个块。这比世界上任何数据都多,但问题是,通过随机选择随机数,由于生日悖论,在使用相同的密钥进行 232次加密后,您有 1 的概率发生随机数冲突。
对于 96 位随机数,您最多可以加密 232个块,大约是 68 GB 的数据,但发生随机数冲突的机会要低得多。

随机数不是秘密的,因此您可以将其与密文一起发送。通常,它只是在密文前面加上并在解密之前切掉。既然你知道它应该有多长,你就知道你能切掉多少。

最新更新