對於使用給定共享密鑰發送的每條消息,都需要唯一的隨機數。隨機數不一定是保密的;一個簡單的櫃檯是完全正確的;即使發送兩次相同的消息,改變隨機數中的一位也會使密文看起來完全不同。
什麼是共享祕密?它是從(A的祕密密鑰,B的公鑰)或(A的公鑰,B的祕密密鑰)計算得出的密鑰。 A和B根據他們的具體情況執行不同的計算,但最終得到相同的共享密鑰。
crypto_box
中使用的共享機密長度爲256位。這是巨大的。您可以放心地認爲,共享祕密對每個「對話」都是獨一無二的。因此,(A,B),(A,C)和(C,B)可以安全地使用相同的隨機數交換消息。 但是,如果A使用給定的隨機數向B發送消息,則B不能使用相同的隨機數發送消息給A。在A和B之間的對話期間交換的所有東西都必須是唯一的。
所以,一個簡單的計數器可以很好。有一個選擇偶數,給B留下奇數,每發送一條消息後將現時數加2,你就可以走了。
但crypto_box
結構中使用的密碼實際上有一個非常巨大的隨機數。 192位。
這意味着,如果您忽略了我寫的所有內容,並且每次發送消息時都會隨機選擇一個隨機數,碰撞的可能性非常小,您可以放心,它在實踐中永遠不會發生。
鈉(AES128-CTR,ChaCha20,Salsa20)中包含的一些流密碼具有較短的隨機數,並且需要計數器以避免碰撞。這就是爲什麼他們在文檔的「高級」部分。
但是使用crypto_box
和crypto_secretbox
,只需每次隨機選擇一個隨機數(randombytes_buf(nonce, sizeof nonce)
)即可安全使用。
「nonce」實際上是「Number used ONCE」的縮寫。所以是的,你使用不同的數字! – OJFord