如何在 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))
请注意,从文件读取与从网络套接字读取不同。需要一个缓冲区来从网络读取固定长度的块。
我正在尝试加密 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))
请注意,从文件读取与从网络套接字读取不同。需要一个缓冲区来从网络读取固定长度的块。