我正在研究缩小的RSA encryption
和decryption
方法,一切似乎都运行良好,直到我尝试取一个数的模数。模数运算符未返回预期结果。
for(int k = 0; k < sA.length; k++){
int value = Integer.parseInt(sA[k]);
System.out.println("value : " + value);
double mToE = Math.pow(value,e);
System.out.println("mToE: " + mToE);
double c = mToE % n;
System.out.println("C: " + c);
sA
是一个包含值{06707708, 30670320, 50050050}
。
mToE
代表M(在这种情况下是sA中的每个字符串),增加到e(13)
的幂。
C = M^e mod n
其中n作为参数输入。
这些特定行输出:
value : 6707708
mToE: 5.56498415666044E88
C: 5.2630797E7
0
value : 30670320
mToE: 2.1248975415575414E97
C: 8.973537E7
1
value : 50050050
mToE: 1.2366838911816623E100
C: 3.4150233E7
2
例如,c的第一个值应为:
c: 3.2059734E7
或32059734
获得此结果的原因是什么?
提前感谢您的所有建议。
答案 0 :(得分:3)
double
类型具有很多精度,53位,但这还不足以在您看到的非常高的值下将值精确地存储为单位。 mToE
的值是最接近真实计算值的double
值。
使用the Math.ulp
method (unit in last place),我们可以确定double
幅度为5.56498415666044E88
的精度。
System.out.println(Math.ulp(mToE));
此输出
7.067388259113537E72
因此,你的价值很可能在72位数之内。这当然会完全弄乱c
的值,它取自mod %
操作。
要获得必要的精度,您需要使用BigInteger
s。此外,BigInteger
还有专门为您的目的而构建的modPow
method。