You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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验证)
  • IV11111111等价于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,提问作者中路達也

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:54:14