Encryption

點擊率塊生成

  • March 11, 2021

據我了解,CTR 的工作原理是獲取一個計數器,將它與一個 nonce 連接,然後對結果進行加密,然後將結果與密文進行異或。對於 128 位塊密碼(即 AES),我的理解是 CTR 塊的前 8 個字節是 nonce,後半部分(字節 8-16)是計數器。CTR 是一種安全的操作模式,但如果我這樣修改它會怎樣:

隨機數是 16 個字節,計數器是 16 個字節。計數器塊等於 nonce XOR 計數器。

基本上,他的計數器塊只是隨機數和計數器的異或。這會是安全的,還是會破壞 CTR 的想法並且不安全?

編輯:為了更清楚,這裡是 CTR 模式和我的修改模式:

點擊率:

nonce = 12345678
counter = 00000001
CTR block = 1234567800000001

我的方案:

nonce = 1234567890abcdef
counter = 0000000000000001
CTR block = 1234567890abcdeW

CTR 的工作原理是獲取一個計數器,將其與 nonce 連接,然後加密結果

不完全的。CTR 的工作原理是獲取一個使用相同密鑰加密的每個塊的唯一值並對其進行加密。這個值(計數器塊)的構造方式不是標準化的,安全性重要的是它的唯一性(以及加密密鑰的獨立性)。

使用 CTR 模式的一種方法是保留使用該密鑰加密的塊的計數(數字:0、1、2……),並使用該數字的表示作為計數器塊:通常以 256 為基數大端或 base 256 little-endian,如果您將計數器塊視為 8 位字節數組。當有一個實體使用該密鑰時,它會起作用,它一次只加密一條消息,並且它會記住它在塊之間停止的位置。

如果多個實體想要加密,或者甚至一個實體想要並行加密多條消息,這種簡單的方法就會失效,因為沒有實用的方法可以在一條消息中同時保持計數器值連續(如果沒有,您需要保存消息中的所有計數器值,而不僅僅是初始值),並避免重複計數器值(這會破壞安全性)。

最好的解決方案是永遠不要使用相同的密鑰加密兩條消息,而是執行兩個步驟來加密消息:首先從每個消息的 nonce 派生一個密鑰,然後使用該一次性密鑰來加密消息。然後,您將使用消息發送派生隨機數,並且您不需要發送初始計數器值,因為您可以始終從 0 開始。

如果您想使用相同的密鑰加密多條消息,您需要一種方法來為每條消息設置不相交的計數器值集。執行此操作的常用方法是將計數器塊分為兩部分:每個消息的隨機數和消息內計數器。這將消息的可能長度限制為可以用消息內計數器表示的塊數,例如,32 位消息內計數器意味著最大 $ 2^32 $ 塊(所以 $ 2^{36} $ 字節的密碼,如 128 位塊大小的 AES)。每條消息的隨機數必須是每條消息唯一的,例如發送消息的計數器。

另一種避免保存狀態(例如發送的消息數量)的常見方法是使用隨機計數器值開始每條消息,並在整個消息中遞增它。只要您不使用相同的密鑰發送太多數據就可以了,其中“太多數據”意味著您不能接近生日界限,即可能塊數的平方根。對於 128 位塊大小,這意味著不要接近 $ 2^{64},\text{blocks} = 2^{68},\text{bytes} $ 數據的。

與消息內計數器異或每個消息的隨機數可能會或可能不會工作,具體取決於隨機數的生成方式。例如,如果 nonce 是發送消息的計數,那就太糟糕了,因為它會導致重複的計數器塊值。在基數 2 中,僅代表計數器塊的最後三位,您將擁有:

  • 第一條消息:第一個計數器塊 $ 000 \oplus 000 = 000 $ , 第二個計數器塊 $ 000 \oplus 001 = 001 $ , …
  • 第二條消息:第一個計數器塊 $ 001 \oplus 000 = 001 $ , 第二個計數器塊 $ 001 \oplus 001 = 000 $ , …

如您所見,計數器塊被重複,這完全破壞了安全性。

如果你的 nonce 是一個隨機的 128 位值,它類似於從一個隨機 128 位值開始並遞增它的常用方法,但列舉計數器塊的順序取決於每個消息的初始計數器值。我認為這具有相同的統計特性,但我沒有計算過。它使實現變得非常複雜。我沒有看到任何特別的好處。

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