C# Diffie-Hellman密钥交换-澄清?
简介: 爱丽丝和鲍勃试图在不想让夏娃(正在听的人)知道他们要谈什么的情况下进行交流 所以 Alice和Bob公开同意素数模和生成器 说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 :
- 发电机=3
- 素数=17
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 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