You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python-RSA加密正常但解密失败问题求助

解决客户端RSA解密失败(rsa.pkcs1.DecryptionError)的方案

一、先修复单独测试代码的明显错误

你的测试代码存在致命问题:加密时直接使用了原始的公钥字符串,而非rsa.PublicKey实例。rsa.encrypt方法要求传入合法的密钥对象,不能直接传递自定义格式的字符串密钥。

修正后的测试代码:

# Public key saved in ini file as this format "PublicKey(n, e)"
# Private key saved in ini file as this format "PrivateKey(n, e, d, p, q)"

# 正确构建公钥对象
key_string = public_key.strip("PublicKey(").strip(")")
n, e = key_string.split(", ", 1)
public_key_obj = rsa.PublicKey(int(n), int(e))
# 使用公钥对象执行加密
value = rsa.encrypt(b"Hello", public_key_obj)

# 私钥部分逻辑正确,保持不变
key_string = self.private_key.strip("PrivateKey(").strip(")")
n, e, d, p, q = key_string.split(", ", 4)
private_key = rsa.PrivateKey(int(n), int(e), int(d), int(p), int(q))
decrypted = rsa.decrypt(value, private_key)

二、排查原P2P应用中的潜在问题

1. 公钥传输与解析一致性问题

  • 客户端给服务器发送公钥时,要么传输密钥对象的标准序列化内容,要么确保服务器端和客户端用完全一致的逻辑解析自定义格式的密钥字符串,保证拆分出的n、e数值完全匹配。
  • 检查传输编码:客户端发送时用public_key_str.encode('utf-8'),服务器接收后必须用recv_data.decode('utf-8')还原,避免字符乱码或丢失。

2. 数据拆分的长度匹配问题

客户端拆分接收数据的代码:

recv = {"key": data[:256], "nonce": data[256:272], "data": data[272:]}

这里硬编码256字节作为加密密钥的长度,仅适用于2048位的RSA密钥。如果你的密钥是其他长度(比如1024位对应128字节),拆分后拿到的加密密钥会不完整或错误,直接引发解密失败。

  • 确认服务器端使用的RSA密钥长度,调整客户端拆分的加密密钥长度;更稳妥的方式是传输时先发送各段数据的长度,再发送对应内容,避免硬编码长度的问题。

3. RSA加密/解密的参数一致性

  • 确保客户端和服务器使用的RSA填充方式一致:rsa库默认用PKCS#1 v1.5填充,若某一端修改为OAEP等其他填充方式,会导致解密失败。
  • 验证服务器端加密AES密钥时,确实使用了当前客户端的公钥对象,而非其他节点的密钥。

三、通用排查技巧

  • 打印关键中间值:对比客户端本地与服务器端解析后的公钥n、e数值是否完全一致;打印加密后AES密钥的字节长度,确认客户端拆分后长度是否匹配。
  • 本地模拟流程:用客户端的公钥在本地模拟服务器的加密操作,拿到加密后的密钥,再用客户端私钥解密,逐步缩小问题范围。

内容的提问来源于stack exchange,提问作者Chelsea-Fox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:57:30