Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Diffie-Hellman密钥交换-澄清?_C#_Cryptography_Diffie Hellman - Fatal编程技术网

C# Diffie-Hellman密钥交换-澄清?

C# Diffie-Hellman密钥交换-澄清?,c#,cryptography,diffie-hellman,C#,Cryptography,Diffie Hellman,简介: 爱丽丝和鲍勃试图在不想让夏娃(正在听的人)知道他们要谈什么的情况下进行交流 所以 Alice和Bob公开同意素数模和生成器 说 发电机=3 素数=17 因此,公式如下(例如): 嗯 Alice正在选择一个私人号码(比如15),然后做3^15%17=>6 Bob正在选择一个private号码(比如13)并执行3^13%17=>12 现在爱丽丝和鲍勃在夏娃听的时候互相告诉对方他们的结果(不是他们的私钥) 现在的情况是: Bad Eve ( knows :

简介:

爱丽丝和鲍勃试图在不想让夏娃(正在听的人)知道他们要谈什么的情况下进行交流

所以

Alice和Bob公开同意素数模和生成器

  • 发电机=3
  • 素数=17
因此,公式如下(例如):

Alice正在选择一个私人号码(比如15),然后做
3^15%17=>6

Bob正在选择一个private号码(比如13)并执行
3^13%17=>12

现在爱丽丝和鲍勃在夏娃听的时候互相告诉对方他们的结果(不是他们的私钥)

现在的情况是:

                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
将是
15
13

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

如果是,我写了这个演示:

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

3213213213212123332 ^ 6549875 % 17
我有16gb内存的I7,运行时间超过5分钟

问题:

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

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


我错过了什么?

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

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

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

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

  • (x^a)×(x^b)=x^(a+b),以及
  • (x^y)模n=(x模n)^y)模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)为)

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


    模幂算法: 要计算(x^y)mod n,请重复将x乘以其自身,以获得以下序列:

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

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

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


    这样做有两个优点。首先,您必须计算的最大数字的位数最多是模数n的两倍。第二,必须执行的计算数量与指数的对数(以2为底)成正比,这意味着对于6549875这样的指数,计算速度将快数百万倍。

    “…它们需要很长时间才能得到结果”-不,一点也不
    pow(32121233326549875,17)
    在Python中只需几微秒。在取模之前,不需要计算整个指数。查找。事实上,计算通常写为c^x(mod 17),因此括号内的mod 17表示这是特定组内的计算,而不是在求幂之后执行的操作。@squemishossifrage,因此我想我遗漏了一些东西。你能详细解释一下吗?
    Console.WriteLine(BigInteger.Pow( new BigInteger(3213213213212123332), 6549875) % 17);
    
    3213213213212123332 ^ 6549875 % 17