Protocol-Design

對丟包率高的超短消息使用 ChaCha20

  • September 14, 2016

我正在建構一個低功耗無線網路,需要定期傳輸非常小的數據包(每分鐘 10 個字節左右)。為了確保通信安全,我正在考慮使用 Chacha20 和預共享密鑰。

我遇到的問題是傳達 IV。我可以在每條消息的開頭廣播它,但這會導致消息長度幾乎翻倍,因此傳輸過程中的電力使用。

我考慮同意一種計算 IV 的方法(即使用發送器地址作為隨機數和一個簡單的發送數據包計數器),但是如果消息因任何原因被丟棄,這會帶來風險。

在我走上定義解決這個問題的特別方法的道路之前,我想我會問一下,看看是否有人以前解決過這個問題,以及你們都有什麼建議。

我的備用方法是使用地址生成隨機數,然後使用數據包計數器並僅傳輸最低位字節。這只會在消息長度上增加一個字節,理論上允許我錯過 255 條消息並且仍然“重新同步”數據包計數器。沒有我想要的那麼強大,但比我自己想出的任何東西都要好。

如果我沒記錯的話,ChaCha 不需要一個不可預測的 IV,所以一個簡單的計數器就可以了。(如果您有多個使用相同密鑰的發件人,則結合發件人 ID。)如果您有一個完全無損的連結,則根本不需要發送計數器值。

但由於某些數據包可能會失去,因此您至少需要發送部分計數器。最低有效的 8 位應該可以很好地防止隨機封包遺失,只需確保在溢出發送部分時增加下一位,因此您最終不會重複相同的 256 IV 值。即使每個數據包有 90% 的獨立失去機會,連續失去 250 個數據包的機率也小於 $ 10^{-11} $ .

非獨立封包遺失將是另一回事,但每分鐘一條消息,您需要連續失去四個小時的數據包才能失去同步。如果夜間接收器斷電但發射器繼續發送,則可能會發生這種情況。

說到斷電,您的發射器需要為計數器提供一些持久儲存,以便在設備斷電時不會重置。正如@otus 評論的那樣,作為計數器的實時時鐘也可以。

另請注意,您似乎沒有對消息進行任何身份驗證,因此您只能受到被動攻擊者的保護。

引用自:https://crypto.stackexchange.com/questions/39966