使用 AES-GCM 加密的文件中儲存的身份驗證標籤在哪裡?
所以我正在使用cryptopp來加密項目中的文件,並且我正在使用AES-GCM。我有一個 256 位密鑰、一個 128 位 ivec 和一個 128 位標籤,用於加密文件。
但是,我想知道身份驗證標籤儲存在哪裡?我注意到如果我指定標記大小為 0,那麼加密文件大小與原始文件的字節數相同。
身份驗證標籤是否只是附加到文件的末尾?
身份驗證標籤在 GCM 中定義為輸出參數(參見NIST SP 800-38D的第 7 節,第 7 步)。在我遇到的所有 API 中,它都附加到密文中。它的實際放置位置取決於協議設計者。不過,協議設計者可能會將密文後面的位置視為臨時預設設置。名稱“標籤”當然有點表明它應該被標記為密文,這很可能意味著直接連接。
標籤通常被認為是 API 中密文的*一部分。*這意味著 API 不太靈活,並且它需要緩衝密文(最多為標記值的大小)作為解密常式,否則不知道密文在哪裡結束並且身份驗證標記從哪裡開始。這反過來又意味著計數器模式加密的線上屬性被破壞。
因此,通常最好將身份驗證標籤視為 API 設計者的單獨參數,並將身份驗證標籤的位置留給協議設計者。協議設計者可能會選擇在密文前面加上長度分量,這會使緩衝變得不必要。
在您的情況下,直接查看 GCM 規範沒有幫助,您需要協議或 API 規範。如果位置沒有嚴格定義,我建議在密文末尾查找它。標籤大小應該是一個有效的、預定義的參數值。
在RFC 5116: An Interface and Algorithms for Authenticated Encryption中,身份驗證標籤明確放置在GCM 模式加密**的密文末尾。**這是由於第 2.1 節中的以下要求:
有一個輸出:
- 密文 C,至少與明文一樣長或
- 指示無法執行所請求的加密操作。
並由第 5.1 節進一步解釋:
AEAD_AES_128_GCM
密文是通過將作為輸出提供給 GCM 加密操作的身份驗證標籤附加到該操作輸出的密文來形成的。例如,此 RFC 被 TLS 規範使用。請注意,密文的大小在這些規範中是明確的,這意味著應該很容易將標籤與實際密文分開。