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

Python pow函数处理大数返回值异常,RSA场景求助

RSA解密大数返回值不符的原因及解决办法

问题核心

你遇到的问题并非pow函数计算错误,而是对RSA的明文输入要求理解有误:RSA加密的明文必须满足 0 ≤ m < n。当输入的明文m大于等于模数n时,解密结果会是m mod n而非原数,这是模运算的固有性质决定的:
$$(m^e \mod n)^d \mod n = m \mod n$$

验证你的案例

你的模数n = 10002668571558232229090995822943,而测试用的大数:
1691472818829646266231812146685797
计算它对n取模的结果:

m = 1691472818829646266231812146685797
n = 10002668571558232229090995822943
print(m % n)

输出恰好是你得到的解密结果:1021830236305019515433852608430。这说明pow函数的计算完全符合预期,只是你错误地期望返回原大数,而非它在模n下的等价值。

而小数42小于n,所以42 mod n = 42,解密后自然返回原数。

解决方案

在加密前先对明文取模n,确保输入满足RSA的明文要求:

n=10002668571558232229090995822943
e=65537
d=3132501789258907532830941079073

m = 1691472818829646266231812146685797
# 先对明文取模n
cipher = pow(m % n, e, n)
print(cipher)
plain = pow(cipher, d, n)
print(plain)

此时输出的plain会等于m mod n,这是RSA在该场景下的正确结果。如果需要处理大于n的明文,应该采用分段加密(将长明文拆分为多个小于n的块),这是RSA处理大消息的标准做法。

内容的提问来源于stack exchange,提问作者Quibbs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:40:23