Gcm

伽羅瓦計數器模式中的 IV

  • October 4, 2018

我正在查看維基百科 Galois Counter Mode 文章。我看到這張圖 在此處輸入圖像描述

我想弄清楚 IV 在哪里工作。它是用來初始化計數器的嗎?如果是這樣,12 字節(96 位)的序列如何初始化 32 位機器上的計數器?

該圖顯示了算法的要點,但不是其中的所有內容。

GCM 中的大部分加密在 CTR 模式下使用 AES。“CTR 模式”意味著計數器的“連續”值使用塊函式(正確地說是 AES)進行加密,以產生一個與密鑰相關的偽隨機流,該流與數據組合(按位 XOR)以加密或解密。因此,每個計數器值都具有一個完整塊的大小,即 128 位。請注意,“連續值”的概念不需要匹配任何給定的算術模型,以實現安全性;我們只需要“連續值”是不同的。當然,為了使加密和解密工作,發送者和接收者必須就初始值以及如何“增加”它以獲得連續值達成一致,這在 GCM 中定義。

GCM 的規範是NIST SP800-38D。在該文件中,我們看到以下內容:

  • 雖然計數器值具有塊的大小(16 字節),但只有最後(最右邊的)4 個字節被修改以進入“下一個值”。最後 4 個字節被解釋為一個 32 位整數(使用大端約定),它是遞增的。請注意,值在概念上“環繞”(如果最後 4 個字節具有 value FF FF FF FF,則增量 yield 00 00 00 00,並且塊的前 12 個字節保持不變)。
  • 如果 GCM 的 IV 大小正好為 12 個字節,則 Wikipedia 模式中的值“counter 0”是 IV 和00 00 00 01. 值“counter 1”將是相同的,除了最後一個字節將02代替01. 請注意,AES 加密值“計數器 0”用作身份驗證標籤的後處理;用於加密實際數據的第一個計數器值是“計數器 1”。
  • 如果 GCM 的 IV 有任何其他大小,則首先使用 GHASH 對其進行處理,以便為“計數器 0”生成完整的 16 字節初始值。請注意,在這種情況下,GHASH 輸出也用於最後 4 個字節,因此 32 位整數的起始值不一定是 1(如果我們開始足夠接近,實際上可能會發生“環繞”行為到FF FF FF FF)。

在 GCM 中,AES 塊函式僅用於三件事:

  • 加密全零塊,產生h值(用於 GHASH,用於身份驗證標籤)。
  • 加密值“counter 0”,用於屏蔽認證標籤。
  • 加密值“counter 1”,“counter 2”……以產生與明文或密文組合(使用 XOR)的偽隨機流。

GCM 的細節已經制定,如果 IV 的長度正好是 12 個字節,那麼所有這些值都保證彼此不同;GCM 的安全性取決於它。一個重要的後果是,如果您將 AES/GCM 密鑰用於其他任何事情,那麼所有的安全保證都會像晨光中的露水一樣蒸發。

需要注意的是,使用最後四個字節作為包裝計數器並不是一個通用的約定。也就是說,它在 GCM 中以這種方式定義,並且所有 GCM 實現都遵循它(否則它們將無法互操作)。但是,其他使用 CTR 模式的方案可能有不同的約定。在EAXCCM中,完整的 16 字節塊被認為是完整的 128 位整數的編碼。

電腦不僅限於可以放入寄存器的內容,就像您只有十根手指一樣,但仍然可以對包含多個數字的數字執行操作。在 32 位電腦上,您將使用四個 32 位寄存器來保存完整的 128 位值。例如,看看它是如何在BearSSL 實現中完成的;增量操作的要點如下:

           cc0 ++;
           carry = (~(cc0 | -cc0)) >> 31;
           cc1 += carry;
           carry &= (~(cc1 | -cc1)) >> 31;
           cc2 += carry;
           carry &= (~(cc2 | -cc2)) >> 31;
           cc3 += carry;

四個 32 位字是cc0cc1和(類型為cc2,即每個字正好 32 位)。這些奇怪的表達式使用無分支的恆定時間程式碼計算進位傳播;一個更簡單(但不是恆定時間)的實現如下所示:cc3``uint32_t

           cc0 ++;
           if (cc0 == 0) {
               cc1 ++;
               if (cc1 == 0) {
                   cc2 ++;
                   if (cc2 == 0) {
                       cc3 ++;
                   }
               }
           }

為了清楚起見,我重複上面的程式碼片段處理 EAX/CCM 情況,其中計數器作為 128 位值遞增,而不是GCM 情況,其中只有最後 4 個字節以算術方式遞增。

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