Diffie Hellman密钥协商用于在双方之间交换相同的秘密信息,例如交换对称加密的密钥,是基于离散对数困难问题的一个密钥协商协议。
所谓离散对数问题是说,有大素数p,满足,已知g和b,求出a是困难的。
经典的Diffie Hellman密钥协商协议如下:
1、双方确定公共参数(或者由参数服务器确定)p,g,q。p和q是大素数,,其中h是任意整数,满足1<h<p-1,最后得到的g要大于1。设要进行密钥协商的双方为Alice和Bob。
2、Alice选择私钥,计算自己的公钥,通过证书公布自己的公钥。
3、Bob选择私钥,计算公钥,通过证书公布自己的公钥。
4、Alice收到公钥后,根据证书验证。确认的确是Bob的公钥后,计算一个的密钥。
5、Bob收到公钥后,根据证书验证。确认的确是Alice的公钥后,计算一个密钥。
6、容易验证
参数的选择
首先,我们来考虑如何选择p和q。q是小于p的,但是q是密钥空间的大小,至少也要160bit,而p要保证安全,至少要达到1024bit以上。
以下算法选择出一对p,q:
假设p的长度为L,q的长度为m。
1、
2、
3、
4、选择一个任意长度大于等于m的字符串SEED
5、U=0
6、For i=1 to do:
U=U+(SHA1[SEED+i] XOR SHA1[(SEED++i)])
7、q=U OR OR 1
8、采用素数检验,查看q是否是素数。如果不是则跳到4
9、counter=0
10、R=SEED++( counter)
11、V=0
12、For i=0 to do:
V=V+SHA1(R + i)
13、W=V
14、X=W OR
15、p=X - (X (2q))+1
16、如果p>,那么检验p是否为素数。如果是素数则输出p,q,结束算法。否则counter=counter+1
17、如果counter<(4096N)则跳到9,否则输出失败。
显然,通过算法得到的p,q不一定满足群的要求。所以我们需要测试,q是否整除p-1。如果不是,则我们需要重新产生p和q。
在有了p,q之后,我们需要根据p,q产生g。算法如下:
1、
2、随机选择h属于(1, p-1)
3、
4、如果g=1,跳到2,重新选择h。
算法摘录自RFC2631