Diffie-Hellman 密钥交换算法

来源:互联网 发布:企业级备份软件排名 编辑:程序博客网 时间:2024/05/19 04:27

在文章 安全之初——加解密、签名和证书理解 中说了,密钥交换是对称加密的一大问题,并给出了利用非对称加密传输密钥的解决方案。其实,我们还有另一种解决方案,那就是本文的Diffie-Hellman 密钥交换算法。
我们以Alice和Bob利用Diffie-Hellman 密钥交换算法交换密钥的过程来说明该算法:
(0)前提说明,Alice和Bob都知道密钥交换过程中需要用到的素数p和p的一个本原根a(本原根的概念在文末有简单介绍),这两个值可以由发起通信的那一方选择并发送给通信的另一方。
(1)Alice选择自己密钥SA,计算出自己的公钥,PA = aSA mod p,然后把PA传给Bob
(2)Bob选择自己密钥SB,计算出自己的公钥,PB = aSB mod p,然后把PB传给Alice
(3)Alice根据Bob的公钥、自己的私钥、P和a计算出用于对称加密的加密密钥,K = PBSA mod p
(4)Bob根据Alice的公钥、自己的私钥、P和a计算出用于对称加密的加密密钥,K = PASB mod p
最终,Alice和Bob得到了用于对称加密的加密密钥。

让人感觉神奇的是,他们两个这样换来换去算来算去,居然得到了相同的值。其实,只要经过简单的公式推导,就知道事实确实如此:
K = PBSA mod p
  =(aSB mod p)SA mod p
  =(aSBSA mod p
  =aSBSA mod p
  =(aSASB mod p
  =(aSA mod p)SB mod p
  =PASB mod p
=K
从上面的推导可以看出,Alice和Bob计算得出的密钥确实是相同的。如果对推导过程有疑问,可以看看文末给出的模运算公式。

从Alice和Bob交换密钥的过程中,我们知道,在密钥交换过程中,p、a、PA和PB是公开的,SA和SB是不公开的。Diffie-Hellman 密钥交换是安全的,是基于这样的事实:通过p、a、PA和PB计算出SA或SB是困难的。也就是说,已知p、a、PA和PB,求解下面的两个方程之一是困难的:
PA = aSA mod p
PB = aSB mod p

我们以一个例子来结束本文。Alice和Bob约定的素数p=353,P的本原根a=3,他两选择的密钥SA=97,SB=233,然后计算相应的公钥:
PA = 397 mod 353 = 40
PB =3233 mod 353 = 248
Alice和Bob交换公钥后,双方均可计算出公共的密钥:
Alice计算K= PBSA mod p=24897 mod 353 = 160
Bob计算K=PASB mod p=40233 mod 353 = 160

补充:
1.素数P的本原根a是满足下面的条件的数:
a mod p, a1,…,ap-1各不相同,它们是整数1到p-1的一个置换。

2.上面的推导中,用到了模运算的一个公式:
(ab) mod p = ((a mod p)b) mod p

推荐:
《密码编码学和网络安全——原理和实践》第十章更详尽的介绍了Diffie-Hellman 密钥交换算法及相关数论的知识。

0 0
原创粉丝点击