Aes

AES-256 GCM IV 指南

  • January 15, 2020

如果我使案例如 AES-256 (GCM),並且我的消息大於 256 位(分成更小的 256 位塊進行加密),IV 是否應該為消息的每 256 位更改?

GCM 模式的 IV,在本例中稱為 Nonce,與 GCM 內部 CTR 模式使用的 IV 不同。

此外,根據您問題的措辭,AES256 具有 256 位密鑰和 128 位塊,而不是 256 位塊,並以 128 位增量加密明文。

對於 GCM,您必須為每條消息使用唯一的 Nonce。在 GCM 內部,Nonce 變成了 CTR IV。如果您查看 kelalaka 的答案,如果 Nonce 是 96 位,則 CTR IV 是完全相同的。如果是其他大小,它會使用引用的算法將其轉換為 96 位 IV。CTR 模式使用 IV 加上從 1 開始的計數器來生成流。96 位 IV 加上 32 位計數器等於密碼的 128 位輸入塊。

([     IV     ][ctr1]) -----> [AES] -----> ([      STREAM1      ])

輸出的 128 位流塊用於加密明文塊。如果有多個明文塊,則只能用給定的計數器加密一個,因此將其遞增 1,並重複相同的操作以生成下一個 128 位流塊。如果最終明文塊小於 128 位,則丟棄未使用的流位。

MESSAGE = ([     PLAINTEXT1    ][     PLAINTEXT2    ][ PLAINTEXT3 ])
AUTHDAT = additional data to authenticate
LEN_T = desired length of authentication tag
L = length_64(AUTHDAT) || length_64(MESSAGE)
NONCE = 96-bits, therefore IV=NONCE
H = AES_K(0x00000000000000000000000000000000)
ctr0 = 0x00000001, ctr1 = 0x00000002, and so on

([     IV     ][ctr0]) -----> [AES] -----> ([      STREAM0      ])

([     IV     ][ctr1]) -----> [AES] -----> ([      STREAM1      ])
([     IV     ][ctr2]) -----> [AES] -----> ([      STREAM2      ])
([     IV     ][ctr3]) -----> [AES] -----> ([      STREAM3      ])

([     PLAINTEXT1    ]) XOR ([      STREAM1      ]) = ([     CIPHERTXT1    ])
([     PLAINTEXT2    ]) XOR ([      STREAM2      ]) = ([     CIPHERTXT2    ])
([ PLAINTEXT3 ])        XOR ([      STREAM3      ]) = ([ CIPHERTXT3 ])

CIPHERTEXT= ([     CIPHERTXT1    ][     CIPHERTXT2    ][ CIPHERTXT3 ])

H = GHASH(H,AUTHDAT,CIPHERTEXT,L)
TAG = truncate_LEN_T( H XOR STREAM0 )

只要不達到 GCM 的限制,即 549,755,813,632 位,或小於 64GiB 的 256 位,就會生成盡可能多的塊來加密所有明文,如此處所述

AES-GCM 對 AES 使用計數器(CTR) 模式。實際上,如果您使用 SP 800-38D 兼容庫,它會為您處理遞增 IV。

對於加密會話,一旦 IV 被初始化,IV 的計數器部分(32 位部分)就會為每個塊的加密而遞增。正如 Maarten 的評論所述,IV fot CTR 模式從 2 開始。因此,可以繼續加密,直到計數器達到最大值,即 $ 2^{32}-2 $ 如果使用 32 位計數器,則 AES 會阻塞。然後,您必須使用新的 IV 才能繼續。

真正的問題是在每個會話中生成唯一的 IV。如果 IV 曾經重複,那麼它是不安全的,因此您需要確保 IV 從不重複。

對於 IV 的生成,您可以使用良好的隨機源,也可以逐步使用 IV。在這種情況下,IV 大小必須為96 位,請參見SP 800-38D的第 15 頁。

如果 $ len(IV)=96 $ ,然後讓 $ J_0 = IV | 0^{31} |1 $ .

儲存最後使用的 IV 並增加它然後提供給 GCM 是減輕生日攻擊的一般做法。

如果提供的 IV 不是 96 位,則由 $ \operatorname{GHASH} $ . 您可以在此答案Generate J0 for GCM cipher when中查看它是如何處理的 $ len(IV)\neq96 $ 位詳細。

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