Mac
將 MAC 欄位設置為全零以指示未加密的數據
我目前正在做一個項目,我們在兩個系統之間傳輸數據。數據通常在傳輸前被加密,但是有些傳輸是未加密的。
我們使用以下數據格式進行傳輸:
Encrypted-Data [64Bytes] | MAC [16 Bytes]
接收系統首先解密並驗證消息來源的真實性,然後進一步處理數據。
我對這個問題的解決方案是在傳輸之前將 MAC 的所有位設置為零,以指示消息未加密。
現在我的問題:
- MAC 計算結果可以為零(我們使用Poly1305)嗎?
- 使用設置為零的 MAC 來指示未加密的數據是一種好習慣嗎?
是的,MAC 當然可以有一個全零的結果。但這並不重要,因為發生這種情況的機會應該與從每個元素具有相同機率的集合中隨機選擇相同,即具有均勻分佈。
因此,在這種情況下,出現全零的機會應該是大約 $ 1 $ 在 $ 2^{128} $ ,當然假設消息每次都發生變化(沒有預先知道的機會是相同的,但是相同的輸入當然會導致相同的 MAC 值,所以就是這樣)。現在,一次性猜出 AES-128 密鑰的機會相同,即它發生的機會可以忽略不計。所以在實踐中你的方案可以很好地使用。
提醒自己,雖然應該避免使用魔法值作為一般原則。當然,更糟糕的是,如果消息未加密,您將刪除 MAC 提供的所有安全性。MAC 提供的完整性和真實性對未加密的消息也有價值。
所以是的,你當然可以使用這個方案,但我寧願為此犧牲任何其他一點。我不會稱之為好的做法。只有在沒有其他需要犧牲的情況下,我才會使用該方案(即協議已經建立,我現在必須執行 hack 以添加額外的選項)。
$$ EDIT $$請注意,具有可選 MAC 的方案中的對手可以向您發送任何(未加密的)消息。通常我們需要一個 MAC 來避免這種情況。