【问题标题】:Diffie-Hellman Key Exchange - Clarification?Diffie-Hellman 密钥交换 - 澄清?
【发布时间】:2023-03-19 15:38:01
【问题描述】:

简介:

Alice 和 Bob 试图在不希望 Eve(正在听的)知道他们要谈论什么的情况下进行交流。

所以

               Bad Eve
                  |
                  |
Alice ------------+--------------- Bob                               

Alice 和 Bob 在素数模生成器上公开达成一致。

  • 生成器 = 3
  • 素数 = 17

所以公式将是(例如):

3^x % 17

好的。

Alice 正在选择一个 私人 号码(例如 15)并执行3^15 %17 => 6
Bob 正在选择一个 私人 号码(例如 13)并执行 3^13 %17 => 12

现在 Alice 和 Bob 在 Eve 听的时候告诉对方他们的结果(不是他们的私钥)。

所以现在的图片是:

                Bad Eve ( knows : 3^x %17 , 12,6)
                   |
                   |
 Alice ------------+--------------- Bob  
 (15)private                       (13)private 
  12(Bob's)                        6(Eve's)                       

现在 Alice 拿着 Bob 的 12 和她的私钥,然后做:

((other's public num) ^ secret number) % 17

爱丽丝正在做:12^15 % 17 => 10

鲍勃正在做:6^13 % 17 => 10

所以现在它们有相同的对称数。

现在:

这是一个示例,很容易破解。

Eve 所要做的就是尝试找出3^x % 17 中的哪个x 将是1513

但显然我们在这里谈论的是大数字。

如果是这样 - 我写了这个演示:

Console.WriteLine(BigInteger.Pow( new BigInteger(3213213213212123332), 6549875) % 17);

这是:

3213213213212123332 ^ 6549875 % 17

我有 16gb 内存的 I7,运行时间超过 5 分钟

问题:

如果双方(爱丽丝和鲍勃)都使用大数字,那么他们需要很长时间才能获得第一步的结果(稍后他们应该交换那个值)

我可能在这里遗漏了一些东西,但似乎使用大量数字让 Eve 的生活变得艰难,也让 Alice 和 Bob 的生活变得艰难。

我错过了什么?

【问题讨论】:

  • "...他们需要很长时间才能得到结果"——不,一点也不。 pow(3213213213212123332,6549875,17) 在 Python 中只需要几微秒。在取模之前不需要计算整个指数。查找modular exponentiation
  • 确实计算通常写成 c ^ x (mod 17),所以用括号内的 mod 17 表示这是特定组内的计算,而不是在求幂。
  • @squeamishossifrage 所以我想我错过了一些东西。能否详细解答一下?

标签: c# cryptography diffie-hellman


【解决方案1】:

你缺少的东西叫做 modular exponentiation。这是一种快速计算以某个值为模的巨大指数的方法。

例如,假设您要计算 (123^456) mod 777。

如果您先执行幂运算,您将得到大约 1000 位数字的结果。对于 DH 密钥交换中通常使用的那种值,您最终可能会使用更多的数字,甚至可能是数百万。这显然根本没有效率。

模幂运算将问题分解为更简单的步骤。有两个数学恒等式使这成为可能:

  1. (x^a) × (x^b) = x^(a+b),并且
  2. (x^y) mod n = ((x mod n)^y) mod n

证明:

其中第一个应该是不言而喻的。第二种可以证明如下:

如果 x mod n == z,那么对于 c 的某个整数值,x 等于 (c×n + z)。 (c×n + z)^y 的二项式展开有 (y+1) 项

c^y×n^y + k1×c^(y-1)×n^(y-1).z + k2×c^(y-2)×n^(y-2)×z ^2 + ... + k(y-1)c×n×z^(y-1) + z^y

(其中 k1 ... k(y-1) 是binomial coefficients

所有这些项除了最后一项 (z^y) 都是 n 的倍数,因此等于零 (mod n)。因此 (x^y) mod n == (z^y) mod n == ((x mod n)^y) mod n。


模幂算法:

要计算(x^y) mod n,反复将x乘以自身,得到如下序列:

X0 = x mod n
X1 = X0×X0 mod n = x^2 mod n
X2 = X1×X1 mod n = x^4 mod n
X3 = X2×X2 mod n = x^8 mod n
X4 = X3×X3 mod n = x^16 mod n

现在将这个系列中与 y 的二进制表示中的设置位相对应的项相乘。例如,假设 y=21:

(x^21) mod n = ((x^16) × (x^4) × x) mod n = (X4 * X2 * X0) mod n

以这种方式进行计算有两个优点。首先,您必须计算的最大数的位数最多为模数 n 的两倍。其次,您必须执行的计算次数与指数的(以 2 为底的)对数成正比,这意味着对于 6549875 这样的指数,计算的运行速度会快数百万倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 2023-03-03
    • 2010-09-29
    • 1970-01-01
    • 2018-06-10
    相关资源
    最近更新 更多