在Java中使用Arraylist的RSA算法中的解密公式导致错误的结果

时间:2016-12-16 20:33:16

标签: java algorithm rsa

我正在尝试用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! :(

1 个答案:

答案 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是浮点数,因此它首先返回一个不精确(四舍五入)的结果,并截断为intlong将其转换为完全错误且无用的结果。相反,您应该在每个阶段模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填充等。