我正在尝试用RSA算法解密问题。
ArrayList<Integer> m=convertTextToInt(str,e,n,listc);
for (int elem1 : m){
System.out.print( elem1+ " ");
}
在这里,我传递的str是一个来自用户的字符串,它将转换为convertTextToInt方法中的整数,数字e和n用于计算密文和数组列表,以便在计算密文后使用该值来存储公式
int c= (int)(Math.pow(Coded,e))%n;
listc.add(c);
然后我在主要写这个,问题是每当我执行这个循环它给出相同的结果,即144 !!:
System.out.print("plain text is: ");
for (int element : m){
int plain = (int)(Math.pow(element,d))%n;
listp.add(plain);
System.out.print("listp:"+listp);
}
我试图将plain的数据类型更改为double,它为我提供了另一个数字但不是正确的数字。
我的问题是:为什么纯文本(描述)的公式每次给我相同和错误的结果是144! :(
答案 0 :(得分:0)
近欺骗Storing large numbers for RSA encryption in java
您不知道您正在使用哪些数字,但如果您使用至少约1000位(约330个十进制数字)的数字,RSA只是安全的,这在Java中绝对需要BigInteger
。即使这是边缘不安全的;目前的安全标准类似于来自CA /浏览器论坛的WWW以及来自NIST的美国政府需要2048位。
即使对于符合Java int
(9+个十进制数字)或long
(18+个数字)的“玩具”数字(通常用于不需要实际安全性的课程), '原始'解密计算c d 不合适。 Math.pow
是浮点数,因此它首先返回一个不精确(四舍五入)的结果,并截断为int
或long
将其转换为完全错误且无用的结果。相反,您应该在每个阶段模n,as explained in Wikipedia链接article on RSA的阶段进行模幂运算。
如果您使用BigInteger
(对于非玩具案例必须使用),其modPow
方法已经执行此操作。
另请注意'教科书'RSA - 只有取幂模数大半数 - 实际上并不安全。维基百科的文章中也对此进行了简要解释,https://crypto.stackexchange.com/有几十个关于教科书RSA的危险和局限以及做什么的Q&amp; As。如果您真的想要Java中的安全性,至少是“桌面”或“手机”Java(如Android,而不是智能卡和嵌入式设备),Java Cryptography Extensions已经正确实现了RSA,包括其他内容你需要PKCS1填充等。