AES-128加密结果不一致求助:网页与OpenSSL CLI结果不同
AES加密结果不一致的核心差异点
以下是你忽略的关键配置细节:
1. 密钥处理逻辑差异
AES-128要求密钥为16字节(128位),你的原始密钥123456789仅9字节,不同工具的补全/派生逻辑完全不同:
- 网页工具:直接将原始密钥用零字节(\x00)补全至16字节,最终密钥对应十六进制为
31323334353637383900000000000000。 - 命令1(
-K参数):你传入的十六进制仅对应9字节,OpenSSL会自动补零到16字节,但因填充方式差异,结果仍不匹配。 - 命令2(
-k参数):即使添加-nosalt,OpenSSL仍会通过EVP_BytesToKey算法从原始密码派生密钥,而非直接使用原始字符串,必然导致密钥与网页工具不一致。
2. 明文填充方式不同
AES是块加密算法,需将明文填充至16字节的块大小:
- 网页工具大概率使用零填充:对
hello(5字节)补11个零字节,得到hello\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00。 - OpenSSL默认使用PKCS#7填充:对
hello补11个0x0B字节(填充字节的值等于需要填充的数量),得到hello\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B。
两种填充方式生成的明文块完全不同,加密结果自然无法匹配。
3. 加密模式与IV的一致性确认
需确认网页工具的加密模式是否为CBC,以及IV是否为全零:
- 若网页工具默认使用ECB模式(无需IV),而你用了CBC模式,结果必然不同。
- 若网页工具的IV不是全零,即使其他配置一致,加密结果也会差异巨大。
匹配网页结果的OpenSSL命令
要得到和网页一致的结果,需对齐所有配置:
# 手动填充零字节后加密,确保和网页填充逻辑一致 echo -n -e "hello\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" | openssl aes-128-cbc -K 31323334353637383900000000000000 -iv 00000000000000000000000000000000 -a
内容的提问来源于stack exchange,提问作者TonyStark
相关产品推荐
相关产品推荐

