编程杂谈

迪菲-赫尔曼密钥交换 Python语言描述

2018-11-29  本文已影响143人  eye_water_

假设现在A和B在一起交谈,现在C过来了,A和B要恶搞一下C

如果A直接给B说:我想恶搞C,怎么样
B给A说:可以
那么C就在旁边听着呢!
现在A和B换了一种策略

A给B一个眼神(我想恶搞C),B给A一个眼神(可以)
C站在旁边不明所以就上当了

我们现在可以假设A和B两个人之间传输的是眼神,得到的结果却是一样的恶搞C

这就是迪菲-赫尔曼密钥交换,看起来就像是你知道我知道,我知道你知道

一张图来描述迪菲-赫尔曼密钥交换[1]

图片引用自WIKI Diffie–Hellman key exchange

1.Alice和Bob共同选择了黄色
2.Alice选择了红色为自己的加密颜色,Bob选择了绿色为自己的加密颜色
3.Alice将黄色与红色融合生成橙色传给Bob,Bob将黄色与绿色融合生成天蓝色传给Alice
4.Alice将天蓝色与自己的加密颜色红色融合生成了褐色,Bob将橙色与自己的加密颜色绿色生成了褐色
5.BOMB!得到了Alice与Bob的公共密钥[2]

你看整个传输过程中我们并没有声明Alice和Bob的公共密钥是褐色,而是在传输过程中分别给Alice和Bob天蓝色橙色

数学描述


keypair.png

现在可以假设Alice与Bob共同选择了两个数字p=23 g=5
Alice选择了key=4作为自己的加密数字,将keyp q融合得到 mixa = 5^{4}mod23 = 4
Bob选择了key=3作为自己的加密数字,将keyp q融合得到 mixb = 5^{3}mod23 = 10
Alice将mixa传给Bob,Bob将mixa与自己的加密数字k=3融合得到result = \left( 5^{4}mod23\right) ^{3}mod23 = 18
Bob将mixb传给Alice,Alice将mixb与自己的加密数字k=4融合得到result = \left( 5^{3}mod23\right) ^{4}mod23 = 18[2]

这样就算出来公共密钥

Python代码描述[3]

sharedPrime = 23    # p
sharedBase = 5      # g
 
aliceSecret = 6     # a
bobSecret = 15      # b
 
# Begin
print( "Publicly Shared Variables:")
print( "    Publicly Shared Prime: " , sharedPrime )
print( "    Publicly Shared Base:  " , sharedBase )
 
# Alice Sends Bob A = g^a mod p
A = (sharedBase**aliceSecret) % sharedPrime
print( "\n  Alice Sends Over Public Chanel: " , A )
 
# Bob Sends Alice B = g^b mod p
B = (sharedBase ** bobSecret) % sharedPrime
print("Bob Sends Over Public Chanel: ", B )
 
print( "\n------------\n" )
print( "Privately Calculated Shared Secret:" )
# Alice Computes Shared Secret: s = B^a mod p
aliceSharedSecret = (B ** aliceSecret) % sharedPrime
print( "    Alice Shared Secret: ", aliceSharedSecret )
 
# Bob Computes Shared Secret: s = A^b mod p
bobSharedSecret = (A**bobSecret) % sharedPrime
print( "    Bob Shared Secret: ", bobSharedSecret )

运行结果

Publicly Shared Variables:
    Publicly Shared Prime:  23
    Publicly Shared Base:   5

  Alice Sends Over Public Chanel:  8
Bob Sends Over Public Chanel:  19

------------

Privately Calculated Shared Secret:
    Alice Shared Secret:  2
    Bob Shared Secret:  2

这样以后再进行传输时,Alice和Bob都知道公共密钥是2,但是并没有传输2,这不就是你知道我知道,我知道你知道吗?


  1. 图片引用自WIKI Diffie–Hellman key exchange

  2. 节选自WIKI Diffie–Hellman key exchange

  3. 代码选取自Simple Diffie–Hellman Key Exchange Example With Python

上一篇下一篇

猜你喜欢

热点阅读