我正在加密/解密各种大小和类型的文件,从小文本文件到几GB的视频文件。 Pycrypto类只有编码(字符串)作为唯一的编码方法,这意味着我必须将整个文件作为一个大字符串传递(Python 2.7字节/字符串,即)。这似乎不太理想。如何以零碎的方式喂养Pycrypto?如果我将文件拆分成块(每个块的大小都是固定数量的块)并使用相同的密钥单独加密这些块,那么这样做是否会阻碍Cipher Block Chaining? (顺便说一句,我正在使用带有256位密钥的AES和每个文件的唯一iv。)
编辑:在下面回答了自己的问题,但这又引发了另一个问题:使用什么样的块大小?一次一个街区或一次几个街区?任何人都知道一个方便的方法来读取文件,但将其填充到块大小的倍数?答案 0 :(得分:5)
好的,呃,快速实验:
>>> obj = AES.new('blablablablablab', AES.MODE_CBC, 'a' * 16)
>>> obj.encrypt('z' * 16)
"?R\xd9/\xc2\xcb\x98\x8cL\xd4\xe3M\r'-k"
>>> obj.encrypt('z' * 16)
'\xa0QL\x92\xcb\xac{y\xceG\xce\xe2\x05t\xe8\xc3'
>>> obj.encrypt('z' * 16)
'\xc4x\x87L\x025\xbc\xe6\xf1`\x16w\xe0\x94$\x17'
>>>
相同的输入,不同的结果。因此,您创建的每个密码对象都必须保留IV状态:每个使用相同密码对象编码的调用都是针对您的消息的下一个块。
答案 1 :(得分:0)
4096
这只是我见过最常用的内存块大小。我可能会这样做。