ECDHE 算法

ECDHE 算法解决了 RSA 算法不具备前向安全的性质 和 DH 算法效率低下的问题。

ECDHE 算法具有前向安全。所以被广泛使用。

由什么演变而来

DH 算法 -- > DHE 算法 -- > ECDHE 算法

DH 算法是非对称加密算法,该算法的核心数学思想是离散对数。

核心数学思想

离散对数

离散对数 是【离散 + 对数】的两个数学概念的组合。

概念如图:

上图中,底数 a 和模数 p 是离散对数的公共参数(公开的),b 是真数,i 是对数。

知道了对数,就可以用上面的公式计算出真数。

反过来,知道真数却很难推算出对数。

特别是当模数 p 是⼀个很⼤的质数,即使知道底数 a 和真数 b ,在现有的计算机的计算⽔平是⼏乎⽆法算出离散 对数的,这就是 DH 算法的数学基础。

DH 算法

前置背景:

小红(客户端) 和 小明(服务端)、DH 算法中的两个公开参数 P 和 G

第一步:

小红生成一个随机数:a(私钥);小明生成一个随机数:b(私钥);

第二步:

小红根据 a、P、G 计算出公钥:A(公钥);小明根据 b、P、G 计算出公钥:B(公钥);

A = G ^ a ( mod P ); B = G ^ b ( mod P );

第三步:

小红和小明交换公钥 A 和 B;

第四步:

小红根据 B、a、P 运算得到:K(对称加密密钥); 小明根据 A、b、P 运算得到 K(对称加密密钥);

K = B ^ a ( mod P ) = A ^ b ( mod P )


整个密钥协商过程中,小红和小明公开了 4 个信息:P、G、A、B。

根据离散对数的原理,如果 P 是一个大数,在现有的计算机的计算能力是和很难破解出私钥 a、b的。

DHE 算法

来源:

根据私钥的生成方式的分类,DH 算法可以分为两种实现:DHE 算法 和 static 算法(已废弃)

E:ephemeral(临时性的)

作用特性:

让双方的私钥在每次密钥交换通信时,都是随机生成的、临时的。

每个通信过程 的私钥都是没有任何关系的,都是独⽴的,这样就保证了「前向安全」。

ECDHE 算法

来源:

解决 DHE 算法的性能不佳问题。

技术核心:

在 DHE 算法的基础上利用了 ECC 椭圆曲线特性。

具体过程:(在 DH 算法过程的基础上)

  • 小红和小明确定好:使用哪种椭圆曲线 和 曲线上的基点 G (都公开);
  • 小红根据 a、G 得到: QA(公钥);小明根据 b、G 得到: QB(公钥);

QA = aG;QB = bG;

  • 小红和小明交换公钥:QA 和 QB;
  • 小红计算点(x1,y1) = aQB ; 小明计算点(x2,y2) = bQA ;

因为椭圆曲线满足乘法交换律和结合律,所以 aQB = abG = baG = bQA。

  • 根据此次计算的特性,双方的 x 坐标是一样的,所以 x 为会话密钥。

这个过程中,双⽅的私钥都是随机、临时⽣成的,都是不公开的,即使根据公开的信息(椭圆曲线、公钥、基点 G)也是很难计算出椭圆曲线上的离散对数(私钥) 。

ECDHE 握手过程

与 RSA 算法的区别

  1. RSA 密钥协商算法「不⽀持」前向保密,ECDHE 密钥协商算法「⽀持」前向保密;
  2. 使⽤了 RSA 密钥协商算法,TLS 完成四次握⼿后,才能进⾏应⽤数据传输,⽽对于 ECDHE 算法,客户端可 以不⽤等服务端的最后⼀次 TLS 握⼿,就可以提前发出加密的 HTTP 数据,节省了⼀个消息的往返时间(1 RTT);
  3. 使⽤ ECDHE, 在 TLS 第 2 次握⼿中,会出现服务器端发出的「Server Key Exchange」消息,⽽ RSA 握⼿ 过程没有该消息;

ECDHE 相比 RSA 握手过程省去了一个消息往返的时间,提高了传输效率。(also mean:抢跑)

TLS 第一次握手:

Client Hello

TLS 第二次握手:

Server Hello

在ECDHE 算法中,这次的密码套件 和 RSA 的不一样。

「 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384」

  • 密钥协商算法使⽤ ECDHE;
  • 签名算法使⽤ RSA;
  • 握⼿后的通信使⽤ AES 对称算法,密钥⻓度 256 位,分组模式是 GCM;
  • 摘要算法使⽤ SHA384 ;

Certificate

在ECDHE 算法中, 会在发送完证书后, 发送「Server Key Exchange」消息 。

Server Key Exchange

这个过程服务器做了三件事:

  • 选择了名为 named_curve 的椭圆曲线,选好了椭圆曲线相当于椭圆曲线基点 G 也定好了,这些都会公开给客户端;
  • ⽣成随机数作为服务端椭圆曲线的私钥,保留到本地;
  • 根据基点 G 和私钥计算出服务端的椭圆曲线公钥,这个会公开给客户端。

为了保证这个椭圆曲线的公钥不被第三⽅篡改,服务端会⽤ RSA 签名算法给服务端的椭圆曲线公钥做个签名。

Server Hello Done

至此,小红和小明已经共享了 a、b、QB、基点G、使用的椭圆曲线。

TLS 第三次握手

在此之前,先进行证书校验。同时小红计算出公钥 QA。

Client Key Exchange

小红给小明发送了 QA。

至此,双方计算出坐标 x(初级会话密钥)。

但在实际应用中,x 还不是最终的会话密钥。

TLS 握⼿阶段,客户端和服务端都⽣成了⼀个随机数传递给对⽅,最终的会话密钥,就是用【 客户端随机数 + 服务端随机数 + x】三个材料生成。

之所以这么麻烦,是因为 TLS 设计者不信任客户端或服务器「伪随机数」的可靠性,为了保证真正的完全随机, 把三个不可靠的随机数混合起来,那么「随机」的程度就⾮常高了,⾜够让⿊客计算出最终的会话密钥,安全性更高。

Change Cipher Spec

告诉服务端后续改⽤对称算法加密通信

Encrypted Handshake Message

把之前发送的数据做⼀个摘要,再⽤对称密钥加密 ⼀下,让服务端做个验证,验证下本次⽣成的对称密钥是否可以正常使⽤。

TLS 第四次握手

Change Cipher Spec

Encrypted Handshake Message


握手正式完成,可以正常收发加密的 HTTP 请求和响应了

 

posted @ 2022-09-01 21:23  Tiddler_7  阅读(2097)  评论(0编辑  收藏  举报