棘輪密鑰對在信號協議中多久更改一次?
起初,我認為新的棘輪鍵是隨每條第一條傳入消息創建的。在那之後,我相信這取決於實施。但仔細查看信號文件和下圖後,我更加困惑。
上圖顯示 Alice 發送消息 A2,然後接收來自 Bob 的消息 B2,Bob 使用他的舊密鑰。這怎麼可能?Bob 不應該在收到 Alice 的 A2 消息時更新他的密鑰。消息 A2 具有一個新的棘輪密鑰,並且應該在 Bob 側觸發 DH 棘輪並更新他的接收和發送鏈,因此他的下一條消息(B2)將使用新創建的密鑰?
我在這裡缺少什麼?
每個傳入消息都會生成新的棘輪密鑰對,以派生新的發送鏈密鑰,並保留最後一個棘輪密鑰對以派生接收鏈的密鑰。如圖所示,Bob
public ratchet key B1
正在使 DHE 派生用於接收消息的密鑰,B1
並且B2
還public ratchet key B1
使用 Alice 的新棘輪密鑰對來派生 DHE 以派生用於發送消息的密鑰。
A4
只要 Alice 沒有收到 Bob 的任何消息,發送鏈實際上就會超出。一旦 Bob 回复,Alice 將為發送鏈創建新的棘輪密鑰對。該圖顯示,當 Bob 回复消息B1
和時B2
,Alice 用消息終止鏈並A1
生成一個新的棘輪密鑰對來發送A2
和。A3``A4
首先,新的 DH 棘輪密鑰的頻率由實施決定。
當 Alice 在 bob 發送的消息的標頭中收到新的公鑰時,Alice 將觸發 DH 棘輪步驟(雙棘輪規範的第 4.1 節)
$$ 0 $$進入它的細節)。在這種情況下,
B2
的標頭沒有新的公鑰,whileB3
和B4
do。 提出您的問題,是否A2
有新密鑰都沒有關係。為什麼?因為該協議允許消息使用舊密鑰到達。想想 Alice 的消息沒有傳遞但 bob 繼續發送消息的情況。$$ 0 $$ https://signal.org/docs/specifications/doubleratchet/