Aes

AES256 CTR 隨機數生成

  • December 13, 2020

我正在關注 AES256 中CTR操作模式的 wiki 圖。文件指出,要使其正常工作,您需要一個 8 字節的隨機隨機數,然後是 8 個字節的計數器。所以我猜你可以隨機生成隨機數,例如:SgVkYp3s。然後你只需添加一個計數。然後,您遍歷所有明文字節,並在每次通過 for 循環時增加計數。所以最後你會得到像 SgVkYp3s00000000, SgVkYp3s00000001, … 然後你使用相同的格式進行解密。這是正確的方法嗎?

使用 AES 的計數器模式加密(以及類似的解密)作為

$$ C_i = AES(key,nonce,i) \oplus m[i] $$隨機數和索引在哪裡 $ i $ 用於加密 $ i $ th 塊與加密的輸出的 x 或。

加密算法適用於字節,您可以將其視為字節數組。現在您需要在較低的索引上用隨機的 8 字節值填充字節數組,其餘設置為 0。

如果您想獲得 CTR 啟用的隨機訪問,您可以將高字節設置為索引 $ i $ 在 64 位表示中。

如果您是按順序加密,那麼在將對應設置為零之後,您需要實現一個字節數組增量器。如果我們用十六進製表示,那麼每個字節需要兩個十六進製字元;

1b4fe8364as4a8100000000000000000    //initial
1b4fe8364as4a8100000000000000001    //counter incremented
1b4fe8364as4a8100000000000000002    //counter incremented
1b4fe8364as4a8100000000000000003    //counter incremented
..
1b4fe8364as4a81000000000000000FF    //counter incremented
...

所以我猜你可以隨機生成隨機數

這裡有一個常見的問題,64 位隨機數很容易發生衝突。後 $ 2^{32} $ 在同一密鑰下隨機生成隨機數將與 50% 發生衝突。50% 不可忽略,必須在此之前停下來。更好的方法是

  • 按順序生成隨機數,這可能會導致其他一些問題,因為系統故障可能會導致舊值的重用,而最簡單的緩解方法是使用新密鑰。或者,
  • 像 AES-GCM 一樣使用更大的隨機數;96 位隨機數。這隨機使用更安全。請記住,這會將塊加密的數量限制為 $ 2^{32} $ 這使得 $ 2^{36} $ 字節,即 $ \approx 68.71 $ 國標。

請記住,AES 的塊大小為 128 位,無論其密鑰大小為 128、192 和 256。

通常,密碼庫會為您處理這些部分。您無需擔心 Java 的IvParameterSpec之類的問題。

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