雙棘輪算法:端對端加密安全協議,原理以及流程詳解

我們繼續講解signal的核心技術:雙棘輪

在上一篇,我們先講了:X3DH,FS(前向安全),PCS(后向安全),然后簡單提了密碼學中的DH,HMAC, KDF, HKDF。這一篇,我們將詳細講解雙棘輪這個核心技術。

如果你要跟某個人進行安全通信,你會如何設計

假設你要做個系統,可以和某個人安全通信,站在安全性的角度,技術上應該如何設計?

思考時間......
思考時間......
思考時間......

  1. 首先,你可能會想到,如何與對方進行密鑰協商,這就涉及到DH。
  2. 其次,出于極致的安全性要求,你會考慮FS(前向安全),PCS(后向安全)。如何保證在某次通信中,被破解出來的密鑰,不能破解出之前的消息,而且在一定周期內,這個破解出來的密鑰將不會再起作用。

下面,我們來看看雙棘輪是如何做的

棘輪

我們先來感性認識一下棘輪:

pic2.1_mark.jpg

從感觀上,棘輪就是一種特殊的齒輪,他只能往一個方向轉下去,而不能往回轉。

在技術上,做到"只能往一個方向轉下去,而不能往回轉",是達到FS(前向安全)的關鍵。比如KDF,導出的KDF鏈只能往后面派生,而不能計算出前向的密鑰,這就保證了,如果某一輪的密鑰被破解出來,但前面的密鑰是無法計算出來的,也就是前面的消息無法被解密。

雙棘輪

雙棘輪,就是說,signal用了兩個棘輪來保證其安全性。這里先不展開,我們到最后再看,可能會更加清楚。

我們以一個真實場景來講解signal的通信技術

我們還是以Alice與Bob通信為例,講解這個核心技術。

Alice主動給Bob發第一條消息

X3DH

Alice要主動與Bob聯系,首先要進行密鑰協商。由于Bob可能不在線,所以Alice可以借助Bob存放在Server的公鑰進行。

Signal用的是X3DH,即Alice會去Server拿到Bob的長期公鑰IdentityKey,以及中期的公鑰SignedPreKey,以及臨時的公鑰PreKey。然后做X3DH,導出一個密鑰。

X3DH的具體做法可以看我的上一篇文章。

發送鏈與接收鏈

在signal中,Alice與Bob都分別有自己的發送鏈(chain)以及接收鏈。如下圖所示:

pic2.2_mark.jpg

這兩種鏈分別計算發送密鑰以及接收密鑰。

第一條消息

總體流程如下圖(為了能更簡單清晰地解釋,下面的圖已經是簡化過后的圖):

pic2.3_mark.jpg

Alice要給Bob第一條消息,需要初始化發送鏈:

  1. DH棘輪:Alice首先使用雙棘輪中的第一個棘輪:DH棘輪,進行DH計算,具體流程是:
    a) Alice生成一對臨時的key pair(公私鑰對)
    b) 用這個臨時的key pair的私鑰與Bob SignedPreKey的公鑰進行DH計算。

  2. KDF棘輪:Alice再使用雙棘輪中的第二個棘輪:KDF棘輪,導出三個密鑰KeyA1、Key1以及Key2。其中,KeyA1用于下一次發送鏈的Root Key(即salt),Key1用于加密消息,Key2用于派生下一輪的密鑰。

  3. 發送鏈密碼派生:如果Bob一直不給Alice發送消息,則Alice則一直使用此發送鏈發送消息,如上圖所示,第二輪使用Key2加鹽進行派生,第三輪使用Key4。

(PS:Signal實際的實現要比上述的復雜,但原理上一致的)

Bob接收到消息

Bob接收到消息后,會做兩件事情,第一件是初始化接收鏈,第二件是初始化發送鏈

初始化接收鏈

如下圖所示:

pic2.4 bob received_mark.jpg

與Alice的發送鏈對應,Bob使用相同的規則初始化接收鏈。

由于Bob進行X3DH,以及DH之后的值,是一樣的,所以可以產生相同的Key1,Key3進行解密。

初始化發送鏈

Bob在收到Alice的消息后,就可以初始化發送鏈了:

pic2.5 init send_mark.jpg

與Alice一樣:

  1. DH棘輪:Bob生成一個臨時的key pair,與Alice進行DH
  2. KDF棘輪:與Alice一樣,用上述的DH做Salt,導出三個密鑰
  3. 發送鏈密碼派生:與Alice一樣,第二輪使用Key2加鹽進行派生,第三輪使用Key4

在初始化發送鏈后,Bob就可以發送消息了。

Bob給Alice回消息

如下圖所示:

pic2.6 init received alice.jpg

Bob用自己發送鏈的密鑰加密消息后,給Alice發送消息。Alice在接收消息后,會做兩件事情,一個是初始化自己的接收鏈,第二個是重置自己的發送鏈

初始化自己的接收鏈如上圖所示,重置自己的發送鏈要重點講講。

Alice在收到Bob的消息后,會重置發送鏈

如下圖所示:

pic2.7 reinit sending_mark.jpg

Alice在收到Bob的消息后,會重置自己的發送鏈,可以想像為棘輪往后移了一格,這樣,KDF將重新計算,如果之前某輪的密鑰泄密了,從此刻開始,之前的密鑰將無法解密到消息,這滿足了PCS(后向安全)的特性。

具體做法是:

  1. Alice生成新的臨時key pair,與Bob的SigndPreKey做DH
  2. 將上一輪Key Chain導出的KeyA1做Salt,與上述的DH做KDF,導出KeyA2, Key1, Key2,同樣,KeyA2為下一輪發送鏈的salt, Key1用于此輪加密消息,Key2用于KDF。

Ping Pong

如上圖所示,Bob在收到Alice的消息后,也會重置發送鏈。

其實就是Ping Pong,Alice收到Bob消息會重復發送鏈,Bob也一樣。

從Alice的角度總結

從Alice的角度上看,發送鏈如下變化:

pic2.8 finish_mark.jpg

總結

本文詳細講解了signal中的核心技術:雙棘輪,包括了DH棘輪以及KDF棘輪。KDF棘輪保證了FS,而DH棘輪保證了PCS。

如果有什么問題,歡迎留言。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容