Hash
為什麼使用初始化向量 (IV)?
為什麼使用初始化向量 (IV)?
許多密碼算法被表示為迭代算法。例如,當在CBC 模式下使用塊密碼加密消息時,每個消息“塊”首先與前一個加密塊進行異或,然後對異或的結果進行加密。第一個塊沒有“前一個塊”,因此我們必須提供一個傳統的替代“第零個塊”,我們稱之為“初始化向量”。一般來說,IV 是開始執行算法所需的任何數據,並且不是秘密的(如果它是秘密的,我們將其稱為“密鑰”,而不是 IV)。
如果您看一下MD5,您會發現它是一種迭代算法,它具有“執行狀態”(四個 32 位字)並按 64 字節塊處理消息數據,每個塊產生下一個執行狀態;最終狀態是雜湊輸出。這必須從一個傳統的初始狀態開始,這在 RFC 的第 3.3 節中進行了描述。
由於 IV 有一些成本(例如,它必須與消息一起傳輸),它不僅僅是出於審美原因:使用 IV 的算法需要它來滿足某種安全屬性,這可能意味著對什麼值有一些限制靜脈注射可能有。這實際上取決於算法。例如,對於 MD5,IV 是固定的,這不是問題。對於 CBC,請參閱上一個問題的答案。由於均勻隨機性是一個困難的要求(alea 是一種稀缺資源,尤其是在嵌入式系統中),如果加密算法只需要一個不重複的 IV(例如一個簡單的計數器),這被認為是一件好事;這就是EAX等較新的加密模式所需要的全部內容。
靜脈注射可以公開,但沒有什麼能強迫你這樣做。它仍然傾向於具有與密鑰不同的生命週期,因為(對於對稱加密)每條消息都需要一個新的 IV,但不一定是新密鑰。例如,使用TLS 1.2,在隧道設置期間創建會話密鑰(“握手”),然後將數據加密為許多“記錄”(每條記錄最多 16 kB 數據),並且每條記錄都有自己的 IV .