Mac

如果 authentication-key 是從 nonce 派生的,是否需要對 nonce 進行身份驗證?

  • September 8, 2017

假設我的消息是這樣組成的:unique_message_nonce + encrypted_message + mac

因為我沒有 AEAD 方案,所以我可以通過兩種方式加密和驗證我的消息:

  1. 使用經過身份驗證的加密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)
  1. 加密消息併計算 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_noncekey也會改變並且認證將失敗
  • 在不知情的情況下master_key,攻擊者無法操縱unique_message_nonce創建惡意軟體。key

是的。假設KDFAuthEnc是安全的,並且您以正確的參數長度使用它們,那麼第一個是安全的。

通常,您將使用 2nd 並驗證所有內容,因為如果對 nonce 進行調整,他可能能夠在不更改 MAC.rrect 參數長度的情況下更改明文,是的,您的第一個方案是安全的。

在任何適當的 AE(AD) 方案中,nonce 都用於密文和 MAC 生成,因此對其進行篡改將不可避免地導致 MAC 驗證失敗。

我唯一要改變的是放棄隨機數計算。如果您已經知道unique_message_nonce實際上是唯一的(這就是 GCM 和 CCM 等最流行的 AEAD 方案所需要的全部),那麼從您的主密鑰派生 nonce 並沒有真正的意義。

我什至更喜歡第一版而不是第二版。對於開發人員來說,這要簡單得多,而且 AE(AD) 方案正是為您想要的而建構的。你自己做的步驟越少,你犯的錯誤就越少。

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