为什么PyCrypto不使用默认IV?

zen*_*sel 13 python aes pycrypto

我试图弄清楚为什么我的Python客户端和Ruby服务器对如何加密数据存在分歧.我在Ruby代码和我的代码中看到的唯一区别是它们没有指定初始化向量,因此它回退到所有\ x0的默认值

当我尝试在没有iv的情况下实例化PyCrypto时它会给我一个错误.这是一个例子:

from Crypto.Cipher import AES
test = "Very, very confidential data"
key = b'Thirty Two Byte key, made Beef y' 

gryp = AES.new(key, AES.MODE_CBC)
Run Code Online (Sandbox Code Playgroud)

(这个例子基本上是来自PyCrypto文档的示例代码而没有指定IV)文档说w/r/t IV"它是可选的,当它不存在时,它将被赋予全零的默认值." 但是我得到错误"ValueError:IV必须是16个字节长".

所以我可以指定IV,这不是问题,但我想弄清楚,如果它认为它不能使用默认值,如果我使用库的方式有其他错误.

Joh*_*yon 17

这似乎是Pycrypto AES的类文档中的一个错误,因为AES实现已经改变,因此IV 对于那些需要一个的模式不是可选的(即你必须自己传递16个字节的零,如果是你想怎么做).

如果有人没有指定IV并查找在线文档,请查看此错误报告.有一个明确要求IV的变化,基本上没有人更新在线文档以反映这一点.Pycrypto源中的类文档已更新,但需要重新生成在线文档以反映这一点.

来自消息来源的新文档说明:

对于所有其他模式,它必须是block_size字节长.

而不是旧版本的

对于所有其他模式,它必须是block_size字节长.它是可选的,当不存在时,它将被赋予全零的默认值.

源中更新的示例(指定iv)是:

from Crypto.Cipher import AES
from Crypto import Random

key = b'Sixteen byte key'
iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')
Run Code Online (Sandbox Code Playgroud)