Skip to content

Latest commit

 

History

History
73 lines (37 loc) · 4.02 KB

File metadata and controls

73 lines (37 loc) · 4.02 KB

ECDH密钥协商

为了不传输密钥就完成密钥的协商,需要一种密钥协商算法来完成这个任务,而这个算法就是大名鼎鼎的椭圆曲线迪菲-赫尔曼密钥交换算法,在TLS/SSL握手过程中交换的三个参数random_C,random_S,pre-master就是为了完成这个算法。

ECDH全称是椭圆曲线迪菲-赫尔曼秘钥交换(Elliptic Curve Diffie–Hellman key Exchange),主要是用来在一个不安全的通道中建立起安全的共有加密资料,一般来说交换的都是私钥,这个密钥一般作为“对称加密”的密钥而被双方在后续数据传输中使用。

ECDH是建立在这样一个前提之上的,给定椭圆曲线上的一个点P,一个整数k,求Q=KP很容易;但是通过Q,P求解K很难。

算法流程

可以通过一个经典的场景来介绍算法实现,Alice和Bob要在一条不安全的线路上交换秘钥,交换的秘钥不能被中间人知晓。

首先,双方约定使用ECDH秘钥交换算法,这个时候双方也知道了ECDH算法里的一个大素数P,这个P可以看做是一个算法中的常量。

P的位数决定了攻击者破解的难度

还有一个整数g用来辅助整个秘钥交换,g不用很大,一般是2或者5,双方知道gp之后就开始了ECDH交换秘钥的过程了。


Alice知道了共用参数pg,生成私有整数a作为私钥,公钥算法一般是公钥加密,私钥解密,公钥给对方来加密数据,拿到密文后私钥解密查看内容正确性,这个时候Alice直接通过线路告诉Bob自己的私钥a显然既不合理也是一件风险很大的事。

这个时候Alice需要利用pga通过公式g^a mod p = A生成A作为公钥传递。


Bob通过链路收到Alice发来的pgA,知道了Alice的公钥A。这个时候Bob也生成自己的私钥b,然后通过公式g^b mod p = B生成自己公钥B

在发送公钥B前,Bob通过A^b mod p = K生成K作为公共秘钥,但是并不发送给Alice,只通过链路发送B


Alice收到Bob发来的公钥B以后,同样通过B^a mod p = K生成公共秘钥K,这样Alice和Bob就通过不传递私钥ab完成了对公共秘钥K的协商。

可以通过代入具体数字的一个例子来重复一下上面的过程:

  1. Alice和Bob同意使用质数p和整数g:

p = 83, g = 8

  1. Alice选择秘钥 a = 9, 生成公钥 g^a mod p = A 并发送

(8^9) mod 83 = 5

  1. Bob选择秘钥 b = 21, 生成公钥 A^b mod p = B 并发送

(8^21) mod 83 = 18

  1. Alice计算 B^a mod p = K

18^9 mod 83 = 24

  1. Bob计算 B^a mod p = K

5^21 mod 83 = 24

至此24就是双方协商出来的秘钥。

协议所面临的问题

由于 ECDH 密钥交换协议不验证公钥发送者的身份,因此无法阻止中间人攻击。如果监听者 Mallory 截获了 Alice 的公钥,就可以替换为他自己的公钥,并将其发送给 Bob。Mallory 还可以截获 Bob 的公钥,替换为他自己的公钥,并将其发送给 Alice。这样,Mallory 就可以轻松地对 Alice 与 Bob 之间发送的任何消息进行解密。他可以更改消息,用他自己的密钥对消息重新加密,然后将消息发送给接收者。

为了解决此问题,Alice 和 Bob 可以在交换公钥之前使用数字签名对公钥进行签名。有两种方法可以实现此目的:

  • 用安全的媒体(例如语音通信或可信载运商)在双方之间传输数字签名密钥。

  • 使用公共证书颁发机构 (CA) 向双方提供可信数字签名密钥。

区块链中的应用场景

当多个参与方共享同一个链路的时候,联盟链各参与方想要在同一个链路上实现通性的隔离,使用ECDH算法既可以实现TCP链接的复用,避免频繁建立大量链接,又可以保证同一链接间的通信隔离。

各参与方的身份在加入网络前已经有MSP(Membership Service Provider)来颁发验证过,这样就可以规避ECDH协议的缺陷。