我使用 python 加密(tar)文件并使用 PKCS#7 进行填充。然后这个加密的文件被发送到客户端(带有 OpenWRT 的路由器)。该路由器使用 (linux) shell 和 openssl
命令对其进行解密。然而,最后一步失败并显示以下信息:
bad decrypt
2011837512:error:06065064:lib(6):func(101):reason(100):NA:0:
tar: short read
也许问题出在填充上,所以我想知道 openssl
使用什么参数来避免这个问题。除了 -nopad
之外还有其他与填充相关的命令吗?
以下Python代码用于加密tar文件:
# Encrypt file
def aes_encrypt_file(in_filename, out_filename, key, iv):
block_size = AES.block_size
pad = lambda s: s + (block_size - len(s) % block_size) \
* chr(block_size - len(s) % block_size)
cipher = aes_build_cipher(key, iv)
with open(in_filename, 'rb') as infile:
with open(out_filename, 'wb') as outfile:
while True:
buf = infile.read(1024)
if len(buf) == 0:
break
elif len(buf) % block_size != 0:
buf = pad(buf)
outfile.write(cipher.encrypt(buf))
以下 shell 命令用于解密路由器上的 tar 文件:
openssl aes-256-cbc -d -nosalt -K $sum256 -iv $iv -in ${PACKAGE} | tar xzf -
最佳答案
一般来说,您在 AES 模式和填充方面正朝着正确的方向前进。然而,您填充和加密的不是整个明文,而是每个(最大)1024 字节的 block 。如果将其视为单个加密文件,则无法正确解密,因此明文末尾的填充将不正确,您将看到失败。
关于python - openssl 命令如何处理用 python 添加的 PKCS#7 填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24531307/