Mac
如果 authentication-key 是從 nonce 派生的,是否需要對 nonce 進行身份驗證?
假設我的消息是這樣組成的:
unique_message_nonce + encrypted_message + mac
因為我沒有 AEAD 方案,所以我可以通過兩種方式加密和驗證我的消息:
- 使用經過身份驗證的加密
message
:let key = KDF(key: master_key, info: "Key:" + unique_message_nonce) let nonce = KDF(key: master_key, info: "Nonce:" + unique_message_nonce) let (encrypted_message, mac) = AuthEnc(key: key, nonce: nonce, message: message)
- 加密消息併計算 MAC
unique_file_nonce + encrypted_message
:let encryption_key = KDF(key: master_key, info: "EncKey:" + unique_message_nonce) let encryption_nonce = KDF(key: master_key, info: "EncNonce:" + unique_message_nonce) let encrypted_message = Enc(key: encryption_key, nonce: encryption_nonce, message: message) let mac_key = KDF(key: master_key, info: "MACKey:" + unique_message_nonce) let mac = Auth(key: mac_key, message: unique_file_nonce + encrypted_message)
第一個安全嗎?
通常,您會使用第二個並驗證所有內容,因為如果對隨機數進行調整,他可能能夠在不更改 MAC 的情況下更改明文。
但是,據我所知,在第一個
unique_message_nonce
中,MAC 中隱含包含:
- 如果這樣改變
unique_message_nonce
,key
也會改變並且認證將失敗- 在不知情的情況下
master_key
,攻擊者無法操縱unique_message_nonce
創建惡意軟體。key
是的。假設KDF和AuthEnc是安全的,並且您以正確的參數長度使用它們,那麼第一個是安全的。
通常,您將使用 2nd 並驗證所有內容,因為如果對 nonce 進行調整,他可能能夠在不更改 MAC.rrect 參數長度的情況下更改明文,是的,您的第一個方案是安全的。
在任何適當的 AE(AD) 方案中,nonce 都用於密文和 MAC 生成,因此對其進行篡改將不可避免地導致 MAC 驗證失敗。
我唯一要改變的是放棄隨機數計算。如果您已經知道unique_message_nonce實際上是唯一的(這就是 GCM 和 CCM 等最流行的 AEAD 方案所需要的全部),那麼從您的主密鑰派生 nonce 並沒有真正的意義。
我什至更喜歡第一版而不是第二版。對於開發人員來說,這要簡單得多,而且 AE(AD) 方案正是為您想要的而建構的。你自己做的步驟越少,你犯的錯誤就越少。