【问题标题】:Calculation of Diffie–Hellman public key slowDiffie-Hellman 公钥慢速计算
【发布时间】:2021-05-01 15:24:48
【问题描述】:

嗨,我正在尝试实现 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 的实现而这么慢还是我偏离了轨道?

【问题讨论】:

  • 有些图书馆可以做到这一点。请不要自己这样做。加密不是玩具。
  • 我只是为了教育而这样做

标签: java encryption


【解决方案1】:

问题是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) 计算分解为大量的乘法(只需要 O(log2secret) 乘法),并在每个步骤中应用 .mod(p)以防止涉及的数字变得太大。

【讨论】:

    【解决方案2】:

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

    祝你好运。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-05
        • 1970-01-01
        • 2020-03-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        相关资源
        最近更新 更多