RSA Key Exchange

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

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

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


握手过程


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

Client                                      Server
ClientHello{CipherSuites: TLS_RSA_...} --> 
                                       <-- ServerHello{CipherSuite: TLS_RSA_...}
                                       <-- Certificate(RSA)
                                       <-- ServerHelloDone
ClientKeyExchange**                    -->
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 示例


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…

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *