【问题标题】:Storing large numbers for RSA encryption in java在java中为RSA加密存储大量数字
【发布时间】:2016-07-22 22:18:37
【问题描述】:

在我发布我的代码之前,我认为最好先布局几件事。

目标:

对几个小数字执行非常基本的 RSA 加密。对于那些熟悉 RSA 加密的人,我已经发布了用于下面算法的值。

当前 RSA 数字/值:

P=29

Q=31

N=P*Q

Phi=((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?如果是这样,如何?

大问题:

如何存储执行解密所需的值?

提前感谢任何尝试帮助我的人!

【问题讨论】:

  • 我不知道是设计还是运气,当您的加密计算对 29 以上的大多数值产生错误结果时,您只测试高达 28 的值,解密也应该同样是 mod n:m = c^d mod n。同样对您的玩具尺寸进行取幂和取模几乎不实用,但是为安全尺寸进行操作将比您的生命周期(或您的计算机)花费更长的时间,因此实际实现将它们交错,如 Wikipedia 等中所述 - 然后是玩具大小你根本不需要 bignums。

标签: java encryption cryptography rsa storing-data


【解决方案1】:

您的问题正在发生,因为您正在使用原始数据类型进行计算,然后将这些原始数据类型存储在 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 进行计算,并且只将您已经存储在原始数据类型中的值存储在原始数据类型中。

【讨论】:

  • 谢谢,我马上改实现。另外,BigInteger 有任何限制吗?如果有,它们是什么?
  • 很高兴能帮上忙!如果它对您有用,那么如果您可以遵循 SO 礼节并接受 BigIntegers 是“任意精度”的答案,那就太好了,这意味着它们支持的数量与您的机器拥有的资源一样大(您不太可能跑起来反对这个限制)
  • 我对 SO 有点菜鸟。这是我的第一个问题。我如何接受答案?
  • 应该是我的答案左侧的灰色复选标记 - 单击它,它会变成绿色 - 谢谢!
  • @jpgamer31 首先使用BigInteger.valueOf 转换为BigInteger。您可能还想查看BigInteger#modPow 方法。最后,BigInteger 值基本上受实现和内存的约束。基本上:不用担心,除非您尝试做一些愚蠢的事情,例如对没有模数的大数进行求幂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2017-03-07
  • 2015-06-13
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多