对Diffie-Hellman密钥交换算法实现的一点改进

Diffie-Hellman 算法描述: 目前被许多商业产品交易采用。

HD 算法为公开的密钥算法,发明于1976年。该算法不能用于加密或解密,而是用于密钥的传输和分配。

     DH 算法的安全性体现在:在有限域上计算离散对数非常困难。

     离散对数 :定义素数p的原始根(primitive root)为这样一个数,它能生成1~p-1所有数的一个数。现设ap的原始根,则

a mod p, a2 mod p,…,ap-1 mod p

   两两互不相同,构成一个1~p-1的全体数的一个排列。对于任意数b及素数p的原始根a,可以找到一个唯一的指数i,满足 b=ai mod p, 0<=i<=p-1

则称指数i为以a为底、模Pb离散对数


算法描述:
假如Alice 和 Bob在不安全的网络上进行协商共同的密码:
1.Alice和Bob先说好一个大素数p和它的原始根a
2.Alice随机产生一个数x,
计算X=ax mod p, 然后把X发给Bob
3.   Bob秘密产生一个随机数y,计算Y=ay mod p, 然后把Y发给Alice
4.Alice计算k=Yx mod p;
5.Bob计算k*=Xy mod p;

因为

k=Yx mod p= (ay) x mod p=(a x)y mod p=X y mod p= k*

所以  k= k*

不安全线路上的窃听者只能得到apXY,除非能计算离散对数xy,否则将无法得到密钥k。因此,kAliceBob独立计算出的密钥。

 

 

今天主要分析一下D-H算法的实现问题,随机数有很多办法实现,不讨论了。仔细看看D-H算法可以发现除开随机数的生成,实际上就是4次(n^x)mod p的过程。n是随机的大数(或者X,Y),x就各自的原始随机源,而p是大素数。为何要是大素数跟他的原始根呢,数学上有安全性的证明。

要实现D-H算法主要就是

1:p大素数的生成,以及其原始根的查找。这个问题,可以通过查找大素数表,网络上也有很多经典生成办法。

2:(n^x)mod p的运算。n是大数,x也是大数,这样一个运算,空间上64位的数据是远远溢出的,时间上也是一个考验。

拿1024位的x来说,我们虽然可以使用大数库(gmp,openssl,crypt++都可以),但是n^x这样一个结果有多大呢?直接计算是很不划算的做法。

其实我们可以根据以下原理做出改进。

(n^2)mod p=((n mod p)*n) mod p。

这个式子在这里不证明了。

这样做出改进后,我们最大的中间结果最多n^2位而已,空间复杂度从n^x降到n*n,1024位的数据,也不过2000位就能存储。

此外改成这种形式,也便于代码循环处理。

你可能感兴趣的:(算法,加密,网络,解密,存储,Primitive)