Hash

ServerKeyExchange 中 TLS 1.2 伺服器簽名中包含的參數

  • August 15, 2017

在 TLS 1.27.4.3 的標准文件部分中Server Key Exchange Message它說數字簽名涵蓋的參數如下:

dh_p 用於 Diffie-Hellman 運算的素數模數。

dh_g 用於 Diffie-Hellman 操作的生成器。

dh_Ys 伺服器的 Diffie-Hellman 公共值 (g^X mod p)。

這些參數首先被散列。我的問題是:當計算這些參數的雜湊值時,它是通過這些參數的串聯計算的嗎?還是它們以任何其他方式結合在一起?

第 7.4.3 節規定了這一點:

 struct {
     select (KeyExchangeAlgorithm) {
         case dh_anon:
             ServerDHParams params;
         case dhe_dss:
         case dhe_rsa:
             ServerDHParams params;
             digitally-signed struct {
                 opaque client_random[32];
                 opaque server_random[32];
                 ServerDHParams params;
             } signed_params;
         case rsa:
         case dh_dss:
         case dh_rsa:
             struct {} ;
            /* message is omitted for rsa, dh_dss, and dh_rsa */
         /* may be extended, e.g., for ECDH -- see [TLSECC] */
     };
 } ServerKeyExchange;

的含義在4.7 節digitally-signed中解釋。在這種情況下,上面的意思是簽名算法的輸入(即散列的)是按順序連接的:

  • 客戶端隨機(32 字節),由客戶端在ClientHello;
  • 伺服器隨機(32 字節),由伺服器在ServerHello;
  • 結構的編碼ServerDHParams。這是完整的編碼,包括長度字節。

ServerDHParams結構本身定義為:

 struct {
     opaque dh_p<1..2^16-1>;
     opaque dh_g<1..2^16-1>;
     opaque dh_Ys<1..2^16-1>;
 } ServerDHParams;     /* Ephemeral DH parameters */

因此,在散列函式中,緊隨客戶端和伺服器隨機數的 64 個字節之後,是編碼長度的兩個字節dh_p,然後是dh_p; 那麼這兩個字節的長度為dh_g,那麼dh_g; 最後,兩個字節的長度為dh_Ys,則dh_Ys

由於該ServerDHParams結構本身是作為 的一部分通過線路發送的ServerKeyExchange,因此可以更簡單地考慮如下:簽名的內容正是客戶端隨機數、伺服器隨機數和編碼 的字節的串聯ServerDHParams,如發送和接收。

引用自:https://crypto.stackexchange.com/questions/50886