openssl命令如何处理Python添加的PKCS#7填充
我用Python对一个(tar)文件进行了加密,并使用了PKCS#7这种填充方式。这个加密后的文件会发送给一个客户端(一个使用OpenWRT的路由器)。这个路由器通过Linux的命令行使用openssl
命令来解密这个文件。不过,这个解密的步骤出现了问题,错误信息如下:
bad decrypt
2011837512:error:06065064:lib(6):func(101):reason(100):NA:0:
tar: short read
可能问题出在填充上,所以我想知道在使用openssl
时应该用什么参数来避免这个问题。除了-nopad
,还有没有其他与填充相关的命令?
以下是用来加密tar文件的Python代码:
# 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))
以下是用来在路由器上解密tar文件的命令:
openssl aes-256-cbc -d -nosalt -K $sum256 -iv $iv -in ${PACKAGE} | tar xzf -
2 个回答
1
这个问题已经解决了,下面的Python代码是正确的。
# 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:
buf = infile.read()
buf = pad(buf)
outfile.write(cipher.encrypt(buf))
感谢@owlstead 和 @jww 的帮助!
1
总体来说,你在AES模式和填充方面的方向是对的。不过,你并不是对整个明文进行填充和加密,而是对每一个最多1024字节的块进行处理。如果把这些块当作一个完整的加密文件来看,它们就无法正确解密。因此,明文末尾的填充会出错,你会遇到失败的情况。