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

