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

如何使用OpenSSL解密Java生成的AES加密文件?

正确的OpenSSL解密参数及操作步骤

先明确你的Java代码加密逻辑:

  • 采用AES-256-CBC模式+PKCS5填充
  • 通过PBKDF2WithHmacSHA256生成密钥,迭代次数65536,密钥长度256位
  • 最终加密结果格式:[16字节随机IV][密文],整体做Base64编码

你之前的OpenSSL命令存在核心错误:用了加密模式而非解密模式、盐参数格式不匹配、未正确分离IV与密文。以下是正确的解密流程:

步骤1:解码Base64并拆分IV和密文

把加密结果保存到文件encrypted.b64,执行以下命令解码并拆分:

# Base64解码为二进制文件
base64 -d encrypted.b64 > encrypted.bin

# 提取前16字节IV到iv.bin
dd if=encrypted.bin of=iv.bin bs=1 count=16

# 提取剩余内容作为密文到ciphertext.bin
dd if=encrypted.bin of=ciphertext.bin bs=1 skip=16

步骤2:执行OpenSSL解密

使用匹配Java逻辑的参数执行解密:

openssl enc -d -aes-256-cbc -pbkdf2 -iter 65536 -md sha256 -k "MySecretKey" -S $(echo -n "MySalt" | xxd -p) -iv $(cat iv.bin | xxd -p) -in ciphertext.bin

参数说明:

  • -d:解密模式(你之前用-e是加密,这是最关键的错误)
  • -aes-256-cbc:完全匹配Java的加密算法模式
  • -pbkdf2:启用PBKDF2密钥派生,对应Java的PBKDF2WithHmacSHA256
  • -iter 65536:和Java代码的迭代次数保持一致
  • -md sha256:指定PBKDF2的哈希算法为SHA256,和Java逻辑对齐
  • -k "MySecretKey":传入加密时用的密钥字符串
  • -S $(echo -n "MySalt" | xxd -p):直接将盐字符串转十六进制,避免OpenSSL自动补零导致盐不匹配
  • -iv $(cat iv.bin | xxd -p):指定从文件提取的IV十六进制值
  • -in ciphertext.bin:输入拆分后的密文文件

一步简化版(无需拆分文件)

如果不想生成中间文件,可通过管道直接处理:

echo "zYsUELxuE3KT4IDa1cbRnX70OSlQTbcDa1LEuh0IzfjZZcJhnuX8kLFcGqYLWjfp0XJzfgwFreZIqmqE1HqlGw==" | base64 -d | {
    read -r -N 16 iv;
    openssl enc -d -aes-256-cbc -pbkdf2 -iter 65536 -md sha256 -k "MySecretKey" -S $(echo -n "MySalt" | xxd -p) -iv $(echo "$iv" | xxd -p)
}

之前命令失败的原因

  1. 模式错误:用-e执行加密而非-d解密,完全搞反了操作方向
  2. 盐不匹配:OpenSSL的-S要求16位十六进制(对应8字节盐),你的MySalt是6字节,OpenSSL自动补零后和Java使用的盐不一致
  3. IV未正确传递:Java把IV放在加密数据最前面,但OpenSSL默认不识别这种格式,必须手动分离并指定

内容的提问来源于stack exchange,提问作者TenG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:31:23