使用Pycrypto通过流式处理加密大文件而非一次性读取整个字符串

1 投票
2 回答
2926 浏览
提问于 2025-04-17 02:04

我正在加密和解密各种大小和类型的文件,从小的文本文件到几GB的视频文件都有。Pycrypto类只有一个编码方法,就是encode(string),这意味着我必须把整个文件作为一个大字符串传递(在Python 2.7中是字节/字符串)。这样做似乎不太理想。我该如何分块给Pycrypto呢?如果我把文件分成几个小块(每块是固定大小),然后用同一个密钥分别加密这些小块,这样做会影响到密码块链接模式吗?(顺便说一下,我使用的是AES加密,密钥长度为256位,每个文件都有一个独特的初始化向量。)

补充:我自己回答了这个问题,但又引出了另一个问题:使用什么样的块大小比较好?是一次处理一个块,还是几个一起处理?有没有方便的方法可以读取文件并将其填充到块大小的倍数?

2 个回答

0
4096

这就是我见过的最常用的内存块大小。我可能会选择这个。

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的状态:每次用同一个加密对象进行编码时,都是在处理你消息的下一个部分。

撰写回答