- 首先通信双方在交换协议前每一方都有一个用于签名的非对称密钥对,这个用来做签名认证,密钥对的公钥需要在会话开始前共享,即会话前,Alice的签名非对称密钥对$(P_A, S_A)$, 其中公钥$P_A$全局公开,Bob的签名非对称密钥对$(P_B, S_B)$,其中公钥$P_B$全局公开
- 双方约定大素数$q$和它的一个本原根$\alpha$, 其中$\alpha<q$,这些步骤在会话开始前共享能够降低会话完成的复杂性。
会话过程(注意:如果其中某一个步骤未完成,则整个协议交换过程停止):
- Alice随机产生一个数(私钥) $x$,$x < q$,并计算公钥$Y_A = \alpha^x \bmod q$, 发送给Bob。
- Bob随机产生一个数(私钥) $y$,$y<q$, 并计算公钥$Y_B= \alpha^y \bmod q$
- Bob 会话密钥:$$K = Y_A^y \bmod q = (\alpha^x \bmod q)^y \bmod q = \alpha^{xy} \bmod q$$
- Bob计算$(\alpha^y, \alpha^x)$的hash, 然后使用非对称私钥$S_B$对该hash进行签名,然后使用会话密钥K对该签名进行加密,Bob将加密后的签名$E_K(S_B(\alpha_y, \alpha^x))$及公钥$\alpha^y$发送给Alice
- 此时, Alice手握Bob发过来的公钥$Y_B$,结合自己的私钥x计算会话密钥:$$K = Y_B^x \bmod q = (\alpha^y \bmod q)^x \bmod q = \alpha^{xy} \bmod q$$
- Alice使用会话密钥K解密签名消息,再用Bob的签名公钥$P_B$验证Bob的签名。
- Alice计算$(\alpha^x, \alpha^y)$的hash, 然后使用非对称私钥$S_A$对该hash进行签名,然后使用会话密钥K对该签名进行加密,Alice将加密后的签名$E_K(S_A(\alpha_x, \alpha^y))$发送给Bob。
- Bob利用会话密钥和Alice的公钥$P_A$解密并验证Alice的签名
以上所有步骤顺利完成之后Alice与Bob相互认证,并且拥有了共享密钥,K,密钥K可由于加密进一步的通信,该算法的过程如下图所示