GCM:處理密文後更新 AAD 背後的數學
在 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} $ 本身定義如下:
腳步:
- 讓 $ X_1, X_2, … , X_{m-1}, X_m $ 表示塊的唯一序列,使得 $ X = X_1 || X_2 || … || X_{m-1} || X_m $ .
- 讓 $ Y_0 $ 成為“零塊”, $ 0^{128} $ .
- 為了 $ i = 1, …, m $ , 讓 $ Y_i = (Y_{i-1} \oplus X_i) • H $ .
- 返回 $ 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} $ 價值。