如果我加密多個數據塊,是否需要為文件的 CBC 加密生成唯一的 IV?
情況是我下載了一個 mp3 文件(歌曲)並加密了數據塊(例如 4096 位)。我將每個加密操作的輸出保存在一個新文件中。
當我播放歌曲(加密文件)時,我使用緩衝區。例如,如果我在歌曲結尾附近尋找,我需要以某種方式提取用於加密的 IV。
在這種情況下,如何生成安全的加密 IV 並能夠解密?
問題告訴CBC被使用。我認為,即使使用 CTR 的建議很好。我考慮一個塊大小為的塊密碼 $ b $ 八位字節(例如 $ b=8 $ 對於 DES/3DES, $ b=16 $ 對於 AES),並且加密時使用的 IV(可能是隨機的)儲存在第一個 $ b $ 加密文件的八位字節,後面是密文。
使用 CBC,解密可以從文件中的任何位置開始。從偏移處的八位字節破譯 $ n\ge b $ 在加密文件中(偏移量 $ n-b $ 在原始文件中),從偏移量開始讀取 $ b(\lfloor n/b\rfloor-1) $ , 讀 $ b $ 從那裡開始八位字節並將其用作IV,開始正常解密但丟棄第一個 $ n\bmod b $ 八位字節。什麼時候 $ b $ 是 2 的冪(這是最常見的),在 C 或類似語言中,從偏移開始讀取 IV
((b-1)|n)-(2*b-1)
並跳過(b-1)&n
八位字節。在流式傳輸音頻或影片的情況下,這簡化為: $ n $ 的倍數 $ b $ (通常是 4096 的倍數),使用第一個 $ b $ 八位字節為 IV,並播放由靜音的播放器破譯的內容,直到找到同步模式。
你必須使用CBC嗎?對於隨機讀取訪問,通常首選密碼回饋或計數器模式。對於任何一個,您仍然需要一個隨機數、一個用於 CFB 的 IV 和一個較短的隨機數用於 CTR(為實際的計數器位留出空間)。當然,您必須將它們與加密數據一起儲存,而人們通常所做的是將 IV 放入加密數據的第一個塊中。要閱讀實際歌曲的第 n 個塊,您必須然後
- CFB:讀取加密數據的第 n 個塊,用 AES 密鑰對其進行加密,並與下一個加密數據塊進行異或。
- CTR:讀取加密數據的第一個塊,將 n 添加到其中(如果您的加密從 n = 0 開始,則添加 n-1)使用 AES 密鑰對其進行加密,並使用第 n + 1 個加密數據塊對其進行異或。
在這兩種情況下,您都可以快速訪問任何塊並節省空間,因為您只需要一個隨機數。不過,請確保它真的是隨機的,並且永遠不會重複使用。