資訊與網路安全技術 第 八章 安全性網頁系統  上一頁     

 

8-7 SSL 會議鑰匙的計算

內容:

  • 8-7-1 SSL 鑰匙區塊產生

  • 8-7-2 鑰匙產生範例

8-7-1 SSL 鑰匙區塊產生

經過公開鑰匙系統(如 RSA Diffie-Hellman)協議及計算出『主密鑰』之後,接下來,必須利用它來計算出秘密鑰匙系統所需的會議鑰匙。圖 8-12 是利用主密鑰產生會議鑰匙的運作程序。首先由主密鑰產生一個鑰匙區塊,它的長度如何是加密套件規範而定,接著再依序由鑰匙區塊中取出各種鑰匙的『密鑰』(Secret),最後加入通訊連線中所產生的亂數,經由 MD5 計算後,產生完成的會議鑰匙,以下分別介紹各個程序。

8-12 SSL 鑰匙計算程序

(A) 鑰匙區塊產生

SSL 協定利用主密鑰產生一個稱之為『鑰匙區塊』(Key Block)的鑰匙序列,再利用鑰匙區塊來產生各種鑰匙。鑰匙區塊的計算如下:

key_block = MD5(master_secret || SHA(“A”|| master_secret || ClientHello.random || ServerHello.random)) ||

MD5(master_secret || SHA(“BB”|| master_secret || ClientHello.random || ServerHello.random)) ||

MD5(pre_master_secret || SHA(“CCC”|| pre_master_secret || ClientHello.random || ServerHello.random)) || …..

可以發現,鑰匙區塊的計算方式與主密鑰很相似,祇不過將 pre_master_secret 改成 master_secret 而已(計算程序如圖 11-11 所示)。但主密鑰祇計算三次(長度 48 位元組),而鑰匙區塊到底需要計算幾次,這可依所協商的加密套件而定。依照加密套件所參考的參數如下:

  • client_write_MAC_secret [CipherSpec.hash_size]:客戶端計算 MAC 鑰匙的長度。

  • server_write_MAC_secret [CipherSpec.hash.size]:伺服端計算 MAC 鑰匙的長度。

  • client_write_secret [CipherSpec.key_material]:客戶端加密訊息鑰匙的長度。

  • server_write_secret [CipherSpec.key_material]:伺服端加密訊息鑰匙的長度。

如果所計算出來的鑰匙區塊超出所需長度,則拋棄後面多出來的位元。

(B) 計算相關鑰匙

基本上,美國允許出口的加密系統的鑰匙都較短,為了增加它的安全性,SSL 協定規定除了利用鑰匙區塊計算之外,再增加一次雜湊演算法計算,來增加它的安全性,計算方式如下:

          final_client_write_key = MD5(client_write_key || ClientHello.random || ServerHello.random)

final_server_write_key = MD5(server_write_key || ServerHello.random || ClientHello.random)

另外,某些加密演算法需要『起始向量』(IV),譬如 CBC 加密套件,它的產生方式如下:

client_write_IV = MD5(ClientHello.random || ServerHello.random)

server_write_IV = MD5(ServerHello.random || ClientHello.random)

值的注意的是,Client Server 計算會議鑰匙與 IV 之間的亂數排列次序並不相同。經過 MD5 計算後,應該產生 128 bits16 Bytes)長度的雜湊值,隨著各種演算法擷取前面所需的位元,而拋棄到後面多出來的位元。譬如,採用 DES 演算法,則取用前面 56 bits,而拋棄後面剩下來的位元。

8-7-2 鑰匙產生範例

我們以 SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5 安全套件,說明鑰匙區塊、加密鑰匙與 MAC 鑰匙的產生過程,該套件需要兩個 MAC 鑰匙與兩個加密鑰匙,分別分配給客戶端與伺服端持有,其中 MAC 鑰匙需要 16 Bytes、加密鑰匙需要 5 Bytes 的鑰匙材料來計算,因此,鑰匙區塊必須產生高於 42 Bytes 的鑰匙長度。鑰匙區塊每經過一次 MD5 計算,會產生 16 Bytes 的鑰匙材料,因此,必須計算 3 次產生 48 Byte,之後再取前面 42 Bytes 的鑰匙材料。選用鑰匙區塊的次序如下:(以位元組計算)

  • client_write_MAC_secret = key_block[0,.., 15]

  • server_write_MAC_secret = key_block[16, …, 31]

  • client_write_key = key_block[32, …, 36]

  • server_write_key = key_block[37, …, 41]

選擇完鑰匙區塊之後,接下來計算最後的加密鑰匙,其中會依照所需長度來擷取,如下:

  • final_client_write_key = MD5(client_write_key || ClientHello.random || ServerHello.random) [0. …, 15]

  • final_server_write_key = MD5(server_write_key || ServerHello.random || ClientHello.random) [0, …, 15]

  • client_write_IV = MD5(ClientHello.random || ServerHello.random) [0, …, 7]

  • server_write_IV = MD5(ServerHello.random || ClientHello.random) [0, …, 7]

我們可以看出,採用 RSA RC2 加密演算法需要 128 bits16 Bytes)長度的鑰匙,HMAC-MD5 也是;另外,加密演算法的起始向量為 64 bits8 Bytes)。

主講人:粘添壽博士

 

資訊與網路安全技術