メインコンテンツまでスキップ

8. 暗号計算 (Cryptographic Computations)

8.1. マスターシークレットの計算 (Computing the Master Secret)

すべての鍵交換方法において、pre_master_secretをmaster_secretに変換するために同じアルゴリズムが使用されます。master_secretが計算されたら、pre_master_secretはメモリから削除されるべきです。

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

マスターシークレットは常に正確に48バイトの長さです。プリマスターシークレットの長さは、鍵交換方法によって異なります。

8.1.1. RSA

RSAがサーバー認証と鍵交換に使用される場合、48バイトのpre_master_secretがクライアントによって生成され、サーバーの公開鍵で暗号化され、サーバーに送信されます。サーバーは秘密鍵を使用してpre_master_secretを復号化します。その後、両者は上記のようにpre_master_secretをmaster_secretに変換します。

RSA暗号化されたプリマスターシークレットメッセージ構造:

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

client_version

  • クライアントがサポートする最新 (最高) バージョン。これはバージョンロールバック攻撃を検出するために使用されます。

random

  • 安全に生成された46バイトのランダムデータ。

8.1.2. Diffie-Hellman

従来のDiffie-Hellman計算が実行されます。ネゴシエートされた鍵 (Z) がpre_master_secretとして使用され、上記のようにmaster_secretに変換されます。すべてゼロビットを含むZの先頭バイトは、pre_master_secretとして使用される前に削除されます。

注意: Diffie-Hellmanパラメータはサーバーによって指定され、一時的なものであるか、サーバーの証明書に含まれている可能性があります。

完全な計算の詳細および他の鍵交換アルゴリズムに関する情報については、RFC 5246のセクション8の完全なテキストを参照してください。