如何在 Python 3 中填充字节序列?

How can I pad a sequence of bytes in Python 3?

我正在尝试加密 PDF 或可执行文件等文件,但无法填充它。

我尝试用这种方法读取文件:

with('file', 'rb') as file_read:
    line = file_read.read(n) --> n multple of 16
    encrypt(line, key)

然后我将该行传递给我的 encrypt 函数,但是当我到达不是 16 的倍数的行时,我的程序崩溃了。

如何正确填充字节序列?

大多数加密实现都支持填充选项,通常 PKCS#7 (née PKCS#5) 在加密时添加填充并在解密时删除它。

注意:mcrypt不支持PKCS#7 padding,远离它

这是先前答案的简化(编辑)版本。


假设使用 line = f.read(N)(其中 N 是块大小)在循环中读取文件,直到 EOF。

1) 平凡的零填充;只需在 read:

之后添加
elen = len(line) % N
if elen:
    line += bytes(N - elen)

零填充是最简单的,但也有缺点。


2) PKCS#7 填充,N < 256;在 read 之后添加它并确保循环将在之后退出:

if len(line) < N:
    elen = 1 + (len(line) - 1) % N
    line += bytes(elen for _ in range(elen))

请注意,从文件读取与从网络套接字读取不同。需要一个缓冲区来从网络读取固定长度的块。