RSA Key exchange
本篇文章, 我们以 TLS_RSA_WITH_AES_253_CBC_SHA256 为例,来学习一种 TLS Key 交换算法.: RSA key 交换算法.
注意, 这种 key 交换算法已经被证明并不安全,因此请在实践中不要使用它,
这里我们只是以此来学习以下相关算法原理.
握手过程
使用 RSA Key 交换算法的 TLS 握手流程大体如下:
Client ServerClientHello{CipherSuites: TLS_RSA_...} --><-- ServerHello{CipherSuite: TLS_RSA_...}<-- Certificate(RSA)<-- ServerHelloDoneClientKeyExchange** -->ChangeCipherSpec -->EncryptedHandshakeMessage --><-- ChangeCipherSpec<-- EncryptedHandshakeMessag
算法解析
RSA Key 交换算法流程:
1. TLS 服务器端
当 TLS 握手过程中选择了 RSA key 交换算法。 服务器会发送一个 RSA 的证书给客户端。这个证书有两个作用:
- 用于表示服务器的身份信息,用于身份认证。
 - 用于进行 RSA key 交换
 
当使用 RSA key 交换算法的时候,通常不需要再额外的发送 ServerKeyExchange 包。
2. TLS 客户端
客户端收到服务器端的证书之后,进行如下操作:
- 使用一个安全的随机数生成方法,生成48个字节。
 - 把前两个字节替换为 
ClientHello中所携带的 TLS 版本信息对应的字节。 此时,这个 48 字节的随机数就是此次 TLS 会话中要使用的premaster key. - 客户端使用服务器端发送过来的公钥,对这个随机数组进行加密。
 - 加密之后的内容,通过 
ClientKeyExchage发送给服务器端。 
3. TLS 服务器端
当服务器端收到来自客户端的 ClientKeyExchage之后, 使用对应的证书的私钥对其中携带的 premaster key 进行解密。
至此, 客户端和服务器已经共享了一个相同的 premaster key。 Key 交换就此完成。
为什么不安全?
因为它不是完全正向保密(Perfect forward secrecy). 参考: https://en.wikipedia.org/wiki/Forward_secrecy
ClientKeyExchange 示例
Transport Layer SecurityTLSv1.2 Record Layer: Handshake Protocol: Client Key ExchangeContent Type: Handshake (22)Version: TLS 1.2 (0x0303)Length: 134Handshake Protocol: Client Key ExchangeHandshake Type: Client Key Exchange (16)Length: 130RSA Encrypted PreMaster SecretEncrypted PreMaster length: 128Encrypted PreMaster: 56dda7828..a4987ff…