Java加密之IV
AES是一種**分組密碼**。
密碼學中,分組(block)密碼的工作模式(mode of operation)允許使用同一個分組密碼金鑰對多於一塊的資料進行加密,並保證其安全性。分組密碼自身只能加密長度等於密碼分組長度的單塊資料,若要加密變長資料,則資料必須先被劃分為一些單獨的密碼塊。通常而言,最後一塊資料也需要使用合適填充方式將資料擴充套件到匹配密碼塊大小的長度。一種工作模式描述了加密每一資料塊的過程,並常常使用基於一個通常稱為初始化向量的附加輸入值以進行隨機化,以保證安全。
而不同的工作模式的實現細節也不相同,在Java中,指定加密演算法的字串是AES/ECB/PKCS5Padding
,也就是“演算法/模式/填充方式”。而IV就和工作模式有關。常見的工作模式包括,ECB、CBC、PCBC、CFB、OFB、CTR等。
ECB
加密:
解密:
CBC
加密:
解密:
PCBC
加密:
解密:
根據上面的幾張圖可以看出,ECB模式下是不需要IV的,而CBC和PCBC是需要IV的。
那麼IV的取值有什麼需要注意的呢?
在密碼學的領域裡,初始化向量(英語:initialization vector,縮寫為IV),或譯初向量,又稱初始變數(starting variable,縮寫為SV),是一個固定長度的輸入值。一般的使用上會要求它是隨機數或擬隨機數(pseudorandom)。使用隨機數產生的初始化向量才能達到語義安全(雜湊函式與訊息驗證碼也有相同要求),並讓攻擊者難以對同一把金鑰的密文進行破解。在區塊加密中,使用了初始化向量的加密模式被稱為區塊加密模式。
初始化向量的值依密碼演算法而不同。最基本的要求是“唯一性”,也就是說同一把金鑰不重複使用同一個初始化向量。這個特性無論在區塊加密或流加密中都非常重要。
許多要求初始化向量必須讓攻擊者無法預測。這種要求一般使用隨機數或擬隨機數來達到。在這種應用中,重複的初始化向量是可以被忽略的,但是生日攻擊的問題依然得列入考量,因為若向量可以被預測,會讓攻擊者找到撤消明文的線索。
初始化向量的值主要還是取決於密碼演算法。其做法不外乎就是隨機或指定(stateful)。使用隨機的方式則取值由傳送方計算,並要將向量值送交給接收方。指定的方式則是讓收發兩方分享初始化向量所能指定的所有值(state),這些值收發雙方必須預先就定義好。