Diffie-Hellman公钥缓慢计算

时间:2013-09-08 17:36:37

标签: java encryption

我正在尝试实施Diffie-Hellman密钥交换

public static Integer secret = 100000;
public static BigInteger g = new BigInteger("5");
public static BigInteger p = new BigInteger("315791951375393537137595555337555955191395351995195751755791151795317131135377351919777977373317997317733397199751739199735799971153399111973979977771537137371797357935195531355957399953977139577337393111951779135151171355371173379337573915193973715113971779315731713793579595533511197399993313719939759551175175337795317333957313779755351991151933337157555517575773115995775199513553337335137111");
public static BigInteger public = g.pow(secret).mod(p);

但是100000的计算已经需要几秒钟。对于一个256位的数字,我不会知道多少时间。

由于BigInteger的实施还是偏离轨道,它是否如此缓慢?

3 个答案:

答案 0 :(得分:3)

使用此处描述的方法(以及许多其他位置): https://math.stackexchange.com/questions/36318/modulo-arithmetic-with-big-numbers

祝你好运。

答案 1 :(得分:2)

问题是g.pow(secret)是一个非常非常非常大的数字。它比p大得多,并且有大约secret个数字。如果将secret增加到普通Diffie-Hellman秘密指数的范围内(与p大约相同的位数),那么您的计算机将没有足够的内存来容纳它。地球上的所有计算机都没有足够的内存来容纳它。这是一个非常大的数字。

g.pow(secret).mod(p) - 你想要的最终答案 - 只有p的数字,所以它是计算机跟踪的易处理数字。这只是一个太大而无法处理的中间值。

所以你需要利用像这样的整数的mod的分配规则 -
(a * b).mod(p) == (a.mod(p) * b.mod(p)).mod(p)。使用该规则,您可以将g.pow(secret)计算细分为多个乘法,并在每个步骤应用.mod(p)以防止涉及的数字过大。

答案 2 :(得分:0)

在Java中使用modPow of BigInteger,计算效率高