Skip to main content

8. Cryptographic Computations (密码学计算)

8.1. Computing the Master Secret (计算主密钥)

对于所有密钥交换方法, 使用相同的算法将预主密钥 (pre_master_secret) 转换为主密钥 (master_secret). 预主密钥应尽可能长; 目前, 它的长度为48字节对于RSA和Diffie-Hellman是典型的.

master_secret = PRF(pre_master_secret, "master secret",
ClientHello.random + ServerHello.random)
[0..47];

主密钥始终正好为48字节长. 预主密钥的长度因密钥交换方法而异.

8.1.1. RSA

当使用RSA作为密钥协商时, 客户端生成一个48字节的预主密钥, 使用服务器证书中的公钥对其进行加密, 并将结果发送到服务器. 服务器使用其私钥解密预主密钥. 双方然后将预主密钥转换为主密钥, 如上所述.

RSA加密的预主密钥消息结构:

struct {
ProtocolVersion client_version;
opaque random[46];
} PreMasterSecret;

client_version

  • 客户端支持的最新 (最高优先) 版本.

random

  • 由安全随机数生成器生成的46个字节.

8.1.2. Diffie-Hellman

使用Diffie-Hellman进行密钥交换时, 预主密钥是按照传统Diffie-Hellman计算的结果. 该值转换为固定长度的主密钥, 如上所述. 前导零字节不被去除.

注意: Diffie-Hellman参数在ServerKeyExchange消息中由服务器指定, 并由CertificateVerify消息提供认证 (当客户端认证时).

完整的计算细节和其他密钥交换算法的详细信息, 请参考RFC 5246第8节的完整文本.