不同消息編號方案的優缺點
對於數據包流,其中每個數據包都使用分組密碼單獨加密,希望每個加密數據包僅對流中的該位置有效。
消息編號會起作用,但有許多不同的實現方式。
給定一個使用 HMAC 進行完整性檢查的構造(即我們發送**(HMAC || cipher-text)或(HMAC || IV || cipher-text),其中 HMAC分別位於密文或(IV || cipher-text)**之上)。
我可以想到以下幾點:
- 加密**(message || message-number)**,解密後檢查消息號。
- HMAC 代替**(encrypted-message || IV || message-number)**,消息編號檢查內置在 HMAC 中。
- 不要重新播種 IV,因此假設 CBC 目前數據包的 IV 是前一個數據包的最後一個塊的密文。
- 使用一個隨機的初始IV,那麼對於每個數據包,實際使用的IV是HASH(IV || message number)
- 使用一個隨機的初始IV,然後對於每個數據包,實際使用的IV是ENCRYPT(IV + message number)
添加消息編號的標準方法是什麼,我上面提到的其他方法是否存在任何已知的安全風險?
如果接收方可以在解密前等待所有數據包:
這種情況很簡單,因為您的最終目標是確保您解密的明文與您加密的明文完全相同。(簡單地說,這包括拒絕重新排序的明文。)對所有數據包使用認證加密(AE)方案(例如,CCM、GCM 等),將數據包內容視為同一消息的連接部分。接收方等待所有數據包到達,然後對其進行身份驗證和解密。如果身份驗證失敗,則消息在某種程度上有所不同,可能是因為內容被重新排序,也可能是其他原因。
如果接收方必須在數據包到達時對其進行解密:
單獨加密每個數據包。使用支持額外認證數據的 AE 方案,例如 CCM 或 GCM。此類方案旨在加密秘密有效載荷,並在明文數據旁邊驗證相同的秘密有效載荷,這通常是與密文相關的元數據。如果身份驗證通過,接收方可以確定秘密有效載荷與明文元數據相對應,並且兩者都未更改。
這使您可以加密明文 $ M $ 作為 $ C=E(M) $ , 驗證密文 $ C $ 連同明文數據包編號/計數器 $ ctr $ ,然後發送 $ (C,ctr) $ 到接收器。接收方驗證 $ (C,ctr) $ 正確驗證,這意味著 $ ctr $ 屬於那個包。
據推測,數據包編號不是秘密,因為攻擊者可能無論如何都可以監視線路併計算數據包。儘管如此,數據包編號 $ ctr $ 可以從發送方傳輸的數據中省略,接收方可以直接替換 $ ctr $ 他們收到數據包並執行身份驗證時所期望的值。
擬議計劃
這假設您使用 CBC 進行加密,使用 HMAC 進行身份驗證。
- 這是一個不錯的選擇。從概念上講,您已經為您的數據創建了一個非常簡單的自包含協議,該協議封裝了數據包的順序。然後數據包被簡單地加密和驗證。這是最簡單的方案,也是最不可能搞砸的。
- 這本質上是為密文和附加關聯數據(
message-number
是關聯數據)建構 AE 方案。可能encrypted-message
是可變長度,但message-number
可能是固定長度。如果它是固定長度,這應該可以工作,如果它是可變長度,則需要修改。- 這是有潛在風險的。CBC 加密消息的 IV 應該是不可預測的,並且您正在處理離散的數據包。如果攻擊者可以控制數據包中的數據並且已經看到了前一個數據包,他們將知道他們將要生成的數據包的 IV,並可以使用它來發起攻擊。有一種流行的 TLS/SSL 攻擊利用了這種類型的 CBC IV 連結。
- 這個選項實際上是沒有意義的。它要求原始隨機 IV 與派生的(也稱為“實際的”)IV 一起發送,兩者都與密文一起 MAC’d。驗證
message-number
將包括使用隨機 IV 和預期的 重新推導真實的 IVmessage-number
。它本質上是選項(2):它們都有一個message-number
基於 IV 的值和密文。(要了解為什麼必鬚髮送兩個 IV:如果只發送原始隨機 IV,我們無法驗證派生的 IV 是否正確。HMAC 僅涵蓋密文和隨機 IV,因此之後 HMAC 會檢查數據包接收方將導出真實的 IV 並且沒有任何東西可以檢查它。如果
message-number
錯誤,則派生的 IV 是錯誤的,並且第一個明文塊被丟棄,但被丟棄的第一個明文塊並不總是可以檢測到。如果只發送派生 IV,則接收者無法驗證
message-number
派生 IV 的用途。HMAC 將驗證派生的 IV 和密文,但接收者將只使用 IV 解密,不知道message-number
應該使用什麼來生成它。) 5. 這會起作用,但如果您發送“實際”IV,它與選項(1)幾乎相同,因為接收者需要message-number
通過解密 IV 來檢查(選項(1)需要解密明文)。在列出的那些中,選項 (1) 可能是最好的。執行消息排序的不是加密本身,而是封裝在數據包中的“協議”。選項(2)似乎也完全合理。