如何写文件解密简易脚本

wen 实用脚本 29

从零开始的实战指南

目录导读

  1. 为什么要自己写解密脚本?
  2. 基础准备:你需要掌握的三大核心技能
  3. 第一步:识别加密类型(实战问答)
  4. 第二步:编写跨平台解密框架
  5. 第三步:处理常见加密算法的简易实现
  6. 第四步:错误处理与日志设计
  7. 实战案例:解密一个被AES加密的配置文件
  8. 安全与性能优化建议
  9. 常见问题FAQ(含代码示例)

为什么要自己写解密脚本?

在日常开发或运维中,我们常遇到需要批量处理加密文件的场景:

如何写文件解密简易脚本

  • 从遗留系统导出的加密备份文件
  • 测试环境需要解密生产配置
  • 日志分析时需还原被加密的敏感字段

市面上虽有工具如opensslgpg,但定制化需求(如特定密钥派生、非标准格式)往往需要手写脚本。
关键优势:可控性、自动化、可嵌入管道流程。


基础准备:你需要掌握的三大核心技能

  1. 脚本语言:推荐Python(生态丰富)或Shell(轻量快速)。
  2. 加密算法基础:对称加密(AES-256-CBC、ChaCha20-Poly1305)、非对称(RSA-OAEP)、哈希(SHA-256)。
  3. 文件操作API:二进制读写、分块处理大文件、内存映射。

问答环节
Q: 我不会密码学能写吗?
A: 可以,只需调用标准库(如Python的cryptographypycryptodome),无需自己实现算法,重点在于正确调用API理解输入输出格式


第一步:识别加密类型(实战问答)

Q: 如何判断一个文件用了什么加密方式?
A: 检查文件头(Magic Bytes)或文件扩展名:

  • .aes → 常见为AES-CBC
  • .pgp → OpenPGP格式
  • .enc → 需分析具体协议
  • .csr → 证书签名请求(未加密)

实操技巧

import magic  # Python-magic库
file_type = magic.from_file("encrypted.bin")
print(file_type)  # 输出如 "AES encrypted data"

若无法自动识别,用hexdump手动查看前16字节(常见加密算法会固定IV或元数据)。


第二步:编写跨平台解密框架

核心结构应包含:

  1. 输入参数:文件路径、密钥来源(如环境变量、文件、交互输入)
  2. 读取模式:二进制模式打开
  3. 解密引擎:根据算法调用对应函数
  4. 输出处理:原始文件/内存/管道

代码骨架(Python):

import os, sys, argparse
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
def decrypt_file(input_path, output_path, key):
    # 实现具体解密逻辑
    pass
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("input", help="加密文件路径")
    parser.add_argument("-o", "--output", help="输出路径")
    parser.add_argument("-k", "--key", help="解密密钥")
    args = parser.parse_args()
    # 密钥处理,务必禁止硬编码
    key = args.key or os.environ.get("DECRYPT_KEY")
    if not key:
        sys.exit("密钥缺失,请通过 -k 或设置环境变量 DECRYPT_KEY")
    decrypt_file(args.input, args.output or args.input + ".dec", key.encode())

第三步:处理常见加密算法的简易实现

1 AES-256-CBC(最常遇到)

def decrypt_aes_cbc(data, key, iv):
    from cryptography.hazmat.primitives import padding
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
    decryptor = cipher.decryptor()
    padded = decryptor.update(data) + decryptor.finalize()
    unpadder = padding.PKCS7(128).unpadder()
    return unpadder.update(padded) + unpadder.finalize()

注意:IV通常存储在文件前16字节,需先提取。

2 简单异或加密(如XOR + 移位)

def xor_decrypt(data, key):
    key_bytes = key.encode()
    return bytes([b ^ key_bytes[i % len(key_bytes)] for i, b in enumerate(data)])

问答
Q: 异或加密安全吗?
A: 不安全,仅适用于防君子(如混淆配置),正式环境应使用AES。


第四步:错误处理与日志设计

设计原则

  • 文件不存在 → 输出错误退出
  • 密钥错误 → 返回AuthenticationError(自动继续下一个文件)
  • 大文件 → 分块迭代(避免内存溢出)

日志示例

import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def decrypt_safe(in_path, out_path, key):
    try:
        logging.info(f"正在解密: {in_path}")
        # 执行解密
        logging.info(f"解密成功: → {out_path}")
    except Exception as e:
        logging.error(f"解密失败: {in_path} - {str(e)}")

实战案例:解密一个被AES加密的配置文件

已知条件:文件config.aes前16字节为IV,后续为密文;密钥通过环境变量CFG_KEY传入。

完整脚本

import os, sys
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
def decrypt_aes_config(filepath, key):
    with open(filepath, "rb") as f:
        iv = f.read(16)
        ciphertext = f.read()
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
    decryptor = cipher.decryptor()
    plaintext_padded = decryptor.update(ciphertext) + decryptor.finalize()
    unpadder = padding.PKCS7(128).unpadder()
    return unpadder.update(plaintext_padded) + unpadder.finalize()
if __name__ == "__main__":
    key = os.environ.get("CFG_KEY")
    if not key or len(key) not in (16, 24, 32):
        sys.exit("请设置环境变量 CFG_KEY 为16/24/32字节长度")
    data = decrypt_aes_config("config.aes", key.encode())
    with open("config_decrypted.conf", "wb") as f:
        f.write(data)
    print("解密完成!")

安全与性能优化建议

  • 密钥管理:永远不要硬编码密钥,使用环境变量、Vault服务或AWS KMS。
  • 内存安全:解密后若数据敏感,使用memoryview并手动覆盖。
  • 性能优化:对大文件使用mmap+分片解密,避免一次加载整个文件。
  • 兼容性:使用标准格式(如NIST AES-CBC+PKCS7),避免自创格式。

问答
Q: 解密脚本放GitHub安全吗?
A: 安全——只需确保脚本不包含密钥,使用.gitignore排除密钥文件。


常见问题FAQ(含代码示例)

Q1: 解密后文件损坏怎么办?
检查点

  1. 密钥字节是否完全匹配(包括编码)
  2. IV是否从文件中正确提取
  3. 填充方式是否正确(PKCS7?ZeroPadding?)

Q2: 如何批量解密目录?
答案

import glob, os
for enc_file in glob.glob("encrypted/*.aes"):
    out_file = os.path.splitext(enc_file)[0] + "_decrypted.dat"
    decrypt_file(enc_file, out_file, key)

Q3: 支持RSA加密吗?
答案

from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding as rsa_padding
def rsa_decrypt(data, private_key_path):
    with open(private_key_path, "rb") as f:
        private_key = serialization.load_pem_private_key(f.read(), password=None)
    return private_key.decrypt(data, rsa_padding.OAEP(mgf=rsa_padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None))

编写文件解密脚本本质是算法调用 + 格式解析 + 异常处理的结合。
从识别加密类型开始,到分块解密大数据,再到安全部署,每一步都需要谨慎设计。
不要重复造轮子,善用成熟库(如cryptographycryptodome),但一定要理解底层原理。

最后提醒:解密前请确认你有合法权限,未经授权解密他人文件可能违反法律。


本文关键词:文件解密,简易脚本,Python解密,AES解密,异或加密,批量处理,安全编码

抱歉,评论功能暂时关闭!