Python实现RSA私钥加密公钥解密的技术问题求助
反向RSA加密填充实例错误修复方案
核心问题排查点
1. 密钥配对与格式
先确认服务器私钥和客户端公钥是配对生成的,而且格式没毛病:
- 私钥必须是标准PEM格式,开头
-----BEGIN RSA PRIVATE KEY-----、结尾-----END RSA PRIVATE KEY-----,中间的base64内容不能缺行少字。 - 客户端公钥对应
-----BEGIN PUBLIC KEY-----开头的格式,别搞混成其他类型的密钥。
2. 填充模式必须统一
反向RSA(私钥加密、公钥解密)大多用PKCS1_v1_5填充,你得确保Python服务器和C++客户端用的是同一种。给你个正确的Python实现代码:
from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 import base64 # 加载本地私钥文件 private_key = RSA.import_key(open("server_private.pem").read()) cipher = PKCS1_v1_5.new(private_key) # 要加密的有效消息(必须转成字节串) valid_msg = b"LICENSE_VALID_FOR_THIS_MACHINE" # 加密后做base64编码,转成字符串返回给客户端 encrypted_bytes = cipher.encrypt(valid_msg) response_data = base64.b64encode(encrypted_bytes).decode('utf-8')
重点:客户端解密时必须用PKCS1_v1_5,别用OAEP或者其他填充,不然肯定报错。
3. Base64编码要标准
别用url-safe的base64变种,除非客户端也同步处理。服务器直接用标准base64编码加密后的字节,别额外加转义、截断之类的操作,否则客户端解码会失败。
4. 消息长度不能超限制
RSA加密有长度上限:密钥长度(字节)减11(PKCS1_v1_5的填充开销)。比如2048位密钥,最大能加密的消息长度是2048/8 -11 = 245字节。消息太长的话,加密出来的内容本身就有问题,base64解码自然报错。
调试技巧
- 本地先闭环验证:用服务器私钥加密,再用配对的公钥解密,看能不能正常得到原消息:
# 模拟客户端解密流程 public_key = RSA.import_key(open("client_public.pem").read()) client_cipher = PKCS1_v1_5.new(public_key) decrypted_msg = client_cipher.decrypt(base64.b64decode(response_data), None) print(decrypted_msg.decode('utf-8')) # 输出原消息就说明加密流程没问题
- 抓包看服务器返回的响应内容,确认返回的base64字符串完整,没被HTTP响应头或者其他逻辑截断、加了多余字符。
内容的提问来源于stack exchange,提问作者charged900
相关产品推荐
相关产品推荐

