Aes
AES256 CTR 隨機數生成
我正在關注 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之類的問題。