原文鏈接:https://www.dubby.cn/detail.html?id=9097
AES是一種分組密碼。
密碼學(xué)中,分組(block)密碼的工作模式(mode of operation)允許使用同一個(gè)分組密碼密鑰對多于一塊的數(shù)據(jù)進(jìn)行加密,并保證其安全性。分組密碼自身只能加密長度等于密碼分組長度的單塊數(shù)據(jù),若要加密變長數(shù)據(jù),則數(shù)據(jù)必須先被劃分為一些單獨(dú)的密碼塊。通常而言,最后一塊數(shù)據(jù)也需要使用合適填充方式將數(shù)據(jù)擴(kuò)展到匹配密碼塊大小的長度。一種工作模式描述了加密每一數(shù)據(jù)塊的過程,并常常使用基于一個(gè)通常稱為初始化向量的附加輸入值以進(jìn)行隨機(jī)化,以保證安全。
而不同的工作模式的實(shí)現(xiàn)細(xì)節(jié)也不相同,在Java中,指定加密算法的字符串是AES/ECB/PKCS5Padding,也就是“算法/模式/填充方式”。而IV就和工作模式有關(guān)。常見的工作模式包括,ECB、CBC、PCBC、CFB、OFB、CTR等。
ECB
加密:

解密:

CBC
加密:

解密:

PCBC
加密:

解密:

根據(jù)上面的幾張圖可以看出,ECB模式下是不需要IV的,而CBC和PCBC是需要IV的。
那么IV的取值有什么需要注意的呢?
在密碼學(xué)的領(lǐng)域里,初始化向量(英語:initialization vector,縮寫為IV),或譯初向量,又稱初始變量(starting variable,縮寫為SV),是一個(gè)固定長度的輸入值。一般的使用上會要求它是隨機(jī)數(shù)或擬隨機(jī)數(shù)(pseudorandom)。使用隨機(jī)數(shù)產(chǎn)生的初始化向量才能達(dá)到語義安全(散列函數(shù)與消息驗(yàn)證碼也有相同要求),并讓攻擊者難以對同一把密鑰的密文進(jìn)行破解。在區(qū)塊加密中,使用了初始化向量的加密模式被稱為區(qū)塊加密模式。
初始化向量的值依密碼算法而不同。最基本的要求是“唯一性”,也就是說同一把密鑰不重復(fù)使用同一個(gè)初始化向量。這個(gè)特性無論在區(qū)塊加密或流加密中都非常重要。
許多要求初始化向量必須讓攻擊者無法預(yù)測。這種要求一般使用隨機(jī)數(shù)或擬隨機(jī)數(shù)來達(dá)到。在這種應(yīng)用中,重復(fù)的初始化向量是可以被忽略的,但是生日攻擊的問題依然得列入考量,因?yàn)槿粝蛄靠梢员活A(yù)測,會讓攻擊者找到撤消明文的線索。
初始化向量的值主要還是取決于密碼算法。其做法不外乎就是隨機(jī)或指定(stateful)。使用隨機(jī)的方式則取值由發(fā)送方計(jì)算,并要將向量值送交給接收方。指定的方式則是讓收發(fā)兩方分享初始化向量所能指定的所有值(state),這些值收發(fā)雙方必須預(yù)先就定義好。