资讯动态

记录第一次用 ChatGPT 实现 RSA 加密解密编程:从密钥生成到加解验全流程

发布时间:2026/10/17 12:53:50 来源:尧图企业网站定制
1. 第一次让 ChatGPT 写 RSA 加解密我踩了哪些坑RSA 加密解密编程这件事听起来像是密码学课上的作业但真落到项目里无非就是四个动作生成一对密钥、拿公钥加密、拿私钥解密、最后核对解密出来的明文和原文是否一致。我第一次用 ChatGPT 辅助写这套流程时最大的感受不是AI 真强而是它给的代码能跑但你不核对结果就敢上线迟早出事。这篇记录面向的是刚接触非对称加密、想用 Python 快速复现一套可用 RSA 流程的读者。你不需要密码学背景只要会装 Python 包、会跑脚本就行。我会把密钥对生成、明文加密、密文解密、结果验证四个环节拆开每段代码都能直接复制运行并且告诉你每一步该看什么输出、哪里最容易翻车。需要先明确一个概念RSA 是非对称加密公钥加密的内容只有私钥能解私钥签名的内容公钥能验。很多人第一次写会把它和 AES 搞混以为一把钥匙加解密通用。ChatGPT 生成的代码里如果没写清楚 padding填充模式你可能会遇到同样的明文每次密文都不一样或者解密报错这都属于正常现象后面排障章节会专门讲。另外我在实际调试时发现AI 给的示例经常省略异常处理和编码细节比如直接把 bytes 当字符串打印或者用默认的 PKCS1 填充却不说明。这些省略在 demo 里没事一旦你拿真实数据去跑就会暴露。所以这篇的重点不是让 AI 生成代码而是生成之后怎么逐项验证它真的对。如果你手头还没有稳定的模型调用入口后面第二节我会给出一个可用的配置方式把 Base URL、Key、Model ID 三件套配好就能在本地脚本里直接调模型帮你补全或解释代码。整个流程我实测下来从零到跑通大约二十分钟其中一半时间花在核对输出上——这个时间不能省。2. 用 TaoToken 配好模型入口让 ChatGPT 帮你补全 RSA 代码写 RSA 代码的过程中你大概率会遇到两类问题一是忘了某个 API 的参数顺序二是报错信息看不懂。这时候让模型帮你解释或补全比翻文档快得多。但前提是你得有一个能稳定调用的入口。我目前用的是 TaoToken 的 API 服务官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 注意这个地址后面不加任何 UTM 参数。配置的核心就三样Base URL、API Key、Model ID。Base URL 填https://taotoken.net/apiKey 去控制台生成Model ID 按你需要的模型填。这三件套在 Cline、Cursor、Codex 这类工具里是通用的配好之后你在编辑器里就能直接问这段 RSA 解密为什么报 padding error。如果你用的是 Claude Code 这类命令行工具配置方式略有不同需要在 settings 里指定 base_url 和 api_key。具体路径可以参考接入文档文档里对每种客户端的字段名都有说明。我建议第一次配置时把 Key 单独存到环境变量里不要硬编码在脚本中否则你哪天把代码传到公开仓库就麻烦了。配好之后你可以这样验证入口是否通写一个最小的 Python 脚本用 requests 调一次模型对话接口看返回里有没有正常的 choices 字段。如果返回 401说明 Key 不对如果返回 local proxy failed说明你的网络层配置有问题不是 Key 的事。这一步验证通过再让模型帮你写 RSA 代码心里才有底。需要提醒的是模型生成的加密代码不能直接用于生产环境的密钥管理。它可以帮你写加解密逻辑、解释报错、补全测试用例但私钥的存储、轮换、权限控制这些必须你自己按安全规范来。我见过有人把 AI 生成的 demo 私钥直接写进配置文件提交了这是典型的反面教材。配置完成后你可以让模型做一件很有用的事把你写好的 RSA 脚本贴给它让它逐行解释每个参数的含义尤其是 padding 和 hash 算法这两处。这样你不仅跑通了代码还真正理解了每一步在干什么。3. 可复制的 RSA 加解密完整配置与代码这一节是全文的核心我给出完整的 Python 实现覆盖密钥对生成、加密、解密、验证四个环节。依赖只有一个库cryptography。安装命令pip install cryptography如果你用的是虚拟环境先激活再装。装完之后新建一个rsa_demo.py把下面的代码整段复制进去。我按功能拆成四个函数每个函数都能单独调用方便你逐步验证。from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import hashes, serialization import base64 # 1. 生成密钥对 def generate_keypair(): private_key rsa.generate_private_key( public_exponent65537, key_size2048, ) public_key private_key.public_key() return private_key, public_key # 2. 公钥加密 def encrypt(public_key, plaintext: str) - str: ciphertext public_key.encrypt( plaintext.encode(utf-8), padding.OAEP( mgfpadding.MGF1(algorithmhashes.SHA256()), algorithmhashes.SHA256(), labelNone, ), ) return base64.b64encode(ciphertext).decode(utf-8) # 3. 私钥解密 def decrypt(private_key, ciphertext_b64: str) - str: ciphertext base64.b64decode(ciphertext_b64) plaintext private_key.decrypt( ciphertext, padding.OAEP( mgfpadding.MGF1(algorithmhashes.SHA256()), algorithmhashes.SHA256(), labelNone, ), ) return plaintext.decode(utf-8) # 4. 主流程与结果验证 if __name__ __main__: private_key, public_key generate_keypair() message hello rsa 2024 cipher_b64 encrypt(public_key, message) print(密文(Base64):, cipher_b64) recovered decrypt(private_key, cipher_b64) print(解密结果:, recovered) print(验证一致:, recovered message)运行命令python rsa_demo.py预期输出类似密文(Base64): Tk9UX1JFQUxfQ0lQSEVSVEVYVF9IRVJF... 解密结果: hello rsa 2024 验证一致: True这里有几个关键参数必须说清楚。key_size2048是当前推荐的最小值低于 2048 在很多安全扫描里会直接告警。public_exponent65537是标准选择不要改成 3。填充模式用的是OAEP配合SHA256这是目前推荐的组合如果你看到别人的代码用PKCS1v15那是旧写法新项目不建议用。如果你需要把密钥持久化到文件可以用下面的序列化代码注意私钥文件权限要设成 600# 保存私钥PEM 格式无密码保护仅演示 with open(private_key.pem, wb) as f: f.write(private_key.private_bytes( encodingserialization.Encoding.PEM, formatserialization.PrivateFormat.PKCS8, encryption_algorithmserialization.NoEncryption(), )) # 保存公钥 with open(public_key.pem, wb) as f: f.write(public_key.public_bytes( encodingserialization.Encoding.PEM, formatserialization.PublicFormat.SubjectPublicKeyInfo, ))加载时用serialization.load_pem_private_key和load_pem_public_key即可。这套代码我实测下来在 Python 3.9 到 3.12 上都能跑通没有版本兼容问题。4. 验证请求与成功结果逐项核对加解密是否一致代码跑起来只是第一步真正要确认的是结果对不对。我习惯用三个检查点来验证一套 RSA 流程是否可靠你可以照着做。第一个检查点是密文长度。2048 位密钥配合 OAEP-SHA256 填充加密后的密文固定是 256 字节Base64 编码后是 344 个字符。如果你打印出来的密文长度明显不对比如只有几十个字符那说明加密根本没生效可能你直接把明文当密文输出了。可以在脚本里加一行print(len(cipher_b64))正常应该是 344。第二个检查点是解密还原。把解密结果和原始明文做比较输出True才算通过。这里有个坑如果你的明文包含中文编码方式必须统一用 UTF-8否则解密出来会是乱码比较结果自然是False。我建议测试时先用纯英文确认流程通了再换中文。第三个检查点是篡改检测。把密文随便改一个字符再拿去解密应该直接抛异常而不是返回错误明文。这是 OAEP 填充的安全特性能防止攻击者伪造密文。你可以这样测tampered cipher_b64[:-4] AAAA try: decrypt(private_key, tampered) print(异常篡改后竟然解密成功) except Exception as e: print(篡改检测正常抛出:, type(e).__name__)预期输出是篡改检测正常抛出: ValueError。如果篡改后还能解密出东西说明你的填充模式有问题赶紧换回 OAEP。第四个检查点是跨密钥验证。生成两对密钥用 A 的公钥加密拿 B 的私钥去解必须失败。这一步能确认你的密钥没有在代码里被意外复用。我见过有人把密钥生成写在函数外面当全局变量结果多次调用时用的还是同一对测试就失去意义了。把这四个检查点都跑一遍输出全部符合预期你才算真正拥有了一套可用的 RSA 流程。整个过程不需要联网纯本地就能完成这也是为什么我建议先用本地脚本验证逻辑再去接模型帮你优化代码。5. 常见报错排查401、padding error、解密乱码怎么处理这一节列几个我实际遇到过的报错以及对应的排查方向。你照着对照基本能覆盖 90% 的初次踩坑。报错一401 Unauthorized。这个通常出现在你调模型接口的时候不是 RSA 代码本身的问题。原因一般是 API Key 填错、Key 过期、或者 Base URL 写成了带路径的地址。检查方法确认 Base URL 是https://taotoken.net/api不要在后面加/v1之类的后缀Key 从控制台重新复制一次注意别把首尾空格带进去。如果用的是环境变量打印一下确认读取到了。报错二local proxy failed。这个报错说明请求根本没发出去卡在了本地网络层。排查顺序是先确认你的脚本能正常访问外网再确认没有多余的代理配置干扰。如果你在 settings 里配了 proxy 字段先注释掉试试。这个报错和 Key 无关别浪费时间换 Key。报错三ValueError: Decryption failed。这是 RSA 解密最常见的报错原因有三个可能密文被篡改、填充模式不匹配、或者你用的不是同一对密钥。排查方法先确认加密和解密用的是同一对公私钥再确认两边的 padding 参数完全一致OAEP 的 hash 算法和 MGF 都要对上最后检查密文在传输过程中有没有被截断Base64 解码前先打印长度。报错四解密出来是乱码。这通常是编码问题。加密时用encode(utf-8)解密后必须用decode(utf-8)两边要对称。如果你加密的是二进制数据那就不能走字符串这条路得直接处理 bytes。报错五reading choices 相关错误。这个出现在解析模型返回时说明返回结构和你预期的不一样。可能是接口返回了错误信息而不是正常结果先打印完整 response 看看。如果是 OAuth 相关的报错检查你的认证方式是不是配错了有些客户端需要走 OAuth 流程而不是直接填 Key。排查的核心思路是先定位是网络层、认证层还是代码层的问题。401 和 proxy failed 属于前两层padding error 和乱码属于代码层。分层之后排查范围就小很多了。6. 把 RSA 流程接进你的项目下一步怎么做跑通 demo 之后你可能会想把它用到实际项目里。我的建议是先别急着改生产代码而是做三件事。第一件把密钥管理独立出来。demo 里密钥是运行时生成的生产环境必须用固定的密钥对并且私钥要加密存储。你可以用 KMS 或者至少用密码保护的 PEM 文件加载时输入密码。第二件给加解密函数加上异常处理和日志记录每次操作的耗时和结果状态方便出问题时回溯。第三件写单元测试把前面说的四个检查点固化成测试用例每次改代码都跑一遍。如果你在接入过程中需要查具体的字段配置可以看接入文档想先试试模型对话能力可以直接用模型对话页面如果是长期做编码和 Agent 相关的工作Coding Plan 会更合适。API Key 在控制台的 API Keys 页面生成生成后记得立刻复制保存页面刷新后就看不到了。最后说一个我自己的习惯每次让模型生成加密相关代码我都会把生成的代码和标准库文档对照一遍重点看 padding 和 hash 算法这两处。AI 给的代码大概率能跑但能跑和安全是两回事。RSA 这套东西参数错一个安全性可能就差一个量级。核对输出、验证篡改检测、确认密钥不复用这三步做完你才算真正把这套流程握在手里。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