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

如何使用Linux预装OpenSSL命令行解密PHP AES-256-ECB加密的JSON文件

问题分析与正确解密方案

你的解密失败主要源于密钥处理不匹配和输入格式错误,下面逐一拆解问题并给出解决办法:

核心问题1:密钥的PHP与OpenSSL处理差异

第三方PHP代码的密钥使用逻辑和你用OpenSSL命令的方式完全不一致:

  • 在PHP代码中,$aes_key是一个64字符的ASCII字符串,而AES-256要求32字节(256位)密钥。PHP的openssl_encrypt会自动截断这个长字符串,取前32个字符的ASCII字节作为实际加密密钥。
  • 你在OpenSSL命令中使用-K参数时,传入了完整的128个十六进制字符,OpenSSL会截断为前64个十六进制字符(转成32字节二进制),这和PHP实际使用的密钥完全不是一回事!

如何得到正确的OpenSSL密钥参数

我们需要把PHP实际使用的32字节密钥转成十六进制格式(OpenSSL的-K参数要求):

  1. 提取$aes_key的前32个字符:b4396c8cd9b16b0d86604d6d3787bc12
  2. 将每个字符的ASCII值转成十六进制(比如字符b对应0x62,字符4对应0x34),拼接后得到:
    6234333936633863643962313662306438363630346436643337383762633132
    

核心问题2:输入数据格式错误

第三方加密后输出的是base64编码的密文,但你最初的命令没有告诉OpenSSL先解码base64,导致OpenSSL直接把base64字符串当作二进制密文处理,出现块长度不匹配的错误。

正确的解密命令

结合以上修正,正确的OpenSSL命令如下:

openssl aes-256-ecb -d -base64 -K 6234333936633863643962313662306438363630346436643337383762633132 -in input.txt -out recover.json

命令参数说明

  • -base64:告诉OpenSSL先对输入的base64字符串解码,得到原始加密二进制数据
  • -K:传入我们转换后的正确十六进制密钥
  • 不需要-nopad:PHP的openssl_encrypt默认使用PKCS#7填充,OpenSSL解密时会自动处理填充,加-nopad反而会导致保留填充字节,破坏JSON格式

验证结果

执行这个命令后,生成的recover.json应该可以正常解析为UTF-8格式的JSON数据,和原始加密前的内容一致。

内容的提问来源于stack exchange,提问作者林奕勳

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:29:04