在发布我的代码之前,我认为我最好首先安排一些事情。
目标:
对几个小数字执行非常基本的RSA加密。对于那些熟悉RSA加密的人,我已经发布了下面算法使用的值。
当前RSA数字/值:
P = 29
Q = 31
N = P * Q
披=((P-1)*(Q-1))
E = 11
我的问题:
当我尝试解密我的代码时出现问题。加密按设计工作。
代码:
long[] mesg = new long[]{8, 7, 26, 28};
long[] encrypted_mesg = new long[mesg.length];
for(int i=0; i<mesg.length; i++){
encrypted_mesg[i]=(long)((Math.pow(mesg[i],E))%N);
System.out.print(encrypted_mesg[i] + " ");
}
System.out.println();
//Decrpyt (not functioning-long to small, Big Integer not working)
for(int j=0; j<encryp_mesg.length; j++){
BigInteger decrypt = new BigInteger(Math.pow(encryp_mesg[j],D) + "");
System.out.print(decrypt.toString() + " ");
}
最初的问题是D(私人指数)在作为指数应用时,很长时间都是大的。我做了一个快速的谷歌搜索,并决定尝试实施BigInteger。当我运行该程序时,它会抛出此错误:
Exception in thread "main" java.lang.NumberFormatException: For input string: "Infinity"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.math.BigInteger.<init>(BigInteger.java:461)
at java.math.BigInteger.<init>(BigInteger.java:597)
at RSA_Riddles.main(RSA_Riddles.java:23)**
我试图解决这个问题:
说实话,我没有尝试过任何事情,因为我知道答案不会计算到无穷大,但BigInteger认为它确实存在。无论如何我可以存储130 ^ 611这样的数字吗?如果是这样,怎么样?
大问题:
如何存储执行解密所需的值?
提前感谢任何试图帮助我的人!
答案 0 :(得分:2)
您的问题正在发生,因为您正在使用原始数据类型进行计算,然后将这些原语存储在BigInteger中。这违背了使用BigInteger的目的。让我们来看看有问题的一行:
BigInteger decrypt = new BigInteger(Math.pow(encryp_mesg[j],D) + "");
当Java评估此行时,它将首先使用此表达式
Math.pow(encryp_mesg[j],D) + ""
并评估它。然后它会将此评估的结果传递给BigInteger的构造函数。但是,此时您已经超出了您正在使用的数据类型的范围。相反,你应该使用BigIntegers进行数学运算,如下所示:
BigInteger e = new BigInteger(Integer.toString(encryp_mesg[j]));
BigInteger decrypt = e.pow(D);
现在您只使用BigInteger进行计算,并且只存储您已经存储在原始数据类型中的原始数据类型值。