模数不为非负输入返回正确的值

时间:2015-04-15 18:30:06

标签: java encryption rsa modulus

我正在研究缩小的RSA encryptiondecryption方法,一切似乎都运行良好,直到我尝试取一个数的模数。模数运算符未返回预期结果。

        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

获得此结果的原因是什么?

提前感谢您的所有建议。

1 个答案:

答案 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