Diffie-Hellman密钥交换 - 澄清?

时间:2016-11-29 22:26:40

标签: c# cryptography diffie-hellman

简要说明:

爱丽丝和鲍勃试图在不想要夏娃(正在倾听)的情况下进行交流,以了解他们将要谈论的内容。

所以

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

Alice和Bob公开同意质数生成器。

  • Generator = 3
  • Prime = 17

所以公式将是(例如):

3^x % 17

行。

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

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

现在的情况是:

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

现在,爱丽丝接受了鲍勃的12和她的私钥并且做了:

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

Alice正在做:12^15 % 17 => 10

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

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

立即

这是一个例子,很容易入侵。

所有Eve必须做的是尝试找出x 3^x % 1715中的13

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

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

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

这是:

3213213213212123332 ^ 6549875 % 17

我有16g内存的I7,这个时间超过5分钟

问题:

如果双方(Alice& Bob)使用大数字,那么他们需要很长时间才能获得第一步的结果(之后他们应该交换该值)

我可能会在这里遗漏一些东西,但似乎通过使用大数字让夏娃的生活变得艰难,也让爱丽丝和鲍勃的生活变得艰难。

我错过了什么?

1 个答案:

答案 0 :(得分:3)

您遗失的内容称为 modular exponentiation 。这是计算模数值的巨大指数的快速方法。

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

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

模幂运算将问题分解为更简单的步骤。有两种数学身份使这成为可能:

  
      
  1. (x ^ a)×(x ^ b)= x ^(a + b),和
  2.   
  3. (x ^ y)mod n =((x mod n)^ y)mod n
  4.   

证明:

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

如果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这样的指数,计算速度将快上百万倍。