Encryption

AEAD 中的關聯數據是什麼?

  • September 20, 2020

我試圖了解什麼是 AEAD。我是應用程序開發人員而不是密碼學家。我在網上搜尋了一段時間,看了一堆 Youtube 影片,閱讀了幾本書“Serious Cryptography”和“Understanding Cryptography”,但發現 AEAD 的解釋過於簡潔。我的目標是在使用加密庫時了解文件,他們提到了 AEAD 以及 AES 各種模式的優缺點。以下是我對 AEAD 的疑問。

  • AEAD 解決的範例問題/場景是什麼?(尋求了解問題而不是解決方案)
  • AEAD 如何解決這個問題?(不是算法細節,而是更高層次的大圖)
  • 關聯數據的典型例子有哪些?
  • 如果不使用 AEAD,攻擊者能做什麼?(很多線上參考都談到了填充預言攻擊,我試圖理解這種攻擊,但似乎需要深入了解 AES 的工作原理)
  • 作為開發人員,我應該始終使用 AEAD 嗎?
  • 開發人員在應用 AEAD 時會犯哪些典型錯誤?
  • AEAD 是否僅對分組密碼需要,而對流密碼不需要?
  • 使用 RSA 等公鑰加密時是否需要 AEAD?

首先我們來看看什麼是AAD;它是一個必須在加密和解密時都出現的字元串;如果解密器提供了錯誤的字元串,則解密失敗。

為什麼這很有用?因為AAD可以理解為“加密上下文”。我們通常使用相同的密鑰來加密多條消息。AAD 阻止的是攻擊者獲取一個有效密文,並用它替換另一個密文(使用相同的密鑰加密);如果解密器對兩個不同的上下文使用不同的 AAD,那麼解密將失敗(並且攻擊被阻止;如果攻擊者只是希望解密失敗,他可以用隨機亂碼替換密文)。

另一種方法是每次只使用一個單獨的密鑰;那行得通,但是 AAD 通常以較低的複雜性解決問題。

所以,回答你的問題:

AEAD 解決的範例問題/場景是什麼?

你要了一個;我給你兩個:

  • 考慮 TLS,其中單個記錄使用相同的密鑰進行加密。TLS 使用包含記錄序列號(隨每條記錄遞增)的 AAD;這可以防止攻擊者重播以前發送的記錄。
  • 考慮數據庫加密,我們對數據庫中的各個欄位進行加密,例如,提供員工姓名的數據庫

$$ 1 $$(未加密)和薪水(加密)。如果攻擊者可以(比如說)拿走 Alice 的薪水,並將其寫入 Bob 的行中,那就太糟糕了。通過使用員工姓名作為 AAD,攻擊者無法在未檢測到的情況下執行此操作。

AEAD 如何解決這個問題?(不是算法細節,而是更高層次的大圖)

GCM 所做的是將 AAD 攪拌到標籤中;如果 AAD 不正確,則標籤不會驗證(在這種情況下您應該拒絕解密)。

如果不使用 AEAD,攻擊者能做什麼?

用另一個密文替換一個密文

作為開發人員,我應該始終使用 AEAD 嗎?

好吧,如果您將相同的密鑰用於多種用途,您可能應該為每個加密使用不同的 AAD。另一方面,如果您使用密鑰僅加密一條消息(例如,作為IES中的對稱部分),則無需

AEAD 是否僅對分組密碼需要,而對流密碼不需要?使用 RSA 等公鑰加密時是否需要 AEAD?

通常,需要解決重放問題,但是流密碼和公鑰方法通常使用不同的方法。

使用流密碼,我們經常生成一個長字元串,並使用不同的部分來加密單個消息——這可以防止重放攻擊。其他時候(當我們需要能夠亂序解密消息時),我們將 nonce 作為流密碼的輸入,並使用更高級別的協議確保 nonce 不被重用。

使用公鑰加密,它通常在更高級別處理,可能使用隨機數……


$$ 1 $$:一個真正的數據庫更有可能有一些序列號而不是名稱;對於這個例子,我將忽略它。

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