python - openssl 命令如何处理用 python 添加的 PKCS#7 填充

标签 python shell encryption openssl

我使用 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/

相关文章:

c - 使 fopen() 从某个目录打开文件

ios - 如何从 iOS 发送带附件的 S/MIME 加密邮件?

python - 将 pandas 数据帧插入 MySQL 表 - MySQLInterfaceError : Python type list cannot be converted

python - 如何作为命令的结果从另一个程序执行代码

bash - 如何将 bash shell 脚本转换为 .bat 文件?

encryption - 使用 AES 时,有没有办法判断数据是使用 128 位 key 还是 256 位 key 加密的?

ssl - 使用 boost::asio 加载证书时出错

Python Azure 事件中心使用事件属性

python - 在 pyparsing 期间更改字符串

python - 平面算法之间的角度太慢