AES是分組加密,也就是說它是對(duì)固定大小的分組數(shù)據(jù)進(jìn)行處理上荡。AES每次處理的128位(16字節(jié))的輸入趴樱。不過,大多數(shù)要加密的的數(shù)據(jù)都不是16字節(jié)長榛臼。為了解決這個(gè)問題伊佃,需要選擇合適的模式。
模式是用來將數(shù)據(jù)分組串起來從而使得任意數(shù)據(jù)都能加密的算法沛善。模式適用于任何分組的加密算法航揉,包括AES。
如果你不想了解AES模式的細(xì)節(jié)金刁,那就相信我:對(duì)iOS設(shè)備而言是CBC以及PKCS#7填充
最簡(jiǎn)單的模式是電子密碼本(ECB)帅涂。但千萬不要在iOS應(yīng)用中使用該模式。
最常見的分組加密模式是密碼分組鏈模式(CBC)尤蛮。
填充的作用是在加密前將普通文本的長度擴(kuò)展到需要的長度媳友。關(guān)鍵在于填充的數(shù)據(jù)能夠在解密后正確的移除。
實(shí)現(xiàn)方法有好多種产捞,但iOS支持一種叫PKCS#7的填充方式醇锚。這種方式由選項(xiàng)kCCOptionPKCS7Padding來定義
CBC是最常用的加密模式,因此最方便跟其他系統(tǒng)交換數(shù)據(jù)坯临。這也是蘋果安全團(tuán)隊(duì)推薦的模式焊唬。
初始化向量
在鏈模式如CBC中,每個(gè)分組都會(huì)影響到下一個(gè)分組的加密看靠。這就是為了保證兩個(gè)相同的普通文本分組不會(huì)生成相同的密文分組赶促。
第一個(gè)分組是個(gè)特列,因?yàn)樗懊嬖贈(zèng)]有其他的分組了挟炬。鏈模式允許定義一個(gè)額外的稱為初始化向量(Initialization Vector, IV)的分組來開始這個(gè)鏈鸥滨。這個(gè)通常會(huì)被標(biāo)成可選的嗦哆。但你總是需要提供一個(gè)。否則婿滓,它會(huì)用一個(gè)全是0的分組老速,那樣會(huì)讓你的數(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)部實(shí)現(xiàn)上,AES只是提供一個(gè)接收固定長度密鑰和16字節(jié)大小的分組秕铛,然后生成另外一個(gè)不同的16字節(jié)大小的分組的數(shù)學(xué)函數(shù)。
- AES使用固定長度的密鑰缩挑,而不是變長密碼但两。必須將密碼轉(zhuǎn)成密鑰才能在AES中使用它們。