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
相关产品推荐
相关产品推荐

