使用 OpenSSL 和 Python 实现 AES-256-CBC 加密与解密(安全密钥管理)

news/2025/3/9 9:18:24/

环境

  • OpenSSL
  • Python

使用 OpenSSL 加密

1. 生成 AES 密钥和 IV

强烈推荐使用方法一(Python secrets 模块),因为它更安全

方法一: Python 的 secrets 模块(安全方式)
  • 不要使用 OpenSSL 的 rand 命令直接生成密钥和 IV 用于生产环境。 尽管 openssl rand 可以生成随机数,但它可能不符合密码学安全的要求。

  • 推荐方法: 使用更安全的随机数生成器,例如 Python 的 secrets 模块:

    python">import secrets
    import binascii# 生成 256 位 AES 密钥(32 字节)
    key = secrets.token_bytes(32)
    key_hex = binascii.hexlify(key).decode()  # 转换为十六进制字符串# 生成 128 位 IV(16 字节)
    iv = secrets.token_bytes(16)
    iv_hex = binascii.hexlify(iv).decode()  # 转换为十六进制字符串print("AES Key (Hex):", key_hex)
    print("IV (Hex):", iv_hex)
    
  • secrets.token_bytes(nbytes) 生成 nbytes密码学安全的随机字节。

  • binascii.hexlify(data) 将字节数据转换为十六进制字符串。

  • 保存: 将生成的密钥和 IV 安全地保存起来(例如,使用密码管理器)。

方法二: 直接使用 OpenSSL 的 rand 命令(不推荐)
openssl rand -hex 32  # 生成 256 位 AES 密钥(32 字节)
openssl rand -hex 16  # 生成 128 位 IV(16 字节)
  • openssl rand -hex <长度> 使用 OpenSSL 的随机数生成器生成指定长度的十六进制字符串。
  • 保存密钥和 IV: 将生成的密钥和 IV 安全地保存起来(例如,存储在密码管理器中)。

2. 加密

openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -in plaintext.txt -out ciphertext.bin -K $(cat key.txt) -iv $(cat iv.txt)
  • -pbkdf2 使用 PBKDF2 密钥派生函数。
  • -iter 100000 设置迭代次数为 100000(建议至少 10000,可以根据需要调整)。
  • -K $(cat key.txt) 从文件 key.txt 中读取 AES 密钥(假设你已将密钥保存在 key.txt 文件中)。
  • -iv $(cat iv.txt) 从文件 iv.txt 中读取 IV(假设你已将 IV 保存在 iv.txt 文件中)。
  • 去掉了-salt: 当使用-pbkdf2的时候,不再需要-salt
  • 为什么要从文件中读取密钥和 IV?
    • 安全 避免将密钥和 IV 直接写在命令行中,防止泄露(例如,通过命令行历史记录)。
    • 方便: 方便管理和重复使用密钥和 IV。

3. Base64 编码

将密文转换为文本格式(用于生成条形码),需要进行 Base64 编码:

openssl base64 -in ciphertext.bin -out ciphertext.txt

