2014-06-12 25 views
4

我正在編寫一個應用程序,用戶可以使用端到端加密在設備之間進行通信。爲此,我使用libsodium加密庫。非對稱加密函數crypto_box(...)需要一個隨機數作爲參數之一。如何在非對稱加密(libsodium)中使用隨機數?

我對如何處理隨機數感到困惑。每個給一個人的消息都需要使用不同的隨機數進行加密嗎?這看起來不正確,因爲我必須將使用過的隨機數存儲在具有公共訪問權限的服務器上,攻擊者可以再次使用其中一個使用過的隨機數。

從A發送到B的所有消息具有不同的隨機數還是不能使用從A發送消息到B不能用於從C發送到B?

有人可以請解釋給我。

+2

「nonce」實際上是「Number used ONCE」的縮寫。所以是的,你使用不同的數字! – OJFord

回答

3

是否需要使用不同的隨機數來加密一個人的每條消息?

是的。實際上,從來沒有,有史以來使用相同的隨機數多於一個相同的私鑰。確實,你將不得不跟蹤nonce來完成這一點。

這似乎不正確,因爲我必須將使用的隨機數存儲在具有公共訪問權限的服務器上,攻擊者可以再次使用其中一個使用的隨機數。

爲什麼你需要將你的隨機數存儲在公共服務器上?你認爲攻擊者如何「使用」nonce?他們需要你的私鑰才能這樣做。

爲什麼你不能將隨機數存儲在與私鑰相同的地方?

+0

但是,當A想要將加密的消息發送給B時,A使用B的PUBLIC密鑰加密消息。這是我感到困惑的地方。因此,A決定了隨機數,B不能控制使用哪一個隨機數來加密發送給B的消息,然後用B的私鑰解密。我在這裏錯過了什麼? – joakimb

+0

找到這個鏈接:http://curvecp.org/nonces.html,它說:「在一個特定的nonce被用來加密一個數據包之後,永遠不能使用相同的nonce來加密從發送者的密鑰到這個數據包的另一個數據包接收方的公共密鑰,並且不得使用相同的隨機數來加密從接收方的密鑰到發送方公鑰的另一個數據包。「現在我明白了,只有在A和B之間,同一個隨機數不能被使用兩次。 – joakimb

+4

如果A向B發送加密消息,B是否必須使用相同的隨機數(用於通過A加密消息)來解密消息?或者它生成一個新的隨機數來解密消息。我明白加密和解密需要彼此的公鑰。我試圖弄清楚的是,如果需要在A和B之間交換非公開密鑰以外的其他數據,必須交換隨機數。 – Feru

2

對於使用給定共享密鑰發送的每條消息,都需要唯一的隨機數。隨機數不一定是保密的;一個簡單的櫃檯是完全正確的;即使發送兩次相同的消息,改變隨機數中的一位也會使密文看起來完全不同。

什麼是共享祕密?它是從(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_boxcrypto_secretbox,只需每次隨機選擇一個隨機數(randombytes_buf(nonce, sizeof nonce))即可安全使用。