Modes-of-Operation

GCM:處理密文後更新 AAD 背後的數學

  • December 18, 2018

在 Bouncy Castle 庫中,GCM 密碼實現有一個有趣的屬性,似乎沒有在 GCM 論文(NIST 或原始論文)中描述:

密碼開始後發送了一些 AAD。我們確定密碼開始時實際使用的雜湊值(S_atPre)和計算出的最終雜湊值(S_at)之間的差異。然後我們將這個差異乘以H^c,其中c是產生的(全部或部分)密文塊的數量,並調整目前的雜湊值。

該方案存在於最終計算中(在doFinal()方法中)。

現在我的理解是多項式內的加法等同於異或。我還可以看到為什麼需要取冪才能將差異向前推進。我沒有看到完整方案是如何工作的,尤其是對於部分 16 字節塊。

有人可以展示該doFinal方法中的調整是如何在數學上定義的嗎?


請注意, $ \operatorname{GHASH} $ 函式在 GCM 中對以下數據執行:

$ S = \operatorname{GHASH}H (A || 0^v || C || 0^u || [len(A)]{64} || [len(C)]_{64}) $

在哪裡

  • $ 0^v $ 和 $ 0^u $ 正在填充(0..127 位的零)直到塊大小

$ \operatorname{GHASH} $ 本身定義如下:

腳步:

  1. 讓 $ X_1, X_2, … , X_{m-1}, X_m $ 表示塊的唯一序列,使得 $ X = X_1 || X_2 || … || X_{m-1} || X_m $ .
  2. 讓 $ Y_0 $ 成為“零塊”, $ 0^{128} $ .
  3. 為了 $ i = 1, …, m $ , 讓 $ Y_i = (Y_{i-1} \oplus X_i) • H $ .
  4. 返回 $ Y_m $

  • $ X•Y $ 是兩個塊的乘積, $ X $ 和 $ Y $ , 被視為二元伽羅瓦域中的元素

所以在這個方案中額外的 AAD ( $ A $ ) 在密文 ( $ C $ ) 已經在計算中。

好, $ \operatorname{GHASH} $ 可能更好地理解為多項式:

$$ \operatorname{GHASH}H(X_1, X_2, … , X{m-1}, X_m) = X_1 H^{m} + X_2 H^{m-1} + … + X_{m-1} H^2 + X_m H^1 $$ 加法、乘法和求冪在該領域 $ GF(2^{128}) $ . 這些加法、乘法和求冪運算在代數上的作用非常類似於更傳統領域中的運算符(例如,實數);重新排列多項式的常用技巧完全相同。

Bouncy Castle 正在做的是採用矢量 $ X_1, X_2, … , X_{m-1}, X_m $ 分為兩部分,AAD 向量 $ A_1, A_2, …, A_a = A || 0^v $ 和密文 $ C_1, C_2, …, C_c = C || 0^u $ , 並評估 $ \operatorname{GHASH}H(A_1, A_2, …, A_a, C_1, C_2, …, C_c, X{final}) $ (在哪裡 $ X_{final}=[len(A)]{64} || [len(C)]{64} $ 對 AAD 的長度和密文進行編碼)。重新排列的一種方法是:

$ \operatorname{GHASH}H(A_1, A_2, …, A_a, C_1, C_2, …, C_c, X{final}) = $ $ H^{c+1}\operatorname{GHASH}_H(A_1, A_2, …, A_a) + H\operatorname{GHASH}H(C_1, C_2, …, C_c) + HX{final} $

通過這種重新排列,我們顯然可以評估 $ \operatorname{GHASH}_H(C_1, C_2, …, C_c) $ 在我們看到任何 AAD 數據之前(甚至在我們知道它有多長之前)。

現在,您詢問部分阻塞。事實證明,我們不需要擔心部分阻塞;GCM 被定義為使得密文和 AAD 向量都被零填充到下一個完整塊;因此我們永遠不需要擔心部分阻塞。如果您想知道如果我們將零字節附加到 AAD 會發生衝突,那麼,就是這樣 $ X_{final} $ 是否存在 - 附加 0 會更改 AAD 長度,因此 $ X_{final} $ 價值。

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