Hash

校驗和是否可以在流中的第一個損壞字節上儘早退出?

  • December 4, 2019

假設您想將文件的字節從電腦 a 傳輸到 b,但如果任何字節錯誤,您希望儘早退出。

為整個文件規定雜湊/校驗和實現很容易。例如,sha-256 可能就足夠了,只需要傳輸 256 個額外位,對於任何重要大小的文件,256 個額外位可以忽略不計。

但是,如果您想在傳輸過程中的多個點進行檢查,以便您可以提早保釋,我假設傳輸雜湊的成本會隨著檢查間隔接近檢查每個字節而增加……除非我錯過了一些聰明的東西,我認為它變得難以證明。

你知道其他人是如何處理這個問題的或有什麼建議嗎?也許沒有聰明的方法可以解決它,您必須選擇一個合理的折衷方案,比如每兆字節一個雜湊?

(我的應用是我想建構一個小型/安全的虛擬機+語言,實現任意壓縮/解壓縮算法來生成文件。對於解壓縮,如果發出任何意外字節,我希望機器提前停止。)

..其他人是如何處理的(如果任何破譯的字節有誤,請儘早保釋)

具有這種副作用的一個相對常見的做法是將明文中的字節限制為某個離散子集(例如 Base64 字元,或設置了奇數位的字元),並在不屬於該子集的第一個解碼字節處停止。不要這樣做,有兩個原因:

  • 如果攻擊者可以檢測到接收器何時中止(這很常見並且應該是預設假設),它通常會引發破壞消息保密性的填充預言攻擊。
  • 它對對抗性修改並不安全,程度因密碼而異。最壞的情況是流密碼,包括 CTR 和 OFB,即使原始明文未知,密文也可以通過簡單的修改來逃避這種檢測方法。在大多數其他模式下,它也不能很好地工作,尤其是在某些明文已知的情況下。

有什麼建議嗎?

在立即檢測單個字節損壞和失去頻寬之間存在折衷。通過計數參數,對於剩餘機率 $ \epsilon $ 沒有立即發現腐敗 $ n $ 比特,我們需要犧牲 $ \log_2(1/\epsilon) $ 每個位 $ n $ 位。保持相對成本的唯一方法 $ 1/(n/\log_2(1/\epsilon)+1) $ 沒有立即檢測到改變的低剩餘機率是增加塊大小 $ n $ 超過一個字節。

TLS 具有驗證單個加密塊的功能,我相信它在其現代密碼套件中所做的一切都很好,並且可以小心重用。但我不知道它使用什麼方法。

一種可推薦的方法是使用多個獨立的資訊塊,每個資訊塊都使用經過身份驗證的加密模式單獨加密和驗證,並採取一些措施來防止替換塊。最簡單的方法是使用顯式增量塊編號對它們進行編號。但我們希望最大程度地減少失去的頻寬:

  • 塊號可以免費獲得:我們將它們包含在經過身份驗證的有效負載中,但既不加密也不傳輸它們。AES-GCM 支持這一點。
  • 身份驗證模式的 IV/Nonce 可以免費提供:它們可以從帶有額外密鑰的 CSPRNG 中派生(可能使用該密鑰和從主密鑰派生的加密密鑰)。

我們可能還想為中間塊使用一個簡短的身份驗證標籤,以節省頻寬,但最大限度地提高以前未檢測到的更改的可能性,因為它稍後會被檢測到。我不知道標準方法,但是如果計算效率不是問題,可以即興發揮:我們可以在下一個塊中包含前一個塊(包括其經過驗證的數據)的 MAC(使用獨立密鑰製成,例如派生的)經過身份驗證的和隱含的數據。此外,我們可以使用散列而不是 MAC,如果經過身份驗證的加密使得通過完整性測試不會損害經過身份驗證的數據的機密性,而這是隱式的(至少在使用 MAC 檢查完整性時是這種情況)。

如果我們只對最後一個塊使用大的身份驗證標籤,則必須有一些安全的方法來辨識該塊,這不能掉以輕心。一種安全的方法是使其具有可辨識的長度為該塊使用不同的派生密鑰。

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