当前位置: 首页 > news >正文

Python 实现非对称加密的 A 端和 B 端软件的详细步骤及代码示例

以下是使用 Python 实现非对称加密的 A 端和 B 端软件的详细步骤及代码示例,并且会说明如何将其打包为可执行的 .exe 文件。这里我们使用 cryptography 库来实现 RSA 非对称加密算法。

1. 安装依赖库

首先,确保你已经安装了 cryptography 库。如果没有安装,可以使用以下命令进行安装:

pip install cryptography

2. 编写 A 端软件代码(a_end.py

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
import base64

def encrypt_message(public_key_pem, plaintext):
    # 加载公钥
    public_key = serialization.load_pem_public_key(
        public_key_pem.encode(),
        backend=default_backend()
    )
    # 加密明文
    ciphertext = public_key.encrypt(
        plaintext.encode(),
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    # 将加密后的字节数据转换为 Base64 编码的字符串,方便复制
    encrypted_base64 = base64.b64encode(ciphertext).decode()
    return encrypted_base64

if __name__ == "__main__":
    # 读取公钥文件
    try:
        with open('public_key.pem', 'r') as f:
            public_key_pem = f.read()
    except FileNotFoundError:
        print("未找到公钥文件 'public_key.pem',请确保文件存在。")
        exit(1)

    # 输入明文
    plaintext = input("请输入要加密的明文: ")

    # 加密明文
    encrypted_text = encrypt_message(public_key_pem, plaintext)

    # 输出可复制的密文
    print("加密后的密文(可复制):")
    print(encrypted_text)

3. 编写 B 端软件代码(b_end.py

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
import base64

def generate_key_pair():
    # 生成私钥
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
        backend=default_backend()
    )
    # 生成公钥
    public_key = private_key.public_key()

    # 保存私钥到文件
    private_pem = private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.PKCS8,
        encryption_algorithm=serialization.NoEncryption()
    )
    with open('private_key.pem', 'wb') as f:
        f.write(private_pem)

    # 保存公钥到文件
    public_pem = public_key.public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo
    )
    with open('public_key.pem', 'wb') as f:
        f.write(public_pem)

    print("密钥对生成成功,私钥保存为 'private_key.pem',公钥保存为 'public_key.pem'。")

def decrypt_message(private_key_pem, encrypted_base64):
    # 加载私钥
    private_key = serialization.load_pem_private_key(
        private_key_pem.encode(),
        password=None,
        backend=default_backend()
    )
    # 将 Base64 编码的密文转换为字节数据
    ciphertext = base64.b64decode(encrypted_base64)
    # 解密密文
    plaintext = private_key.decrypt(
        ciphertext,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return plaintext.decode()

if __name__ == "__main__":
    # 生成密钥对
    generate_key_pair()

    # 读取私钥文件
    try:
        with open('private_key.pem', 'r') as f:
            private_key_pem = f.read()
    except FileNotFoundError:
        print("未找到私钥文件 'private_key.pem',请确保文件存在。")
        exit(1)

    # 输入密文
    encrypted_text = input("请输入要解密的密文: ")

    # 解密密文
    decrypted_text = decrypt_message(private_key_pem, encrypted_text)

    # 输出解密后的明文
    print("解密后的明文:")
    print(decrypted_text)

4. 打包为 .exe 文件

我们可以使用 PyInstaller 库将 Python 脚本打包为可执行的 .exe 文件。首先,确保你已经安装了 PyInstaller

pip install pyinstaller
打包 A 端软件

在命令行中,进入包含 a_end.py 文件的目录,然后运行以下命令:

pyinstaller --onefile a_end.py

打包完成后,在 dist 目录下会生成 a_end.exe 文件。

打包 B 端软件

同样,在命令行中进入包含 b_end.py 文件的目录,运行以下命令:

pyinstaller --onefile b_end.py

打包完成后,在 dist 目录下会生成 b_end.exe 文件。

5. 使用说明

  • B 端软件(b_end.exe:运行该软件会生成密钥对,将私钥保存为 private_key.pem,公钥保存为 public_key.pem。然后提示你输入要解密的密文,输入后会输出解密后的明文。
  • A 端软件(a_end.exe:运行该软件前,需要确保 public_key.pem 文件存在。运行后,输入要加密的明文,软件会输出加密后的密文,该密文可以复制并提供给 B 端进行解密。

通过以上步骤,你就可以实现一个简单的非对称加密的 A 端和 B 端软件,并将其打包为可执行的 .exe 文件。

相关文章:

  • Python 实现机器学习的 房价预测回归项目
  • 【算法学习之路】8.栈和队列
  • Flutter中使用NetworkImage加载网络图片缓存问题学习实践
  • HTML 学习路线图
  • !C++中的位运算
  • 大语言模型-全文
  • linux应用:静态文件、 inode(i 节点)、vnode、流
  • Python 网络爬虫教程:从入门到高级的全面指南
  • 自然语言处理:无监督朴素贝叶斯模型
  • Spring Security 官网文档学习
  • GIS工具箱选择指南:四款软件满足多样化空间分析需求
  • Driver com.p6spy.engine.spy.P6SpyDriver claims to not accept jdbcUrl报错
  • 自动化App测试Appium(真机测试)准备
  • 基于SpringBoot+Vue的校园跑腿原生小程序
  • 用 Vue 3.5 TypeScript 做了一个日期选择器(改进版)
  • git subtree管理的仓库怎么删除子仓库
  • 队列概念和结构
  • Java 大视界 -- Java 大数据在智慧农业农产品质量追溯与品牌建设中的应用(124)
  • Spring Boot 解析 LocalDateTime 失败?Uniapp 传输时间变 1970 的原因与解决方案
  • PostgreSQL 18新特性之虚拟生成列
  • 习近平同俄罗斯总统普京会谈
  • 圆桌丨中俄权威专家详解:两国携手维护战后国际秩序,捍卫国际公平正义
  • 太原一高中生指出博物馆多件藏品标识不当,馆方已邀请他和专家共同探讨
  • 习近平离京赴莫斯科对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典
  • 又一日军“慰安妇”制度受害者去世,大陆登记在册幸存者仅剩7人
  • 外交部发言人就当前印巴局势答记者问