Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么PyCrypto不使用默认的IV?_Python_Aes_Pycrypto - Fatal编程技术网

Python 为什么PyCrypto不使用默认的IV?

Python 为什么PyCrypto不使用默认的IV?,python,aes,pycrypto,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' gr

我试图弄明白为什么我的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)
(本例基本上是PyCrypto文档中的示例代码,没有指定IV)文档说w/r/t IV“它是可选的,当不存在时,它将被赋予默认值全零。”但是我得到错误“ValueError:IV必须是16字节长”


因此,我可以指定IV,这不是问题所在,但我试图找出,如果它认为它不能使用默认值,如果我使用库的方式存在其他问题。

这似乎是Pycrypto的类文档中的错误,由于AES实现已更改,因此对于需要IV的模式,IV是而不是可选的(即,如果您想这样做,您必须自己传递16字节的零)

看到这里,有人没有指定静脉注射,而是查看了在线文档。有一个明确要求IV的变化,本质上,没有人更新在线文档来反映这一点。Pycrypto源代码中的类文档已更新,但需要重新生成联机文档以反映这一点

源文件中的新文档说明:

对于所有其他模式,它必须是
block\u size
字节长

而不是旧版本的

对于所有其他模式,它必须是
block\u 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')

下面是一个适用于我的实现,其中包含一些修复:

class AESCipher:

    def __init__(self, key):
        self.bs = 32
        if len(key) >= 32:
            self.key = key[:32]
        else:
            self.key = self._pad(key)

    def encrypt(self, raw):
        raw = self._pad(raw)
        iv = Random.new().read(AES.block_size)
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return base64.b64encode(iv + cipher.encrypt(raw))

    def decrypt(self, enc):
        enc = base64.b64decode(enc)
        iv = enc[:AES.block_size]
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return self._unpad(cipher.decrypt(enc[AES.block_size:]))

    def _pad(self, s):
        return s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)

    def _unpad(self, s):
        return s[:-ord(s[len(s)-1:])]

我忍不住觉得截断钥匙是个坏主意。