Diffie Hellman密钥协商及参数选择

Diffie Hellman密钥协商用于在双方之间交换相同的秘密信息,例如交换对称加密的密钥,是基于离散对数困难问题的一个密钥协商协议。

所谓离散对数问题是说,有大素数p,满足g^a=b \mod p,已知g和b,求出a是困难的。

经典的Diffie Hellman密钥协商协议如下:

1、双方确定公共参数(或者由参数服务器确定)p,g,q。p和q是大素数,g=h^{\frac{p-1}{q}}\mod p,其中h是任意整数,满足1<h<p-1,最后得到的g要大于1。设要进行密钥协商的双方为Alice和Bob。

2、Alice选择私钥x_a,计算自己的公钥y_a=g^{x_a}\mod p,通过证书公布自己的公钥。

3、Bob选择私钥x_b,计算公钥y_b=g^{x_b}\mod p,通过证书公布自己的公钥。

4、Alice收到公钥y_b后,根据证书验证。确认的确是Bob的公钥后,计算一个的密钥key_a=y_{b}^{x_a}\mod p

5、Bob收到公钥y_a后,根据证书验证。确认的确是Alice的公钥后,计算一个密钥key_b=y_a^{x_b}\mod p

6、容易验证key_a=y_b^{x_a}\mod p=g^{x_b\cdot x_a} \mod p=g^{x_a\cdot x_b}\mod p =y_a^{x_b}\mod p=key_b

参数的选择

首先,我们来考虑如何选择p和q。q是小于p的,但是q是密钥空间的大小,至少也要160bit,而p要保证安全,至少要达到1024bit以上。

以下算法选择出一对p,q:

假设p的长度为L,q的长度为m。

1、m\prime=\lceil \frac{m}{160}\rceil 

2、L\prime=\lceil \frac{L}{160}\rceil

3、N\prime=\lceil \frac{L}{1024} \rceil

4、选择一个任意长度大于等于m的字符串SEED

5、U=0

6、For i=1 to m\prime-1 do:

        U=U+(SHA1[SEED+i] XOR SHA1[(SEED+m\prime+i)])\cdot2^{160\cdot i}

7、q=U OR 2^{m-1} OR 1

8、采用素数检验,查看q是否是素数。如果不是则跳到4

9、counter=0

10、R=SEED+2\cdot m\prime+(L\prime \cdot counter)

11、V=0

12、For i=0 to L\prime -1 do:

        V=V+SHA1(R + i)\cdot 2^{160\cdot i}

13、W=V \mod 2^L

14、X=W OR 2^{L-1}

15、p=X - (X \mod (2q))+1

16、如果p>2^{L-1},那么检验p是否为素数。如果是素数则输出p,q,结束算法。否则counter=counter+1

17、如果counter<(4096N)则跳到9,否则输出失败。

显然,通过算法得到的p,q不一定满足群的要求。所以我们需要测试,q是否整除p-1。如果不是,则我们需要重新产生p和q。

在有了p,q之后,我们需要根据p,q产生g。算法如下:

1、j=\frac{p-1}{q}

2、随机选择h属于(1, p-1)

3、g=h^j \mod p

4、如果g=1,跳到2,重新选择h。

算法摘录自RFC2631

猜你喜欢

转载自blog.csdn.net/watqw/article/details/122487187