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)