4. 生成条形码

  • 使用在线条形码生成器(如 https://barcode.tec-it.com/en)将 Base64 编码后的密文生成条形码图片。
  • 选择条形码类型(如 Code 128),将 Base64 编码后的密文粘贴到输入框中,生成条形码图片。

安全传输密钥和密文

1. 安全传输密钥:

  • 重要: 密钥和 IV 的安全至关重要!绝对不要通过不安全的渠道(如微信、邮件 💀)直接发送。
  • 安全方案:
    • 线下告知: 如果条件允许,线下口头告知或使用纸条传递。
    • 加密通信工具: 使用 Signal、Wire 等端到端加密的通信工具。
    • 密钥交换协议: 如果对密码学有一定了解,可以使用 Diffie-Hellman 等密钥交换协议。
    • 密钥文件: 可以将密钥和IV存放在一个文件中, 使用 GPG 加密后发送.

2. 发送条形码:

  • 将生成的条形码图片通过微信等方式发送给你的朋友。这步可以用微信了。😇

解密方式

1. 解密

openssl enc -d -aes-256-cbc -in ciphertext.bin -out plaintext.txt -K $(cat key.txt) -iv $(cat iv.txt) -pbkdf2 -iter 100000
  • 注意:
    • 解密命令与加密命令 基本相同,只是将 -enc 改为 -d(表示解密)。
    • -pbkdf2-iter 参数必须与加密时 完全一致
    • -K-iv 参数仍然从文件中读取密钥和 IV。

2. Base64 解码

openssl base64 -d -in ciphertext.txt -out ciphertext.bin

完整的流程总结

  1. 生成强密钥和 IV:

    • 使用 Python 的 secrets 模块。
    • 将密钥和 IV 保存到安全的文件中(例如,key.txtiv.txt), 或者密码管理器中。
  2. 加密:

    openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -in plaintext.txt -out ciphertext.bin -K $(cat key.txt) -iv $(cat iv.txt)
    
    openssl base64 -in ciphertext.bin -out ciphertext.txt
    
  3. 解密:

    openssl enc -d -aes-256-cbc -in ciphertext.bin -out plaintext.txt -K $(cat key.txt) -iv $(cat iv.txt) -pbkdf2 -iter 100000
    
    openssl base64 -d -in ciphertext.txt -out ciphertext.bin
    

注意安全, HAVE FUN! 👀


http://www.ppmy.cn/news/1577780.html

相关文章

AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增

电网系统覆盖幅员辽阔&#xff0c;每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点&#xff0c;亟需智能化工具的突破性革新。为了满足这一需求&#xff0c;遨游通讯推出AORO P9000 PRO三防平板&#xff0c;以…

门牌制作(2020年蓝桥杯省赛)

题目描述&#xff1a;小蓝要为一条街的住户制作门牌号。这条街一共有2020位住户&#xff0c;门牌号从1到2020编号。小蓝制作门牌的方法是先制作0到9这几个数字字符&#xff0c;最后根据需要将字符粘贴到门牌上&#xff0c;例如门牌1017需要依次粘贴字符1、0、1、7&#xff0c;即…

linux---天气爬虫

代码概述 这段代码实现了一个天气查询系统&#xff0c;支持实时天气、未来天气和历史天气查询。用户可以通过终端菜单选择查询类型&#xff0c;并输入城市名称来获取相应的天气信息。程序通过 TCP 连接发送 HTTP 请求&#xff0c;并解析返回的 JSON 数据来展示天气信息。 #in…

rust笔记12:rust的泛型

Rust 的泛型实现是其类型系统的核心特性之一,它允许编写灵活且可重用的代码,同时保持类型安全和性能。以下从 泛型数据类型、泛型类型参数、trait bound 和 生命周期泛型 四个方面详细介绍 Rust 的泛型实现,并解释编译器如何通过 静态分发 处理泛型。 1. 泛型数据类型 泛型…

EXCEL自动化13 | 批量重命名工作簿中的工作表

目录 一. 重命名工作表1. 修改单个文件的工作表2. 修改单个文件的多个工作表3. 替换文件中的所有工作表名二. 批量重命名多个文件的工作表如下图所示,文件夹下有6个excel文件(工作簿)。打开任意一个工作簿,可看到其中有工作表,如 Sheet 1 。 要将6个工作簿中的工作表 “S…

React基础之ReactRouter

一个路径path对于一个组件component&#xff0c;当我们在浏览器中访问一个path的时候&#xff0c;path对于的组件会在页面中渲染 npm i react-router-dom 抽象路由模块 在src下创建一个router目录&#xff0c;创建一个index.js入口文件 import Login from "../page/Login&…

Kubernetes中的微服务

一、什么是微服务 在 Kubernetes 中&#xff0c;微服务是一种将应用拆分为独立、可扩展的小型服务的架构模式。每个微服务通常运行在独立的容器中&#xff0c;并通过网络进行通信。Kubernetes 提供了多种机制来管理和暴露这些微服务&#xff0c;使其能够高效地运行和扩展。 1…

小程序 wxml 语法 —— 37 setData() - 修改对象类型数据

这一节主要演示如何新增、修改和删除对象数据中单个/多个属性&#xff0c;我们直接使用微信开发者工具进行演示&#xff1b; 新增单个/多个属性 在 pages/cate/cate.js 中添加数据声明和对应的新增属性方法&#xff0c;如下&#xff1a; Page({// 在小程序页面中所需要使用的…