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

使用BigInteger实现RSA加密解密:大数处理失效问题求助

问题分析与解决:RSA加密大数字时解密异常

咱们先拆解你遇到的问题:当明文messageToInt小于n=3233时(比如1500),解密结果完全正确;但当明文大于等于n时(比如15000),解密结果就和原明文对不上了。这其实不是BigInteger.ModPow的bug,而是你忽略了RSA的核心规则。

关键原因:RSA明文必须小于模数n

RSA加密的前提是明文m必须满足 0 ≤ m < n。因为加密过程本质是计算 c = m^e mod n,如果m >= n,那么实际参与加密的是m mod n的值(也就是原明文除以n的余数),而非原明文本身。解密后得到的自然也是这个余数,而非你输入的原大数字。

拿你的例子算一下就清楚了:

  • n=3233,15000 ÷ 3233 = 4余2068,也就是15000 mod 3233 = 2068
  • 你代码里实际加密的是2068,解密后得到2068完全符合RSA的计算逻辑,这不是异常,是规则范围内的正常结果。

解决办法

如果需要加密大于等于n的数字,有两个常用方案:

  • 分段加密:把大数字拆分成多个小于n的块,分别加密每个块;解密时再把每个块的结果拼接还原成原数字。
  • 使用更大的模数n:重新生成一对密钥对,让n的数值远大于你要加密的最大明文。比如如果你的明文最大是105,就生成n大于105的密钥对。

验证你的代码正确性

咱们用符合规则的明文测试你的代码,比如messageToInt=3000(小于3233):

BigInteger messageToInt = 3000;
BigInteger enc = BigInteger.ModPow(messageToInt, 17, 3233);
BigInteger dec = BigInteger.ModPow(enc, 413, 3233);
Console.WriteLine(dec); // 输出3000,完全正确

再测试messageToInt=3233(等于n),它的模n结果是0,加密解密后会得到0,这也完全符合RSA的计算规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:08:15