自制加密通信协议(二):密钥交换算法
使用对称密钥通信时,双方需要事先约定密钥。如何安全地操作是一个关键问题。Diffie-Hellman-Merkle算法使得在不安全的信道中交换密钥成为可能。
在Diffie-Hellman-Merkle算法中,事先约定整数G和M。通信双方Alice和Bob分别拥有自己的私钥a和b。Alice把自己的公钥A=Ga发送给Bob。同理,Bob把B=Gb发送给Alice。Alice计算Ba,Bob计算Ab。这样,他们就得到了共享密钥K=Gab。
注意,这里的乘法是模 M 的乘法,即A=Ga mod M,等等。对于取模的指数运算,其逆运算是一个目前难以解决的问题。对于外界的观察者而言,只知道G、M、A、B,并不能容易地求出a、b或K。这样就确保了密钥交换过程的安全性。
在实践中,常用密钥派生函数KDF对密钥K进行处理,用派生密钥KDF(K)作为对称加密的实际密钥。
X25519 密钥交换算法
X25519是一种类似Diffie-Hellman-Merkle,但基于椭圆曲线理论的密钥交换算法。
X25519采用定义在GF(2255-19)上的椭圆曲线:\[y^2=x^3+486662x^2+x\] 对该曲线上的点可以定义加法运算:过P、Q作直线,它将交曲线于第三点R=P+Q。如果P=Q,则作切线。由此可以得到数乘运算: \(nP=\underbrace{P+P+\ldots+P}_{n}\)。从nP和P倒推出n的值也是一个难以解决的问题,因此可以得到下面的密钥交换算法:
Alice和Bob各自拥有32字节的私钥a和b,使用X25519定义的基点G,分别生成公钥A=aG和B=bG并发送给对方。Alice计算a(bG),Bob计算b(aG)。这样,他们就得到了共享密钥K=abG。