AES是分組加密,也就是說它是對固定大小的分組數(shù)據(jù)進(jìn)行處理。AES每次處理的128位(16字節(jié))的輸入。不過,大多數(shù)要加密的的數(shù)據(jù)都不是16字節(jié)長。為了解決這個問題,需要選擇合適的模式。
模式是用來將數(shù)據(jù)分組串起來從而使得任意數(shù)據(jù)都能加密的算法。模式適用于任何分組的加密算法,包括AES。
如果你不想了解AES模式的細(xì)節(jié),那就相信我:對iOS設(shè)備而言是CBC以及PKCS#7填充
最簡單的模式是電子密碼本(ECB)。但千萬不要在iOS應(yīng)用中使用該模式。
最常見的分組加密模式是密碼分組鏈模式(CBC)。
填充的作用是在加密前將普通文本的長度擴(kuò)展到需要的長度。關(guān)鍵在于填充的數(shù)據(jù)能夠在解密后正確的移除。
實現(xiàn)方法有好多種,但iOS支持一種叫PKCS#7的填充方式。這種方式由選項kCCOptionPKCS7Padding來定義
CBC是最常用的加密模式,因此最方便跟其他系統(tǒng)交換數(shù)據(jù)。這也是蘋果安全團(tuán)隊推薦的模式。
初始化向量
在鏈模式如CBC中,每個分組都會影響到下一個分組的加密。這就是為了保證兩個相同的普通文本分組不會生成相同的密文分組。
第一個分組是個特列,因為它前面再沒有其他的分組了。鏈模式允許定義一個額外的稱為初始化向量(Initialization Vector, IV)的分組來開始這個鏈。這個通常會被標(biāo)成可選的。但你總是需要提供一個。否則,它會用一個全是0的分組,那樣會讓你的數(shù)據(jù)容易受到特定的攻擊的侵害。
CCCryptorStatus CCCrypt(
CCOperation op, /* kCCEncrypt, etc. */
CCAlgorithm alg, /* kCCAlgorithmAES128, etc. */
CCOptions options, /* kCCOptionPKCS7Padding, etc. */
const void *key,
size_t keyLength,
const void *iv, /* optional initialization vector */
const void *dataIn, /* optional per op and alg */
size_t dataInLength,
void *dataOut, /* data RETURNED here */
size_t dataOutAvailable,
size_t *dataOutMoved)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
AES提供了三種密鑰長度:128位,192位和256位。
推薦使用AES-128位
在內(nèi)部實現(xiàn)上,AES只是提供一個接收固定長度密鑰和16字節(jié)大小的分組,然后生成另外一個不同的16字節(jié)大小的分組的數(shù)學(xué)函數(shù)。
- AES使用固定長度的密鑰,而不是變長密碼。必須將密碼轉(zhuǎn)成密鑰才能在AES中使用它們。