計算 HMAC(Base64(IV) || ‘,’ || Base64(CipherText)) 而不是 HMAC(IV || CipherText) 是否安全?
讓
||
成為連接運算符。讓
CipherText = AES(Key1, IV, Message)
.讓我們假設 AES 用於 CBC 模式。
我想在 IV 和 CipherText 上計算 HMAC 標籤。
通常,人們會執行以下操作:
Tag = HMAC(Key2, IV || CipherText)
我想知道以下是否也同樣安全:
Tag = HMAC(Key2, Base64(IV) || "," || Base64(CipherText))
我想知道以下是否也同樣安全
是的,這兩種方案同樣安全。此外,對於您要實現的目標,您真的不應該自己拼湊事物,而是使用預製模式,如AES-GCM、AES-EAX或 ChaCha20-Poly1305。
事實上,我們可以證明上述聲稱的安全等價性。因為如果 MAC 是矢量-PRF(或矢量-MAC)(即採用 IV 的三元組、關聯數據和密文而不是字元串作為輸入的 PRF),Encrypt-then-MAC 很容易被證明是安全的,我們將證明這兩個向量 PRF 的等價性並爭論為什麼第一個是向量 PRF。
$ F_K(IV,\perp,C)=\operatorname{HMAC}(K;IV|C) $ 是一個向量-PRF,假設 HMAC 本身是一個正常的 PRF。首先要注意 IV 在所有情況下都具有固定長度,因此連接是明確的,也就是說,您始終知道 IV 的哪一部分和密文的哪一部分。現在正因為如此,每當輸入到 $ F $ 是不同的,HMAC 的輸入也是不同的,因為 HMAC 是 PRF,在這種情況下我們會得到一個新選擇的隨機字元串,這使得行為與向量 MAC 無法區分。
接下來我們將證明如果 $ f_1 $ 和 $ f_2 $ 是單射的並且如果 $ f_1 $ 有一個與數據無關的輸出長度(我們之前假設還記得!),然後 $ G_K(IV,\perp,C)=\operatorname{HMAC}(K;f_1(IV)|f_2(C)) $ 也是一個向量 PRF。對於你的情況想像 $ f_1 $ 是 IV 的 base-64 編碼和 $ f_2 $ 是由逗號文字前置的密文的 base-64 編碼。
所以首先要注意,因為這兩個函式都是單射的,所以永遠不會有兩個不同的輸入映射到同一個輸出。因此,底層向量 PRF 的所有非重複輸入都是唯一的,因此我們總是會在向量 PRF 上獲得新鮮的隨機輸出。
如果您可能想知道假設 HMAC 甚至是PRF是否安全,請注意這是 HMAC 設計的基本案例以及它是安全 MAC 的全部原因。