假设现在A和B在一起交谈,现在C过来了,A和B要恶搞一下C
如果A直接给B说:我想恶搞C,怎么样
B给A说:可以
那么C就在旁边听着呢!
现在A和B换了一种策略
A给B一个眼神(我想恶搞C),B给A一个眼神(可以)
C站在旁边不明所以就上当了
我们现在可以假设A和B两个人之间传输的是眼神
,得到的结果却是一样的恶搞C
这就是迪菲-赫尔曼密钥交换,看起来就像是你知道我知道,我知道你知道
一张图来描述迪菲-赫尔曼密钥交换[1]
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
作为自己的加密数字,将key
与p q
融合得到 mixa = = 4
Bob选择了key=3
作为自己的加密数字,将key
与p q
融合得到 mixb = = 10
Alice将mixa
传给Bob,Bob将mixa
与自己的加密数字k=3
融合得到result = = 18
Bob将mixb
传给Alice,Alice将mixb
与自己的加密数字k=4
融合得到result = = 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
,这不就是你知道我知道,我知道你知道
吗?
网友评论