DH算法是W.Diffie和M.Hellman提出的。此算法是最早的公钥算法。它实质是一个通信双方进行密钥协商的协议:两个实体中的任何一个使用自己的私钥和另一实体的公钥,得到一个对称密钥,这一对称密钥其它实体都计算不出来。DH算法的安全性基于有限域上计算离散对数的困难性。离散对数的研究现状表明:所使用的DH密钥至少需要1024位,才能保证有足够的中、长期安全。
首先,发送方和接收方设置相同的大数数n和g,这两个数不是保密的,他们可以通过非安全通道来协商这两个素数;
接着,他们用下面的方法协商密钥:
发送方选择一个大随机整数x,计算X= g^x mod n ,发送X给接收者;
接收方选择一个大随机整数y,计算Y = g^y mod n ,发送Y给发送方;
双方计算密钥:发送方密钥为k1=Y^x mod n,接收方密钥为k2=X^y mod n。
其中k1=k2=g^(xy) mod n。
其他人可以知道n、g、X和Y,但是他们不能计算出密钥,除非他们能恢复x和y。DH算法不能抵御中间人攻击,中间人可以伪造假的X和Y分别发送给双方来获取他们的秘密密钥,所以需要保证X和Y的来源合法性。