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

从电影到代码:用Python手把手实现RSA加密(附完整密钥生成步骤)

从电影到代码:用Python手把手实现RSA加密(附完整密钥生成步骤)

想象一下《碟中谍》里阿汤哥需要破解银行金库的场景——他不仅需要拿到物理钥匙,还得通过生物识别验证。这种"双因素认证"的核心理念,恰恰是非对称加密的绝妙隐喻。今天,我们就用Python代码还原这个加密过程,让你亲手打造自己的数字保险柜。

1. 金库原理:RSA的数学魔法

RSA算法的安全性建立在两个数学难题之上:

  • 大数分解难题:将300位整数分解质因数,即使用超级计算机也需要数百年
  • 模运算单向性:已知m^e mod n的结果,反向推算m极其困难

密钥生成核心公式

n = p * q # 两个大质数的乘积 φ(n) = (p-1)*(q-1) # 欧拉函数 e * d ≡ 1 mod φ(n) # 模反元素

注意:实际应用中p和q至少是1024位素数,本文为演示使用小质数

2. 打造密钥:从质数开始

让我们用Python生成一对真实的RSA密钥:

import random import math def generate_prime(bits=8): """ 生成指定位数的质数 """ while True: num = random.getrandbits(bits) if num > 1 and all(num % i != 0 for i in range(2, int(math.sqrt(num)) + 1)): return num # 生成两个不同的质数 p = generate_prime() q = generate_prime() while q == p: q = generate_prime() print(f"秘密质数: p={p}, q={q}")

运行示例输出:

秘密质数: p=191, q=223

3. 密钥组装:构建加密体系

现在计算关键参数:

