我正在尝试实施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的实施还是偏离轨道,它是否如此缓慢?
答案 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,计算效率高