計數器 (CTR) 模式下的計數器是什麼意思?和nonce一樣嗎?
如上所述,“計數器”究竟是什麼意思?和nonce一樣嗎?
此外,William Stallings 的《Network Security Essentials》(第 6 版)一書指出,“通常情況下,計數器會初始化為某個值,然後為每個後續塊增加 1(模 $ 2^b $ , 在哪裡 $ b $ 是塊大小)”。這句話到底是什麼意思?
“計數器”到底是什麼意思?
根據維基百科定義的計數器;
在數字邏輯和計算中,計數器是一種儲存(有時顯示)特定事件或過程發生次數的設備
在點擊率方面;它用於為加密生成不同的輸入,然後將輸出與明文進行異或運算以生成密文。它通常通過遞增來執行,儘管也可以使用 LFSR。
和nonce一樣嗎
不,它與nonce(使用一次的數字)不同
CTR 模式結合了隨機數和計數器,作為密碼的輸入。輸入由兩部分組合而成;
- 隨機數部分;通常每個加密會話隨機生成或使用counter/LFSR 生成。
- 對應部分;最初設置為零,然後為每個塊加密遞增
有了這些,我們可以擁有隨機加密,如果我們使用像 AES 這樣的 PRP,每個塊可以在相同的密鑰下產生不同的輸出(PRF 部分更複雜,實際上 CTR 是為 PRF 定義的,因為不需要反向)
“通常計數器初始化為某個值,然後為每個後續塊加 1(模 $ 2^b $ , 在哪裡 $ b $ 是塊大小)”。這句話到底是什麼意思?
考慮我們有 64 位隨機數和 64 位計數器;
nonce counter 9237AF71A232BC82E4 0000000000000000
第一個塊
9237AF71A232BC82E40000000000000000
用作輸入,然後後續塊用作nonce counter 9237AF71A232BC82E4 0000000000000001 9237AF71A232BC82E4 0000000000000002 9237AF71A232BC82E4 0000000000000003 9237AF71A232BC82E4 0000000000000004 ... ... 9237AF71A232BC82E4 EFFFFFFFFFFFFFFF 9237AF71A232BC82E4 FFFFFFFFFFFFFFFF ... ... 9237AF71A232BC82E5 0000000000000000 ???
如果可以加密 $ 2^{64} $ 擋住您將到達櫃檯的盡頭,這取決於情況,這可能很危險。
如果您從 0 計數器繼續,
9237AF71A232BC82E40000000000000000
那麼您將在 CTR 模式下遇到 nonce-reuse(兩次填充)問題;機密性失去。觀察者甚至可以自動執行手動拖拽如果您繼續遞增
9237AF71A232BC82E50000000000000000
,則可能會碰到另一個輸入,該輸入也可以變成兩次墊。停在那裡;實際上,如果您使用 PRP 而不是 PRF ,請在此之前停止。
關於 nonce IV 術語的不同用法的註釋;
- NIST 定義使用計數器作為加密的整個輸入。
- 維基百科做出了區分。我更喜歡 Wikipedia 的定義,在 GCM 案例中,NIST 分別使用 IV 和 counter。
- Lindell&Katz 在他們的書中使用 IV 作為 $ 3n/4 $ 塊大小的一部分和 $ 1/4 $ 至於櫃檯。加密定義為 $ y_i := F_k (IV || \langle i \rangle) $ 他們表明,如果 IV 被統一選擇,那麼 IV 重用是一個可以忽略不計的事件。因此 CTR 模式是 CPA 安全的。
不,nonce 和 counter 肯定是不同的術語。
- nonce 是每條消息的唯一值。
- 計數器是同一消息的多個塊的唯一且連續的值。
隨機數可以以任何方式計算,只要它是唯一的。通常它要麼是完全隨機的,要麼是順序的,從零或一開始。
儘管計數器通常被指定為與協議中的隨機數分開,但實現通常有一個與塊大小相同的計數器。在這種情況下,隨機數是起始計數器最高有效位的一部分。
這反映在您引用的書中的部分:
此外,William Stallings 的《Network Security Essentials》(第 6 版)一書指出:
> > “通常計數器初始化為某個值,然後為每個後續塊加 1(模 $ 2^b $ , 在哪裡 $ b $ 是塊大小)”。 > > >
這句話的確切含義是什麼?
讓我們假設一個 128 位的分組密碼,例如 AES。然後假設每個字節由一個字母顯示,那麼你有:
CCCCCCCC_CCCCCCCC = NNNNNNNN_00000000
其中每個 C 是起始計數器中的一個字節,N 是隨機數中的一個字節。起始計數器通常被視為“IV”。現在實現將增加這個初始值模數 $ 2^{128} $ : 即當它擊中時 $ 2^{128} - 1 $ 下一個值將全為零。
然而,這意味著之後 $ 2^{64} $ 增加你的計數器將增加最右邊的隨機數字節,可能導致重複的計數器值。**這意味著應用程序本身需要計算已加密的塊數。**這樣做的原因是 nonce 可以包含任意數量的 bytes,因此它不知道 nonce 何時受到影響。換句話說,實現不知道何時溢出到 nonce 或計數器何時發生衝突。
筆記:
- 原則上,只要計數器不針對同一個鍵重複,任何方案都對 CTR 有效。為每條消息派生一個新密鑰會為您提供幾乎無限數量的塊( $ 2^{128} $ AES 的 16 字節塊)。
- 雖然計數器沒有定義為大端或小端,但大端計數器似乎佔了上風。不過,我遇到了一個使用小端計數器的協議——如果我沒記錯的話,那就是 WinZip。
- 隨機數可能不是使(初始)計數器唯一的唯一元素,其他數據元素可能包含在(初始)計數器值中。有時包括用於域分離的標識符,例如接收者的標識符。
- NIST 在 NIST SP 800-38a 附錄 B 中詳細介紹瞭如何建構密碼塊,最後指出計數器基本上是特定於協議的,並且必須單獨測試唯一性要求。