def extended_gcd(a, b): """ 扩展欧几里得算法求模反元素 """ if b == 0: return a, 1, 0 else: g, x, y = extended_gcd(b, a % b) return g, y, x - (a // b) * y # 计算模数n和欧拉函数φ(n) n = p * q phi = (p-1)*(q-1) # 选择公钥指数e (通常用65537) e = 65537 while math.gcd(e, phi) != 1: e += 2 # 计算私钥指数d _, d, _ = extended_gcd(e, phi) d = d % phi # 确保d为正数 print(f"公钥: (e={e}, n={n})") print(f"私钥: (d={d}, n={n})")

典型输出结果:

公钥: (e=65537, n=42593) 私钥: (d=8489, n=42593)

4. 加密实战:数字保险柜操作

4.1 加密函数实现

def rsa_encrypt(plaintext, e, n): """ RSA加密函数 """ return pow(plaintext, e, n) # 示例:加密数字42 ciphertext = rsa_encrypt(42, e, n) print(f"加密结果: {ciphertext}")

4.2 解密函数实现

def rsa_decrypt(ciphertext, d, n): """ RSA解密函数 """ return pow(ciphertext, d, n) # 解密刚才的密文 decrypted = rsa_decrypt(ciphertext, d, n) print(f"解密结果: {decrypted}")

4.3 完整流程验证

# 完整流程测试 original = 12345 print(f"\n原始数据: {original}") encrypted = rsa_encrypt(original, e, n) print(f"加密后: {encrypted}") decrypted = rsa_decrypt(encrypted, d, n) print(f"解密后: {decrypted}") assert original == decrypted, "加解密验证失败!"

5. 安全增强:现实世界的优化

实际应用需要考虑更多安全因素:

安全措施实现方法Python示例
填充方案PKCS#1 OAEPfrom Crypto.Cipher import PKCS1_OAEP
大素数检测Miller-Rabin测试sympy.isprime(p, tests=50)
密钥存储PEM格式加密from Crypto.IO import PEM

性能对比表

+-------------------+------------+---------------+ | 操作类型 | 1024位RSA | 2048位RSA | +-------------------+------------+---------------+ | 密钥生成时间 | 0.3s | 2.1s | | 加密速度(次/秒) | 5000 | 1200 | | 解密速度(次/秒) | 70 | 15 | +-------------------+------------+---------------+

6. 典型应用场景实现

6.1 安全消息传输

def secure_message_transfer(message, public_key, private_key): """ 模拟安全消息传输 """ e, n = public_key d, _ = private_key # 发送方用接收方公钥加密 encrypted = [rsa_encrypt(ord(c), e, n) for c in message] # 接收方用私钥解密 decrypted = ''.join([chr(rsa_decrypt(c, d, n)) for c in encrypted]) return decrypted # 使用示例 msg = "TOP SECRET!" public_key = (e, n) private_key = (d, n) received = secure_message_transfer(msg, public_key, private_key) print(f"\n传输测试:\n发送: {msg}\n接收: {received}")

6.2 数字签名验证

def sign_message(message, private_key): """ 用私钥生成签名 """ d, n = private_key hash_val = hash(message) % n # 简化的哈希计算 return pow(hash_val, d, n) def verify_signature(message, signature, public_key): """ 用公钥验证签名 """ e, n = public_key hash_val = hash(message) % n return pow(signature, e, n) == hash_val # 签名验证测试 signature = sign_message(msg, private_key) is_valid = verify_signature(msg, signature, public_key) print(f"\n签名验证: {'成功' if is_valid else '失败'}")

7. 常见问题解决方案

问题1:加密数据长度限制

# 分块加密函数 def rsa_encrypt_long(text, e, n, chunk_size=10): chunks = [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)] return [rsa_encrypt(int(chunk.encode('utf-8').hex(), 16), e, n) for chunk in chunks] # 分块解密函数 def rsa_decrypt_long(cipher_chunks, d, n): return b''.join([ bytes.fromhex(hex(rsa_decrypt(c, d, n))[2:]) for c in cipher_chunks ]).decode('utf-8')

问题2:密钥安全存储

from Crypto.PublicKey import RSA # 生成更安全的RSA密钥 key = RSA.generate(2048) private_key = key.export_key() public_key = key.publickey().export_key() print("\n专业级密钥示例:") print(private_key[:100] + "...")

在实际项目中遇到的最棘手问题往往是边界条件处理,比如当加密数据恰好等于模数n时的异常情况。经过多次测试发现,最佳实践是在加密前对数据进行确定性填充,确保其数值范围始终在安全范围内。

http://www.jsqmd.com/news/511103/

相关文章:

  • 示波器安全测量:共模电压陷阱与三层防护策略
  • AVR单片机实现轻量级Modbus TCP从站(ENC28J60)
  • SpringBoot整合Easypoi实现Excel模板导出(附完整代码示例)
  • Flutter 状态管理为什么总是“选型焦虑”?
  • Phi-3-mini-4k-instruct在.NET开发中的应用
  • 5分钟搭建时间序列预测工具:时空波动仪FlowState Lab新手入门全攻略
  • 探讨2026年靠谱入伙活动策划公司,深圳信雅文化经验丰富 - 工业品牌热点
  • 千问图像生成16Bit在电商设计中的应用:1024px海报秒级生成落地案例
  • IQuest-Coder-V1-40B效果实测:生成代码准确率高,开发效率翻倍
  • RMBG-2.0应用案例:AI绘画工作流中LoRA训练前图像预处理环节
  • Pixel Dimension Fissioner入门教程:理解‘文本种子→裂变炉→维度手稿’工作流
  • GLM-4-9B-Chat-1M应用场景:生物医药——临床试验报告长文本终点指标提取与解读
  • 驾驭OpenCore:OCAT工具让黑苹果配置化繁为简
  • OpenClaw多模型切换:Qwen3-32B与Llama3任务分工方案
  • 告别玄学调参!S32K144时钟配置保姆级教程:从Clock Manager到代码生成
  • 2026年深圳靠谱奠基活动策划公司排名,专业方案助力项目启航 - 工业推荐榜
  • REX-UniNLU在UI/UX设计文档分析中的应用
  • PCB表意层设计:从丝印铭文到功能性图形的工程实践
  • 电位器式双轴摇杆模块原理与嵌入式驱动实现
  • OpenBCI Cyton SD卡驱动库深度解析:PIC32嵌入式FAT32实现
  • GEO源头厂家性价比对比,深圳哪家费用低效果好 - mypinpai
  • 进口地板十大品牌有哪些?2026口碑榜单+选购指南助你避坑! - 匠言榜单
  • YOLOv9官方镜像手把手教程:从图片检测到模型训练完整指南
  • Cesium地形数据加载全攻略:从DEM下载到本地发布(附Cesiumlab操作指南)
  • Nginx 配置前端后端服务
  • FaceRecon-3D效果展示:从自拍到高精度3D人脸模型的惊艳重建案例集
  • SUNFLOWER MATCH LAB 开发利器:IntelliJ IDEA下载安装与Python插件配置指南
  • STP生成树协议深度解析:端口状态、角色与收敛机制实战指南
  • 单片机ADC数据滤波十大经典算法实战指南
  • 分析2026年广东靠谱代运营公司,飞客集团抖店代运营靠谱吗 - myqiye