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

如何在Python中使用已知密码解密PGP自解密归档(.exe)文件

批量解密Windows下PGP自解密归档(SDA).exe文件的解决方案

问题原因

PGP自解密归档(SDA)是整合了自解密程序与加密数据的EXE文件,并非纯PGP加密数据流。这就是为什么你用gnupg库直接读取文件会提示no data was provided,以及Kleopatra无法识别这类EXE的原因——它们默认只处理标准PGP格式的加密数据,而非带自解密外壳的EXE。


解决方案一:用gpg4win命令行工具批量解密

gpg4win自带的gpg命令行工具可以识别并处理SDA文件,步骤如下:

  1. 找到gpg程序路径:默认安装路径为C:\Program Files (x86)\GnuPG\bin\gpg.exe
  2. 打开PowerShell或CMD,切换到SDA文件所在目录
  3. 执行批量解密命令:

单个文件解密

"C:\Program Files (x86)\GnuPG\bin\gpg.exe" --batch --passphrase "你的密码" --output 解密后文件名.exe 待解密文件.exe

批量解密(PowerShell)

$passwd = "你的密码"
$gpgPath = "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
# 遍历当前目录下所有.exe文件,解密后添加_decrypted后缀
Get-ChildItem -Filter "*.exe" | ForEach-Object {
    $outputName = $_.BaseName + "_decrypted" + $_.Extension
    & $gpgPath --batch --passphrase $passwd --output $outputName $_.FullName
}

参数说明:

  • --batch:禁用交互模式,无需手动确认
  • --passphrase:直接指定解密密码
  • --output:指定解密后的输出文件名(省略的话会自动使用原始归档内的文件名)

解决方案二:Python调用gpg命令行实现批量解密

由于gnupg库无法处理SDA的EXE外壳,我们可以通过Python调用系统命令来完成批量解密:

import subprocess
import os

# 配置参数
PASSWD = "你的解密密码"
GPG_EXE_PATH = r"C:\Program Files (x86)\GnuPG\bin\gpg.exe"
SDA_FILE_DIR = r"D:\你的SDA文件存放目录"

# 遍历目录下所有SDA文件
for file_name in os.listdir(SDA_FILE_DIR):
    if file_name.lower().endswith(".exe"):
        sda_full_path = os.path.join(SDA_FILE_DIR, file_name)
        # 构造解密后的文件名(原文件名后加_decrypted)
        decrypted_name = f"{os.path.splitext(file_name)[0]}_decrypted{os.path.splitext(file_name)[1]}"
        decrypted_full_path = os.path.join(SDA_FILE_DIR, decrypted_name)
        
        # 组装gpg命令参数
        cmd_args = [
            GPG_EXE_PATH,
            "--batch",
            "--passphrase", PASSWD,
            "--output", decrypted_full_path,
            sda_full_path
        ]
        
        try:
            # 执行解密命令
            subprocess.run(cmd_args, check=True, capture_output=True, text=True)
            print(f"✅ 成功解密:{file_name}")
        except subprocess.CalledProcessError as e:
            print(f"❌ 解密失败 {file_name}:{e.stderr.strip()}")

注意事项:

  • 如果你的gpg安装路径不同,请修改GPG_EXE_PATH
  • 若解密后的原始文件不是EXE格式,可调整decrypted_name的后缀
  • 密码包含特殊字符(如空格、$、&)时,Python代码无需额外处理,subprocess会自动处理参数分隔

补充提示

  • 不要尝试用gnupg库直接读取SDA文件内容,它无法解析EXE外壳中的加密数据
  • Kleopatra不支持直接处理SDA格式,所以只能通过命令行工具完成批量操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:45:07