使用OpenSSL CLI处理16字节输入遇加密错误,15字节输入正常
问题原因分析
这个问题的核心是**echo命令的默认行为和AES-CBC块密码的-nopad选项要求**之间的冲突,具体拆解如下:
AES-CBC与
-nopad的规则
AES是块密码,固定处理16字节(128位)的数据块。当你使用-nopad选项时,OpenSSL会禁用默认的PKCS#7填充机制——这意味着输入数据的长度必须严格是16字节的整数倍,否则加密/解密过程会直接抛出"数据不是块长度的倍数"的错误。echo的隐形换行坑
你用的echo命令默认会在输出字符串的末尾自动添加一个换行符(\n,ASCII码0x0A)。这就导致:- 当你输入16字节的字符串时,加上换行符后总长度变成17字节,不是16的倍数,触发了
-nopad的长度检查,所以报错。 - 当你把输入改成15字节时,加上换行符后总长度正好是16字节,完美符合
-nopad的要求,所以加密过程正常执行,没有错误。
- 当你输入16字节的字符串时,加上换行符后总长度变成17字节,不是16的倍数,触发了
验证解决方案
你可以试试给echo加上-n选项(禁止自动添加换行符),这样16字节的输入就不会被额外增加长度了,命令如下:echo -n -e "abcdefgh\x08\x08\x08\x08\x08\x08\x08\x08" | openssl enc -aes-256-cbc -nopad -a -K 6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435 -iv 61636567696B6D6F7173757779303234执行这个命令应该就不会出现之前的错误了。
另外提一句:错误提示里的"bad decrypt"有点误导性,因为你是在执行加密操作,但OpenSSL的enc命令错误信息复用了部分字符串,实际问题还是加密阶段的数据长度不符合-nopad的要求。
内容的提问来源于stack exchange,提问作者joel




