You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用OpenSSL CLI处理16字节输入遇加密错误,15字节输入正常

问题原因分析

这个问题的核心是**echo命令的默认行为AES-CBC块密码的-nopad选项要求**之间的冲突,具体拆解如下:

  1. AES-CBC与-nopad的规则
    AES是块密码,固定处理16字节(128位)的数据块。当你使用-nopad选项时,OpenSSL会禁用默认的PKCS#7填充机制——这意味着输入数据的长度必须严格是16字节的整数倍,否则加密/解密过程会直接抛出"数据不是块长度的倍数"的错误。

  2. echo的隐形换行坑
    你用的echo命令默认会在输出字符串的末尾自动添加一个换行符(\n,ASCII码0x0A)。这就导致:

    • 当你输入16字节的字符串时,加上换行符后总长度变成17字节,不是16的倍数,触发了-nopad的长度检查,所以报错。
    • 当你把输入改成15字节时,加上换行符后总长度正好是16字节,完美符合-nopad的要求,所以加密过程正常执行,没有错误。
  3. 验证解决方案
    你可以试试给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

火山引擎 最新活动