簡介
使用隨機數產生的初始化向量才能達到語義安全(散列函式與訊息驗證碼也有相同要求),並讓攻擊者難以對同一把密鑰的密文進行破解。在區塊加密中,使用了初始化向量的加密模式被稱為區塊加密模式。
有些密碼運算只要求初始化向量不要重複,並只要求它用是內部求出的隨機數值(這類隨機數實際上不夠亂)。在這類套用下,初始化向量通常被稱為nonce(臨時使用的數值),是可控制的(stateful)而不是隨機數。這種作法是因為初始化向量不會被寄送到密文的接收方,而是收發兩方通過事前約定的機制自行計算出對應的初始化向量(不過,實現上還是經常會把nonce送過去以便檢查訊息的遺漏)。計數器模式中使用序列的方式來作為初始化向量,它就是一種可控制之初始化向量的加密模式。
初始化向量的長度依密碼運算的所需決定。在區塊加密中,初始化向量的長度通常就等於一個區塊的大小。值得一提的是,對加密而言,一組難以預期並且與密鑰等長的初始化向量能夠避免遭受TMD破譯法(簡單的說,是花 時間(Time)觀察被攻擊者的密文,並將可能的密文預先算出來放在 存儲器(Memory)中與之比對,然後推導出被攻擊者的 明文或密鑰數據(Data);這種破譯法比起用每一把密鑰試誤還來得快;不過只要密文的產生中伴隨機的因子就可以避免此類攻擊)。使用隨機數作為初始化向量時,還必須考量碰撞的問題以避免生日攻擊法(簡單的說,就是當樣本空間夠大的時候,要找到兩個生日同一天者並非難事;同樣的狀況也發生在密碼學中,會影響密文的強度)。對於傳統、不支持初始化向量的數據流加密法,實現上是將原密鑰與初始化向量先運算後,計算出新的密鑰。然而有些實現已被認為不安全;比如有線等效加密(WEP)協定就遭受到關連式鑰匙攻擊。
動機
由電子密碼書模式(ECB)下加密的結果並不安全,即使未經破解我們仍幾乎可以看得出原圖的輪廓。
區塊加密在密碼學的領域裡是最基本的加密運算方式之一。然而它的限制是只能對一個預先定義、固定大小數據進行加密。比如在高級加密標準(AES)里,若使用長度為128位的密鑰,加密的過程就是將整個明文切割成多個128位長度的子明文,然後依前後順序用同一把密鑰轉換成對應的多個128位長度的子密文,這些子密文依產生的順序連線起來便是完整的密文。這種作法其實就是把甲數據轉換成固定的乙數據,這樣的對應關係是絕對的,因此攻擊者在收集足夠的明文與密文的組合後可以輕易的比對並推導出明文或密鑰。
為了要隱藏明文與密文的組合被攻擊者收集,並且不重新創建密鑰來混淆輸入的明文,在1980年由美國國家標準與技術中心提出了四種區塊加密模式。第一種稱為電子密碼書模式(ECB mode),描述了最基本的運作模式(前述較有疑慮的運算方式)。為了要避免ECB模式的問題,文中提出了密碼塊連結模式(CBC mode)。CBC模式的作法是對第一塊明文投入隨機的初始化向量,然後將明文與向量運算的結果加密,加密的結果再作為下一塊明文的向量。這種做法的最終目的是要達到語義上的安全,讓攻擊者無法從密文中獲取能助其破譯的相關線索,避免遭受選擇明文攻擊法。
取值
初始化向量的值依密碼算法而不同。最基本的要求是“唯一性”,也就是說同一把密鑰不重複使用同一個初始化向量。這個特性無論在區塊加密或流加密中都非常重要。
•示例:對明文P做流加密,轉換成密文C。所使用的是流密鑰K,它來自密鑰與初始化向量。我們可以得到等式:C=P xor K。假如攻擊者得知密文C與C來自同一把密鑰與初始化向量。那么攻擊者就能通過底下公式得到明文P與P:Pxor P = (Pxor K) xor (Pxor K)
許多要求初始化向量必須讓攻擊者無法預測。這種要求一般使用隨機數或擬隨機數來達到。在這種套用中,重複的初始化向量是可以被忽略的,但是生日攻擊的問題依然得列入考量,因為若向量可以被預測,會讓攻擊者找到撤消明文的線索。
•示例:比如A使用CBC模式加密訊息,而有一位攻擊者E能截看所有密文並指定特定的明文給A,讓A進行加密(即,E有辦法運行選擇明文攻擊)。接著,我們假設A用明文P與初始化向量IV做出密文C。然後E設計了明文P,並能控制或得知初始化向量IV的出現。那么E就可以反覆測試,直到E設計的明文被加密後等於密文C。自此,E用以下公式得知自己設計的明文P等於明文P
•C=E(IVxor P) =E(IVxor (IVxor IVxor P)).
初始化向量的值主要還是取決於密碼算法。其做法不外乎就是隨機或指定(stateful)。使用隨機的方式則取值由傳送方計算,並要將向量值送交給接收方。指定的方式則是讓收發兩方分享初始化向量所能指定的所有值(state),這些值收發雙方必須預先就定義好。
區塊加密
區塊加密常被用做身份驗證的加密。之後亦有所謂的身份驗證加密模式(authenticated encryption modes)。在這種模式中會使用到初始化向量。這類套用中一般求出的結果都是固定值,因此使用固定結果的方式(deterministic algorithms)進行驗證,所以初始化向量亦使用固定值或是全部填零。
流加密
流加密中的初始化向量被計入那些被用來加密的密鑰的信息(secret state)里,然後每次算出後的密文再滾入下一輪(round)的密文計算之中。由於性能的要求,流加密的設計都希望輪的總數能愈小愈好;但實際的套用上,要定義出總數是十分困難的(not a trivial task)。再著,我們也必須考量其他議題,如:傳輸過程中損失的信息量、密文的獨一性、初始化向量的相關性以及造成流加密許多安全議題的相關初始化向量攻擊法。這類攻擊議題對流加密的安全性造成嚴重的隱憂,並且有許多持續進行的研究。
WEP的初始化向量
在無線傳輸規格802.11的有線等效加密算法中使用24位的初始化向量來與同一把密鑰做加密運算,這使得密文容易被破譯。使用數據包插入的方式可以在數秒內將WEP破解。這個嚴重的缺限使得此算法不被推薦使用。