【发布时间】: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 将是15 或13。
但显然我们在这里谈论的是大数字。
如果是这样 - 我写了这个演示:
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