AES-128无填充解密crypt文件:如何重新生成填充匹配OpenSSL结果
解决AES-128与OpenSSL对齐的填充生成问题
首先明确:OpenSSL在默认加密模式下(比如CBC模式)使用的是PKCS#7填充(有时候也被称为PKCS#5填充,因为PKCS#5是针对8字节块的规范,而AES用16字节块,本质上PKCS#7是它的扩展),这就是你看到19字节文件生成13字节填充的原因。
PKCS#7填充的核心规则
PKCS#7的逻辑非常直接:
- 计算原始数据长度与AES块大小(16字节)的余数,得到需要填充的字节数
pad_len:- 如果原始长度是16的整数倍,
pad_len = 16(必须填充一整个块,不能留空) - 否则,
pad_len = 16 - (原始长度 % 16)
- 如果原始长度是16的整数倍,
- 每个填充字节的值等于需要填充的字节数,比如需要填充13字节,每个字节就是
0x0D(十进制13的十六进制表示)
手动生成填充的步骤(附代码示例)
以你提到的19字节文件为例:
- 原始数据长度:19字节
- 计算余数:
19 % 16 = 3 - 填充字节数:
16 - 3 = 13 - 生成填充:13个连续的
0x0D字节 - 拼接原始数据和填充,得到32字节(2个AES块)的待加密数据,这和OpenSSL加密前的处理完全一致
下面是Python实现的示例代码,直接生成符合OpenSSL标准的带填充数据:
def generate_openssl_compatible_padding(data, block_size=16): data_length = len(data) # 计算需要填充的字节数 pad_length = block_size - (data_length % block_size) # 生成填充字节:每个字节的值等于pad_length padding = bytes([pad_length]) * pad_length # 拼接原始数据和填充 return data + padding
验证对齐方式
如果你想确认生成的填充和OpenSSL一致,可以做个小测试:
- 用OpenSSL加密一个19字节的测试文件:
echo -n "abcdefghijklmnopqrs" > test.txt # 刚好19字节 openssl enc -aes-128-cbc -e -in test.txt -out test.crypt -K 00000000000000000000000000000000 -iv 00000000000000000000000000000000 - 用上面的代码对19字节的
b"abcdefghijklmnopqrs"生成带填充的数据,然后用AES-128-CBC无填充加密(密钥和IV与上面一致),得到的密文应该和test.crypt完全相同。
这样就能保证你生成的填充逻辑和OpenSSL完全对齐,不管是加密前的准备还是解密后的结果对比,都能匹配上。
内容的提问来源于stack exchange,提问作者damadam
相关产品推荐
相关产品推荐

