RSA Key exchange#


本篇文章, 我们以 TLS_RSA_WITH_AES_253_CBC_SHA256 为例,来学习一种 TLS Key 交换算法.: RSA key 交换算法.

注意, 这种 key 交换算法已经被证明并不安全,因此请在实践中不要使用它,

这里我们只是以此来学习以下相关算法原理.


握手过程#


使用 RSA Key 交换算法的 TLS 握手流程大体如下:

Bash
Client                                      ServerClientHello{CipherSuites: TLS_RSA_...} -->                                        <-- ServerHello{CipherSuite: TLS_RSA_...}                                       <-- Certificate(RSA)                                       <-- ServerHelloDoneClientKeyExchange**                    -->ChangeCipherSpec                       -->EncryptedHandshakeMessage              -->                                       <-- ChangeCipherSpec                                       <-- EncryptedHandshakeMessag

算法解析#


RSA Key 交换算法流程:

1. TLS 服务器端#

当 TLS 握手过程中选择了 RSA key 交换算法。 服务器会发送一个 RSA 的证书给客户端。这个证书有两个作用:

  1. 用于表示服务器的身份信息,用于身份认证。
  2. 用于进行 RSA key 交换

当使用 RSA key 交换算法的时候,通常不需要再额外的发送 ServerKeyExchange 包。

2. TLS 客户端#

客户端收到服务器端的证书之后,进行如下操作:

  1. 使用一个安全的随机数生成方法,生成48个字节。
  2. 把前两个字节替换为 ClientHello 中所携带的 TLS 版本信息对应的字节。 此时,这个 48 字节的随机数就是此次 TLS 会话中要使用的 premaster key.
  3. 客户端使用服务器端发送过来的公钥,对这个随机数组进行加密。
  4. 加密之后的内容,通过 ClientKeyExchage 发送给服务器端。

3. TLS 服务器端#

当服务器端收到来自客户端的 ClientKeyExchage之后, 使用对应的证书的私钥对其中携带的 premaster key 进行解密。

至此, 客户端和服务器已经共享了一个相同的 premaster key。 Key 交换就此完成。


为什么不安全?#


因为它不是完全正向保密(Perfect forward secrecy). 参考: https://en.wikipedia.org/wiki/Forward_secrecy


ClientKeyExchange 示例#


Bash
Transport Layer Security    TLSv1.2 Record Layer: Handshake Protocol: Client Key Exchange        Content Type: Handshake (22)        Version: TLS 1.2 (0x0303)        Length: 134        Handshake Protocol: Client Key Exchange            Handshake Type: Client Key Exchange (16)            Length: 130            RSA Encrypted PreMaster Secret                Encrypted PreMaster length: 128                Encrypted PreMaster: 56dda7828..a4987ff… 
Published at:
October 20, 2026
Keywords:
TLS
Crypto
RSA
Key Exchange