为何OpenSSL命令与PHP openssl_encrypt加密结果不一致?
环境
- PHP 7.4
- OpenSSL 3.0.0
问题
OpenSSL加密命令与PHP openssl_encrypt函数的结果不同,二者为何不一致?
执行PHP代码:
$ php -r 'var_dump(openssl_encrypt("test@email.com", "bf-cbc","a88e2d710bee460c", 0,"11111111"));'
输出:
string(24) "4iZiBW4UYWswVd3fkS+OOA=="
执行OpenSSL命令:
$ echo "test@email.com" | openssl enc -bf-cbc -K "61383865326437313062656534363063" -iv "3131313131313131" -base64 -A -provider legacy
(OpenSSL 1.x版本无需添加-provider legacy)
输出:
"4iZiBW4UYWsfLsRE7dKxZQ=="
注:十六进制转换对应关系:
- 密钥
a88e2d710bee460c等价于6138 3865 3264 3731 3062 6565 3436 3063(执行$ printf a88e2d710bee460c | xxd验证) - IV
11111111等价于3131 3131 3131 3131(执行$ printf 11111111 | xxd验证)
解密情况
解密PHP加密结果:
$ echo "4iZiBW4UYWswVd3fkS+OOA==" | openssl enc -d -bf-cbc -K "61383865326437313062656534363063" -iv "3131313131313131" -base64 -provider legacy
输出(无换行):test@email.com
解密OpenSSL命令加密结果:
$ echo "4iZiBW4UYWsfLsRE7dKxZQ==" | openssl enc -d -bf-cbc -K "61383865326437313062656534363063" -iv "3131313131313131" -base64 -provider legacy
输出(带换行):test@email.com
原因分析
二者结果不一致的核心原因是加密的原始内容不同:
- PHP的
openssl_encrypt处理的是纯字符串test@email.com,末尾没有换行符; - 而
echo "test@email.com"命令默认会在输出内容末尾添加一个换行符(\n),相当于OpenSSL命令实际加密的是test@email.com\n这个字符串。
验证方法:在PHP中把字符串改成test@email.com\n再加密,结果就会和OpenSSL命令的输出一致;或者使用echo -n "test@email.com"(-n参数禁止添加换行符)执行OpenSSL加密命令,输出就会和PHP的结果匹配。
内容的提问来源于stack exchange,提问作者中路達也
相关产品推荐
相关产品推荐

