Python实现RSA非对称加密、解密与数字签名指南

沈亦白
沈亦白
发布时间:2026-10-12| 2人浏览过
原创

本文详解Python环境下实现RSA非对称加密的核心流程。涵盖公私钥生成、密钥文件读写、明文加解密操作及数字签名与验签功能。通过标准代码示例与安全参数配置,帮助开发者快速掌握安全通信与数据防篡改的关键实现方法。

RSA非对称加密实现环境准备与原理概述

RSA非对称加密采用一对数学关联的密钥(公钥与私钥)。公钥用于数据加密或签名验证,私钥用于数据解密或数字签名生成。在Python中,可通过第三方加密库快速调用底层算法,实现传输层安全保护与身份认证。以下为具体操作步骤。

第1步:初始化加密环境与密钥对生成

目的:创建用于加解密操作的公私钥对。入口:Python脚本首行引入相关模块并调用生成函数。动作:指定密钥长度(推荐2048位及以上以符合现代安全标准)并实例化随机数发生器。完成状态:控制台返回包含模数n、指数e/d及素数p/q的公钥与私钥对象。

# -*- coding: utf-8 -*-
import Crypto.PublicKey.RSA
import Crypto.Random

# 生成2048位密钥对
x = Crypto.PublicKey.RSA.generate(2048)
print("私钥生成完毕", "公钥生成完毕")
# 实际开发建议直接调用 x.exportKey() 获取PEM字符串用于落盘

第2步:执行公钥加密与私钥解密操作

目的:验证数据流向的正确性,确保仅持有私钥方可读取密文。入口:加载已生成的密钥文件并使用PKCS1_v1_5密码学模式。动作:将原始字节转为加密流后还原。注意解密时需传入备用随机值占位符以满足API规范。

import Crypto.Cipher.PKCS1_v1_5
import Crypto.Random

# 假设已准备好公钥(b.pem)与私钥(a.pem)文件
with open("b.pem", "rb") as f_pub:
    cipher_public = Crypto.Cipher.PKCS1_v1_5.new(Crypto.PublicKey.RSA.importKey(f_pub.read()))
    msg_plain = b"hello_rsa_data"
    cipher_text = cipher_public.encrypt(msg_plain)  # 公钥加密
    print("加密成功,密文长度:", len(cipher_text))

with open("a.pem", "rb") as f_priv:
    cipher_private = Crypto.Cipher.PKCS1_v1_5.new(Crypto.PublicKey.RSA.importKey(f_priv.read()))
    # 若私钥带密码需追加 password='xxx' 参数
    recovered_plain = cipher_private.decrypt(cipher_text, Crypto.Random.new().read)
    print("解密还原:", recovered_plain.decode('utf-8'))
    assert recovered_plain == msg_plain, "加解密结果不一致"

第3步:完成密钥持久化存储与跨平台加载

目的:将内存中的密钥对象保存为独立文件,便于服务重启或分布式架构共享。入口:利用文件写入I/O流与对应的导出方法。动作:分别导出私钥(含私有参数)与公钥(仅含公开参数)至不同路径。后续可通过加载方法重新构建密钥对象。

# 保存为常用PEM格式
priv_key = x.exportKey("PEM")
pub_key = x.publickey().exportKey()

with open("private.pem", "wb") as pk_file:
    pk_file.write(priv_key)
with open("public.pem", "wb") as pu_file:
    pu_file.write(pub_key)

# 验证读取与重建
with open("public.pem", "rb") as f:
    loaded_pub = Crypto.PublicKey.RSA.importKey(f.read())
    print("公钥加载校验完成,类型:", type(loaded_pub).__name__)

# 如需导出DER二进制证书格式
# der_cert = x.exportKey("DER")
# with open("cert.der", "wb") as df:
#     df.write(der_cert)

第4步:添加数据签名与完整性验签流程

目的:防止数据被第三方篡改,并通过签名证明数据来源可信。入口:调用Signature模块并绑定哈希算法。动作:私钥对消息摘要进行签名,接收方使用公钥比对摘要值。参数提醒:强烈建议使用SHA-256替代过时的SHA-1,以提升抗碰撞能力。

import Crypto.Signature.PKCS1_v1_5
import Crypto.Hash

# 私钥签名生成
msg_hash = Crypto.Hash.SHA256.new()
msg_hash.update(b"hello_rsa_data")
signer = Crypto.Signature.PKCS1_v1_5.new(Crypto.PublicKey.RSA.importKey(open("private.pem", "rb").read()))
signature = signer.sign(msg_hash)
print("签名生成完成,Hex前缀:", signature.hex()[:20])

# 公钥验签确认
verifier = Crypto.Signature.PKCS1_v1_5.new(Crypto.PublicKey.RSA.importKey(open("public.pem", "rb").read()))
verify_hash = Crypto.Hash.SHA256.new()
verify_hash.update(b"hello_rsa_data")
is_valid = verifier.verify(verify_hash, signature)
print("验签结果:", is_valid)  # 预期输出 True

关键参数说明与异常排查指南

密钥长度选择:512位或1024位已无法满足现代计算机算力下的安全要求,建议在生成参数时固定设置为2048或4096。

文件格式兼容:部分老旧系统可能依赖DER格式证书而非PEM文本块。可通过x.exportKey("DER")导出二进制格式,并在解析时使用字节流直接载入。

常见报错处理:

  • ValueError: Incorrect padding:通常由密文Base64编码截断或文件读写字节数不匹配引起。请检查是否使用了文本模式代替二进制模式,确保文件流完整。
  • Decryption failed:使用错误的私钥尝试解密他人公钥加密的数据,或私钥版本过旧缺失必要参数。核对密钥来源与生成批次即可恢复。

以上就是Python RSA加密解密与数字签名实现的详细内容,更多关于Python数据安全处理的技术资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。