Diffie和Hellman在1970年代建立了公钥密码学[1]的概念以及基于公钥密码的Diffie-Hellman密钥交换协议,这是密码学界的划时代事件,两人凭借该成就在2015年获得计算机科学最高奖-图灵奖[2]。
Diffie-Hellman密钥交换协议建立在计算性Diffie-Hellman假设[3](Computational Diffie-Hellman Assumption, CDH)之上,直觉上可以表述为:
compute gab from (ga,gb)
这里 a$←Z∗q,b$←Z∗q。
如果我们可以解决离散对数问题[4](Discrete Log Problem, DLP),那么自然可以解决CDH;反过来,如果可以求解CDH, 人们不清楚是否能利用这个结果解决DLP。一个意义深远的结论是如果我们可以证明解决CDH(或者解决DLP)是困难的(不存在多项式时间算法), 那么 P≠NP。
Diffie-Hellman假设另外一种常用形式,称之为判定性Diffie-Hellman假设(Decisional Diffie-Hellman Assumption, DDH)[5],直觉上可以表述成:
(ga,gb,gab)≈c(ga,gb,gc)
这里 a$←Z∗q,b$←Z∗q,c$←Z∗q。需要注意的是DDH成立的条件是苛刻的,需要挑选合适的群。这里的乘法群 Z∗q 实际上是不合适的,不安全的。这是因为可以通过计算 ga,gb 的勒让德符号[6]判断 a,b 的奇偶性,进而判断 ab 的奇偶性。实践中常用的群是二次剩余[7]构成的乘法群,带限制条件的椭圆曲线的点构成的加法群等。
双方密钥交换是最简单的密钥交换形式,也是Diffie-Hellman在论文[8]中具体讨论的问题。仅需一轮的数据交互,计算双方Alice和Bob就可以获得共享的密钥并保证该密钥不会被第三方获取。它的算法如下图所示:
算法正确性 容易看出yBA=yAB=gab
算法安全性 yA,yB 服从均匀分布,且从 yA,yB 反推 a,b 需要解DLP; 从 yA,yB推出 yAB 需要解CDH,这都是不可能的。
Diffie-Hellman不能抵御中间人攻击(Man-in-the-Middle Attack, MITM Attack)[9], 这是因为计算双方Alice和Bob在相互传递公钥 yA,yB 的过程中无法认证(authenticate)对方的身份。假定中间人是Carol,那么具体的攻击方法[10]如下:
现在考虑最一般的情况,即 N(N≥3) 方密钥交换。这个问题是笔者近期在做一些多方安全计算协议需要解决的。当 N=3 ,可以使用双线性对[11]构造三方密钥交换协议,但这只是多方密钥交换的一种特例,这里不展开讨论。笔者想讨论的是更一般的情况。
事实上,可以在上文提到的经典的双方密钥交换进一步构造多方密钥交换。为了表述方便,这里以 N=3 为例进行描述[12],最后将该方法推广到更一般的情形。
三方密钥(假定计算方分别为Alice, Bob, Charlie)需要进行两轮的数据通讯交互完成。在第一轮交互中,Alice发送数据 yA 给Bob, Bob发送数据 yB 给Charlie,最后Charlie发送数据 yC 给Alice,如下图所示:
依据离散对数问题假设,容易看出 yA=ga,yB=gb,yC=gc 是对私密的 a,b,c 的加密。
在第二轮交互中, Alice发送数据 yCA 给Bob, Bob发送数据 yAB 给Charlie,最后Charlie发送数据 yBC 给Alice,并最终算出共享私钥 yABC, 如下图所示:
算法正确性 容易看出 yCA=gca,yAB=gab,yBC=gbc,进而有 yBCA=gbca,yCAB=gcba,yABC=gabc, 最终获得共享私钥匙 yBCA=yCAB=yABC。
算法安全性 算法的安全性关键在于证明它是零知识(zero knowledge[13])的。不失一般性地,现在构造Alice的模拟器 SAlice 在给定输入 (a,gabc)的前提下模拟Alice的视角。 在第一轮数据交互中,Alice看到的是 yC=gc, 因此 SAlice随机生成 r$←Fq 满足 yc≈sr;在第二轮数据交互中,Alice看到的是 yBC=gbc, 并计算 yBCA←(yBC)a 最终得到共享私钥。因此 SAlice计算 y′BC←(yBCA)−a, 并用 y′BC 模拟 yBC, 显然有 y′BC=yBC,得证。
最后,考虑 P0,P1,⋯,PN−1(N>3) 之间的密钥交换协议。假定 Pi 拥有随机私密的 ai, 那么经过 N−1 轮的数据交互(每一轮的数据传输方向均为 Pi→Pi+1mod且 P_i 传输的是 g^{\prod_{k=0}^{j-1} a_{(i-k)\bmod N}} for all i=0,\cdots,N-1), P_i 最终算得共享私钥 g^{\prod_{i=0}^{N-1} a_i}。