Java加密之IV

原文連接:https://www.dubby.cn/detail.html?id=9097html

AES是一種**分組密碼**。算法

密碼學中,分組(block)密碼的工做模式(mode of operation)容許使用同一個分組密碼密鑰對多於一塊的數據進行加密,並保證其安全性。分組密碼自身只能加密長度等於密碼分組長度的單塊數據,若要加密變長數據,則數據必須先被劃分爲一些單獨的密碼塊。一般而言,最後一塊數據也須要使用合適填充方式將數據擴展到匹配密碼塊大小的長度。一種工做模式描述了加密每一數據塊的過程,並經常使用基於一個一般稱爲初始化向量的附加輸入值以進行隨機化,以保證安全。安全

而不一樣的工做模式的實現細節也不相同,在Java中,指定加密算法的字符串是AES/ECB/PKCS5Padding,也就是「算法/模式/填充方式」。而IV就和工做模式有關。常見的工做模式包括,ECB、CBC、PCBC、CFB、OFB、CTR等。dom

ECB

加密: 函數

image

解密: 加密

image

CBC

加密: code

image

解密: cdn

image

PCBC

加密: htm

image

解密: blog

image

根據上面的幾張圖能夠看出,ECB模式下是不須要IV的,而CBC和PCBC是須要IV的。

那麼IV的取值有什麼須要注意的呢?

在密碼學的領域裏,初始化向量(英語:initialization vector,縮寫爲IV),或譯初向量,又稱初始變量(starting variable,縮寫爲SV),是一個固定長度的輸入值。通常的使用上會要求它是隨機數或擬隨機數(pseudorandom)。使用隨機數產生的初始化向量才能達到語義安全(散列函數與消息驗證碼也有相同要求),並讓攻擊者難以對同一把密鑰的密文進行破解。在區塊加密中,使用了初始化向量的加密模式被稱爲區塊加密模式。

初始化向量的值依密碼算法而不一樣。最基本的要求是「惟一性」,也就是說同一把密鑰不重複使用同一個初始化向量。這個特性不管在區塊加密或流加密中都很是重要。

許多要求初始化向量必須讓攻擊者沒法預測。這種要求通常使用隨機數或擬隨機數來達到。在這種應用中,重複的初始化向量是能夠被忽略的,可是生日攻擊的問題依然得列入考量,由於若向量能夠被預測,會讓攻擊者找到撤消明文的線索。

初始化向量的值主要仍是取決於密碼算法。其作法不外乎就是隨機或指定(stateful)。使用隨機的方式則取值由發送方計算,並要將向量值送交給接收方。指定的方式則是讓收發兩方分享初始化向量所能指定的全部值(state),這些值收發雙方必須預先就定義好。

相關文章
相關標籤/搜索