Aes

在兩個不同的實現之間驗證 AES GCM 身份驗證標籤

  • May 13, 2022

我對如何驗證兩個不同的 AES GCM 實現之間的身份驗證標籤有點困惑。

一種實現(就我而言)是用 Java 實現的。另一個,我不知道。

在我的實現中,明文是用函式加密的doFinal。我將初始化向量添加到結果中。

我知道身份驗證標籤被添加到加密消息的末尾,並且在解密時,Java 會自動檢查它。

https://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html如果使用GCM/CCM等AEAD模式,加密情況下附加認證標籤,或者在解密的情況下進行驗證。

數據

IV: b943f312250e7fb1f29dea93
Ciphertext (128 bit tag appended): 3745a778189b041b9c452359066a9a745715f214599d010790ee8866e531d5bfe6352e
Key: e08ef62a4908460742b4f80b14fb452d

我的問題是:無論他們使用何種加密實施/提供者,他們是否應該能夠驗證來自另一方的標籤?

謝謝

是的,在 GCM 規範中完全指定了身份驗證標籤。放置它的位置是無關緊要的 - 位置不會影響身份驗證標籤的位值。

如果其他算法實現將身份驗證標籤處理分開——它可能應該這樣做——那麼在加密和解密期間應該考慮到這一點。

  • 為了符合 Java 實現,需要在加密後將標籤附加到密文中。通常可以巧妙地調整緩衝區大小或使用流實現,這樣就不需要複製標籤。
  • 為了驗證,可能需要從密文的尾部提取它。通常可以在保存密文的緩衝區中簡單地*指出它;*在這種情況下,不需要復製或調整大小

需要雙方事先同意 GCM 配置參數(IV/nonce 類型和大小,認證標籤大小),可以直接在協議中指定它們,也可以通過選擇預定義的配置參數集執行。

這意味著應該事先知道身份驗證標籤的大小。因此,一旦確定了密文大小,就應該可以找到身份驗證標籤。當然,也沒有什麼能阻止您在協議中包含密文大小;例如,可以在協議的標頭中包含一個 32 位大小的指示符(通常是一個無符號的 32 位大端值)。這樣就可以在系統記憶體中沒有整個密文/明文的情況下找到身份驗證標籤 - 假設實現不需要使用者一次執行所有加密/解密。

顯然雙方還需要使用相同的附加認證數據(AAD)來進行標籤驗證。


通常建議將認證標籤保持在 128 位的最大大小(AES 算法的塊大小和 GHASH 的 Galois 欄位的大小)。Oracle Java 實現預設為該大小。因此,在這種情況下,(擴展的)密文的最後 16 個字節構成了身份驗證標籤。

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