首先AES和DES一樣,都是對稱加密編碼方式。
AES支持3種密碼長度:128位、192位和256位,分組大小為128位的分組密碼,在軟件和硬件上實現效率都很高。DES在軟件上實現效率比AES低。
分組密碼的基本設計思想,包括混淆和擴散,DES和AES都有這重要屬性。
混淆:是一種使密鑰與密文之間的關系盡可能模糊的加密操作。
擴散:是一種為了隱藏明文的統計屬性而將一個明文符號的影響擴散到多個密文符號的加密操作。如位置換。
AES密鑰長度不一樣,密碼內部輪的數量也不一樣,128位時10輪,192位時12輪,256位時14輪。用行數或列數來分:數據塊長度除以32,分別是4,6,8。數據塊長度和密鑰長度相等的。加解密的過程如下圖所示。
AES簡介可以參考下面的地址,講的非常詳細!
http://www.mamicode.com/info-detail-514466.html
看完上面文章,我們可以得出子密鑰的個數為輪數+1。
上圖是我在實際項目中使用AES256加密時的aes_key,密鑰為256為的AES擁有32個字節,14輪,因此有15個子密鑰 ,每個子密鑰存放了60個單詞,分別存放在60個單詞的數組中。這就是上圖看到的!
分組密碼的幾種操作模式:
上面各種模式的介紹網上也一大堆了,看完后也許不是非常懂,可能需要用過后才能更深理解。
在iOS中我們一般默認選擇ECB模式,還有常用的CBC模式,
這兩種模式有個共同點:加密時如果原文的長度不是組長的整數倍,需要填充,如原文長度是34個字節,34%16 = 2,需要在原文后面追加14字節長度的空字符串(用0填充)。同理解密時的密文長度也必須是16字節的整數倍。
if(dataLength%kCCBlockSizeAES128 !=0)
{
NSMutableData* selfdata=[self mutableCopy];
int leftlen=kCCBlockSizeAES128-dataLength%kCCBlockSizeAES128;
char padddata[kCCBlockSizeAES128];
memset(padddata,0,kCCBlockSizeAES128);//將padddata都置為0
[selfdata appendBytes:padddata length:leftlen];
rawbytes=[selfdata bytes];
dataLength +=leftlen;
}
重要函數
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,/*dataOut緩沖區的大小,如果指定填充模式PKCS7 需要增加一個塊的長度kCCAlgorithmAES128*/
size_t *dataOutMoved) /*結果的字節數寫入dataOut*/
CBC和CFB模式下會有iv初始化向量的使用,可自己定義這個值,但iOS中有說明必須和選擇算法的塊長度保持一致。其他模式,這個值只需傳入NULL就可以了。
總結:iOS應用中AES加密還是比較常用的,因為在軟件上它的性價比高于其他一般的加密算法。但加密學這技術太深了,有好多東西還是沒有理解,可能有些知識還理解錯了,還是要繼續去挖掘。