初始向量
維基百科,自由的 encyclopedia
在密碼學的領域裡,初始向量(英語:initialization vector,縮寫為IV),或譯初向量,又稱初始變數(starting variable,縮寫為SV)[1],是一個固定長度的輸入值。一般的使用上會要求它是亂數或偽亂數(pseudorandom)。使用亂數產生的初始向量才能達到語義安全(訊息驗證碼也可能用到初始向量),並讓攻擊者難以對原文一致且使用同一把金鑰生成的密文進行破解。在區塊加密中,使用了初始向量的加密模式被稱為區塊加密模式。
有些密碼運算只要求初始向量不要重覆,並只要求它用是內部求出的亂數值(這類亂數實際上不夠亂)。在這類應用下,初始向量通常被稱為nonce(臨時使用的數值),是可控制的(stateful)而不是亂數。這種作法是因為初始向量不會被寄送到密文的接收方,而是收發兩方透過事前約定的機制自行計算出對應的初始向量(不過,實作上還是經常會把nonce送過去以便檢查訊息的遺漏)。計數器模式中使用序列的方式來作為初始向量,它就是一種可控制之初始向量的加密模式。
初始向量的長度依密碼運算的所需決定。在區塊加密中,初始向量的長度通常就等於一個區塊的大小。值得一提的是,對加密而言,一組難以預期並且與金鑰等長的初始向量能夠避免遭受TMD破譯法(簡單的說,是花時間(Time)觀察被攻擊者的密文,並將可能的密文預先算出來放在記憶體(Memory)中與之比對,然後推導出被攻擊者的明文或金鑰資料(Data);這種破譯法比起用每一把金鑰試誤還來得快;不過只要密文的產生中伴隨機的因子就可以避免此類攻擊)[2][3][4][5]。使用亂數作為初始向量時,還必須考量碰撞的問題以避免生日攻擊法(簡單來說,就是一群人中兩個人生日相同的機率要高於50%只需要23個人,這意味著成功猜出這些人生日的次數可以被降的很低;同樣的狀況也發生在密碼學中,會影響密文的強度)。對於傳統、不支援初始向量的資料流加密法,實作上是將原金鑰與初始向量先運算後,計算出新的金鑰。然而有些實作已被認為不安全;比如有線等效加密(WEP)協議就遭受到關連式鑰匙攻擊(英语:related-IV attack)。