OpenSSL AES加密会向输出添加一个块大小的字节

6
我正在尝试在控制台上使用openssl进行加密,以匹配另一种AES实现生成的输出。我使用128位CBC模式的AES,并已知所有细节。奇怪的是,无论文件大小如何,输出都会多出16个字节。我认为openssl正在附加某种填充。
在与其他实现的方向上,这不是太大的问题,因为我可以删除最后的16个字节,但相反的情况却不行,因为我无法发明openssl可能检查有效性的字节。
我该如何告诉openssl不要这样做?
命令行:
openssl enc -aes-128-cbc -K <pre-shared key in hex> -in rawfile.bin -out encfile.enc -iv <pre-shared IV in hex>

1
可能是 IV 被包含了吗?(如果是这样,它们可能会被插入到开头而不是结尾) - sehe
不太可能。05 15 be 1d 9a fb 4c 54 a2 03 90 97 3f 58 28 d8 是一个0字节文件加密的十六进制转储,与使用相同IV加密的32字节文件的第一行或最后一行不匹配。我希望它能匹配。这并不排除它最后对IV进行加密,但这是行不通的。我认为它正在加密某种填充,其中可能包括文件长度。由于这是CBC模式,很难进行比较。 - dascandy
1个回答

5
< p > openssl enc 有一个 -nopad 选项。我没有使用过它,但它听起来很相关。

-nopad
    disable standard block padding

希望文档能够更清晰一些。我在文档中找了一段时间,但在弄清楚命令行之后,就没有再深入查看了。谢谢! - dascandy
是的 - 这可行,但前提是你有适当的输入大小(否则会出现 5539:error:0607F08A:digital envelope routines:EVP_EncryptFinal_ex:data not multiple of block length:evp_enc.c:228: - sehe
我自己进行填充,所以它总是合适的。 - dascandy
对于PHP用户来说,这是OPENSSL_ZERO_PADDING选项,例如openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); - Dave S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接