2

自制加密通信协议(二):密钥交换算法

 2 years ago
source link: https://z-rui.github.io/post/2020/12/x25519/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

自制加密通信协议(二):密钥交换算法

Fri Dec 4, 2020

使用对称密钥通信时,双方需要事先约定密钥。如何安全地操作是一个关键问题。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)上的椭圆曲线:y2=x3+486662x2+x 对该曲线上的点可以定义加法运算:过P、Q作直线,它将交曲线于第三点R=P+Q。如果P=Q,则作切线。由此可以得到数乘运算: nP=P+P+…+P⏟n。从nP和P倒推出n的值也是一个难以解决的问题,因此可以得到下面的密钥交换算法:

Alice和Bob各自拥有32字节的私钥a和b,使用X25519定义的基点G,分别生成公钥A=aG和B=bG并发送给对方。Alice计算a(bG),Bob计算b(aG)。这样,他们就得到了共享密钥K=abG。



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK