跳到主要内容

8. 密码学计算 (Cryptographic Computations)

8.1. 计算 Master Secret (Computing the Master Secret)

对所有 key exchange method, 都使用相同 algorithm 将 pre_master_secret 转换为 master_secret. 一旦 master_secret 计算完成, pre_master_secret 应从内存中删除.

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

master secret 长度始终正好为 48 byte. premaster secret 的长度会随 key exchange method 不同而变化.

8.1.1. RSA

当 RSA 用于 server authentication 和 key exchange 时, client 生成一个 48-byte pre_master_secret, 使用 server public key 加密并发送给 server. server 使用 private key 解密 pre_master_secret. 双方随后按上文规定将 pre_master_secret 转换为 master_secret.

RSA-encrypted premaster secret message 结构如下:

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

client_version: client 支持的最新最高版本. 该字段用于检测 version rollback attack.

random: 46 个安全生成的 random byte.

8.1.2. Diffie-Hellman

执行常规 Diffie-Hellman 计算. 协商出的 key (Z) 用作 pre_master_secret, 并按上文规定转换为 master_secret. Z 中全为零 bit 的 leading byte 会在作为 pre_master_secret 使用前被剥离.

Diffie-Hellman 参数由 server 指定, 可以是 ephemeral 参数, 也可以包含在 server certificate 中.