该错误意味着 OpenSSL 看到的 IV 值包含非十六进制字符(即 0123456789abcdefABCDEF 以外的字符)。
AES128 密钥是 128/8 = 16 字节,因此您应该有 32 个字符作为密钥。 IV 为 16 个字节,对应于 AES 块大小,OpenSSL 将为您将单个“0”转换为 16 个零字节。这是一个很好的命令示例:
$ echo -n "hello" > in
$ openssl aes-128-cbc -e -in in -out out -p -nosalt \
-K 000102030405060708090a0b0c0d0e0f -iv 000102030405060708090a0b0c0d0e0f
$ cat out | hexdump -e '16/1 "%02x"'
8326dc340c564d49790650a59260fea0
现在用非十六进制字符替换 IV 的最后一个字符,看看你得到的错误与你得到的相同。
$ openssl aes-128-cbc -e -in in -out out -p -nosalt \
-K 000102030405060708090a0b0c0d0e0f -iv 000102030405060708090a0b0c0d0e0q
$ cat out | hexdump -e '16/1 "%02x"'
non-hex digit
invalid hex iv value
如果您粘贴的是您正在运行的真实代码,那么问题就很明显了。首先,-K ${he-iv ${hexIV} 应该是什么意思?其次,参数-K 是给出密钥。您缺少-iv 来进行静脉注射。你甚至缺少一个右括号。
假设 static.key 有 16 个字节,这可能会解决您的问题:
openssl aes-128-cbc -e -in logo-1.ts -out logo-enc-1.ts -p -nosalt -K $hexKey -iv $hexIV
最后一个提示,如果您使用 bash,请使用 -x 作为 bash 的参数运行脚本,它会在扩展变量后打印它执行的每一行,以便您可以准确地看到它在做什么:
$ /bin/bash -x my_script
+ hexKey=0
+ hexIV=0
+ openssl aes-128-cbc -e -in in -out out -p -nosalt -K 0 -iv 0