1墨礁、簡(jiǎn)介
對(duì)稱加密算法又稱傳統(tǒng)加密算法推汽。
加密和解密使用同一個(gè) 密鑰蝶俱。
1.1對(duì)稱加密算法示例
密鑰:X
加密算法:每個(gè)字符+X
明文:Hello
密鑰為 1時(shí)加密結(jié)果:Ifmmp
密鑰為 2時(shí)加密結(jié)果:Jgnnq
1.2实昨、優(yōu)缺點(diǎn)
算法公開(kāi),計(jì)算量小窗看,加密速度快茸歧,加密效率高
雙方使用相同的鑰匙,安全性得不到保證
1.3烤芦、注意事項(xiàng)
密鑰的保密工作非常重要
密鑰要求定期更換
2举娩、經(jīng)典加密算法
DES(Data Encryption Standard):數(shù)據(jù)加密標(biāo)準(zhǔn)(現(xiàn)在用的比較少,因?yàn)樗募用軓?qiáng)度不夠构罗,能夠暴力破解)
3DES:原理和DES幾乎是一樣的铜涉,只是使用3個(gè)密鑰,對(duì)相同的數(shù)據(jù)執(zhí)行三次加密遂唧,增強(qiáng)加密強(qiáng)度芙代。(缺點(diǎn):要維護(hù)3個(gè)密鑰,大大增加了維護(hù)成本)
AES(Advanced Encryption Standard):高級(jí)加密標(biāo)準(zhǔn)盖彭,目前美國(guó)國(guó)家安全局使用的纹烹,蘋果的鑰匙串訪問(wèn)采用的就AES加密。是現(xiàn)在公認(rèn)的最安全的加密方式召边,是對(duì)稱密鑰加密中最流行的算法铺呵。
2.1、加密模式
ECB:電子密碼本隧熙,就是每個(gè)塊都是獨(dú)立加密的片挂。
CBC:密碼塊鏈,使用一個(gè)密鑰和一個(gè)初始化向量(IV)對(duì)數(shù)據(jù)執(zhí)行加密轉(zhuǎn)換贞盯。
只要是對(duì)稱加密都有 ECB和 CBC模式音念,加密模式是加密過(guò)程對(duì)獨(dú)立數(shù)據(jù)塊的處理。對(duì)于較長(zhǎng)的明文進(jìn)行加密需要進(jìn)行分塊加密躏敢,在實(shí)際開(kāi)發(fā)中闷愤,推薦使用CBC的,ECB的要少用件余。
3讥脐、終端演示ECB和CBC加密的特點(diǎn)
終端命令如下
ECB
加密
$ openssl enc -des-ecb -K 616263 -nosalt -in msg1.txt -out
msg1.bin
解密
$ openssl enc -des-ecb -K 616263 -nosalt -in msg1.bin -out
msg1.txt -d
查看加密之后的二進(jìn)制文件
$ xxd msg1.bin
//xxd 命令用于以十六進(jìn)制顯示文件的內(nèi)容
CBC
加密
$ openssl enc -des-cbc -K 616263 -iv000000000000 -nosalt -in
msg1.txt -out msg1.bin
解密
$ openssl enc -des-cbc -K 616263 -iv000000000000 -nosalt -in
msg1.bin -out msg1.txt -d
查看加密之后的二進(jìn)制文件
$ xxd msg1.bin
3遭居、代碼實(shí)現(xiàn)
- (void)AESDemo {
/************EBC ****************/
//加密使用的key
NSString *key = @"abc";
//要加密的字符串
NSString *str = @"i love you";
//加密
NSString *result = [CryptorTools AESEncryptString:str keyString:key iv:nil];
NSLog(@"ECB 加密= %@",result);
// 使用 base64 解碼
(echo -n "0qg3nXM31/76bCMMJ6NRRg==" ! | base64 -D)
NSLog(@"ECB 解密= %@",[CryptorTools AESDecryptString:result keyString:key iv:nil]);
/************CBC ****************/
uint8_t iv[8] = {1,2,3,4,5,6,7,8};
NSData *ivData = [NSData dataWithBytes:iv length:sizeof(iv)];
NSString *result1 = [CryptorTools AESEncryptString:str keyString:key iv:ivData];
NSLog(@"CBC 加密= %@",result1);
NSLog(@"CBC 解密= %@",[CryptorTools AESDecryptString:result1 keyString:key iv:ivData]);
}
通過(guò)終端命令驗(yàn)證上面代碼加密的結(jié)果
ECB 加密/解密
AES(ECB)加密
$ echo -n "i love you" | openssl enc -aes-128-ecb -K616263 -nosalt | base64
AES(ECB)解密
$ echo -n "0qg3nXM31/76bCMMJ6NRRg==" | base64 -D | openssl enc -aes-128-ecb -K616263 -nosalt -d
CBC 加密/解密
AES(CBC) 加密
$ echo -n "i love you" | openssl enc -aes-128-cbc -iv 0102030405060708-K 616263-nosalt | base64
AES(CBC) 解密
$ echo -n "DLUEfBbhjjk2yaKhAlkJwA==" | base64 -D | openssl enc -aes-128-cbc -iv0102030405060708 -K 616263
-nosalt -d
終端命令解釋
加密過(guò)程先加密,再 base64編碼攘烛。
解密過(guò)程是先 base64魏滚,再解密镀首。
其中 | 在命令里面叫做管道坟漱。作用是將前一個(gè)命令的結(jié)果當(dāng)作參數(shù)傳遞給后一個(gè)命令
-K 就是密鑰的ASCII碼的十六進(jìn)制