简要说明:
爱丽丝和鲍勃试图在不想要夏娃(正在倾听)的情况下进行交流,以了解他们将要谈论的内容。
所以
Bad Eve
|
|
Alice ------------+--------------- Bob
Alice和Bob公开同意质数和生成器。
说
所以公式将是(例如):
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 % 17
或15
中的13
。
但显然我们在这里谈论大数字。
如果是这样 - 我写了这个演示:
Console.WriteLine(BigInteger.Pow( new BigInteger(3213213213212123332), 6549875) % 17);
这是:
3213213213212123332 ^ 6549875 % 17
我有16g内存的I7,这个时间超过5分钟
问题:
如果双方(Alice& Bob)使用大数字,那么他们需要很长时间才能获得第一步的结果(之后他们应该交换该值)
我可能会在这里遗漏一些东西,但似乎通过使用大数字让夏娃的生活变得艰难,也让爱丽丝和鲍勃的生活变得艰难。
我错过了什么?
答案 0 :(得分:3)
您遗失的内容称为 modular exponentiation 。这是计算模数值的巨大指数的快速方法。
例如,假设您要计算(123 ^ 456)mod 777。
如果先执行取幂,则会得到大约1000位数的结果。对于DH密钥交换中通常使用的值,您最终可能会使用更多数字,甚至数百万。这显然没有效率。
模幂运算将问题分解为更简单的步骤。有两种数学身份使这成为可能:
- (x ^ a)×(x ^ b)= x ^(a + b),和
- (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这样的指数,计算速度将快上百万倍。