openssl命令如何处理Python添加的PKCS#7填充

2 投票
2 回答
2530 浏览
提问于 2025-04-18 11:51

我用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字节的块进行处理。如果把这些块当作一个完整的加密文件来看,它们就无法正确解密。因此,明文末尾的填充会出错,你会遇到失败的情况。

撰写回答