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

Openssl在Bash脚本中解密返回值异常的技术问询

OpenSSL 脚本中密码爆破返回值误判问题分析

核心原因:命令替换$(...)导致退出码被覆盖

你的脚本中直接用$(openssl enc -aes-256-cbc -pbkdf2 -d -in $2 -out $3 -pass pass:$pword)执行解密命令,这个写法的问题在于:

  • $(...)是命令替换,它会先执行openssl命令,再把命令的标准输出内容当作新的Shell命令去执行。
  • 密码错误时,OpenSSL解密失败,不会向标准输出(stdout)输出任何内容,只会向标准错误(stderr)输出bad decrypt提示。
  • 此时$(...)捕获的stdout为空,相当于执行了一个“空命令”,而Shell执行空命令的退出码是0(表示成功),这直接覆盖了OpenSSL原本返回的退出码1,导致脚本误判密码正确。

命令行与脚本行为差异的根源

命令行直接执行openssl enc ...时,$?获取的是OpenSSL命令本身的退出码;但脚本中用命令替换后,$?获取的是执行命令替换输出内容的退出码,而非OpenSSL的退出码,这就造成了两者结果不一致。

额外验证说明

那些被误判的词汇(如abies、abkar)本质仍是错误密码,解密后的文件仍处于加密状态,说明OpenSSL实际解密失败,但脚本因为$(...)的写法错误,拿到了错误的退出码0。

修复方案

去掉命令替换,直接执行OpenSSL命令,这样$?就能正确获取OpenSSL的退出码:

echo "Current Pword is $pword"
openssl enc -aes-256-cbc -pbkdf2 -d -in "$2" -out "$3" -pass pass:"$pword"
if [ "$?" -eq 0 ]
then
    echo "The password was found to be $pword 
"
    echo "$pword
" >> pwords.out
    echo "The file was decrypted as $3
"
    exit 0
fi

同时建议给所有变量加上双引号,避免文件名、密码包含空格或特殊字符时出现意外问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:30:05