關(guān)于iOS中AES加密和base64編碼的理解

AES算法匯聚了安全性尝江、效率高淆党、易實(shí)現(xiàn)性和靈活性等優(yōu)點(diǎn),是一種較DES更好的算法。經(jīng)過對(duì)DES算法和AES算法的比較分析,我們可以得出結(jié)論,后者的效率明顯高于前者,而且由于AES算法的簡潔性,使得它的實(shí)現(xiàn)更為容易。AES作為新一代的數(shù)據(jù)加密標(biāo)準(zhǔn),其安全性也遠(yuǎn)遠(yuǎn)高于DES算法趣惠。更為重要的是,AES算法硬件實(shí)現(xiàn)的速度大約是軟件實(shí)現(xiàn)的3倍,這就給用硬件實(shí)現(xiàn)加密提供了很好的機(jī)會(huì)。下面我就講下AES的用法

1.可以先封裝個(gè)NSData+AES128的類身害。

在.m里實(shí)現(xiàn)加密和解密兩個(gè)方法

- (NSData*)AES128EncryptWithKey:(NSString*)key iv:(NSString*)iv

{

return[selfAES128Operation:kCCEncryptkey:keyiv:iv];

}

- (NSData*)AES128DecryptWithKey:(NSString*)key iv:(NSString*)iv

{

return[selfAES128Operation:kCCDecryptkey:keyiv:iv];

}

- (NSData*)AES128Operation:(CCOperation)operation key:(NSString*)key iv:(NSString*)iv

{

//一個(gè)char數(shù)組味悄,kCCKeySizeAES128=16

charkeyPtr[kCCKeySizeAES128+1];

//把數(shù)組全部設(shè)置為0,

memset(keyPtr,0,sizeof(keyPtr));

//把NSString存放到字符數(shù)組里面塌鸯,字符數(shù)組最多是16位

[keygetCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];

//創(chuàng)建一個(gè)字符數(shù)組侍瑟,kCCBlockSizeAES128=16

charivPtr[kCCBlockSizeAES128+1];

//把字符數(shù)組全部值為0

memset(ivPtr,0,sizeof(ivPtr));

//把NSString放進(jìn)字符數(shù)組里面,最多16位17位的話丙猬,最后一個(gè)不曉得要不要存放"\0"

[ivgetCString:ivPtrmaxLength:sizeof(ivPtr)encoding:NSUTF8StringEncoding];

//取出要加密的數(shù)據(jù)的長度

NSUIntegerdataLength = [selflength];

//把該長度加上kCCBlockSizeAES128=16

size_tbufferSize = dataLength +kCCBlockSizeAES128;

//從內(nèi)存中開辟一個(gè)bufferSize大小的空間涨颜,指針給buffer(void *)任意類型

void* buffer =malloc(bufferSize);

//numBytesCrypted接收加密解密后的數(shù)據(jù)的長度

size_tnumBytesCrypted =0;

CCCryptorStatuscryptStatus =CCCrypt(operation,

kCCAlgorithmCAST,

kCCOptionPKCS7Padding,

keyPtr,

kCCBlockSizeAES128,

//? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCCKeySizeAES256,

//? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCCKeySize3DES,

ivPtr,

[selfbytes],

dataLength,

buffer,

bufferSize,

&numBytesCrypted);

if(cryptStatus ==kCCSuccess)

{

//注意,此時(shí)的buffer是一個(gè)局部變量

NSData* cryptData=[NSDatadataWithBytesNoCopy:bufferlength:numBytesCrypted];

//這里的buffer沒有free哦

returncryptData;

}

//buffer是malloc出來的茧球,要釋放掉

free(buffer);

returnnil;

}

2.在單獨(dú)封裝個(gè)base64的類咐低。 實(shí)現(xiàn)base64編碼

+ (NSData*) decode:(constchar*) string length:(NSInteger) inputLength

{

//如果字符串為空,或者長度不是4的整數(shù)倍袜腥,直接返回空见擦。

if((string ==NULL) || (inputLength %4!=0)) {

returnnil;

}

//去掉字符串后面的所有“=”

while(inputLength >0&& string[inputLength -1] =='=') {

inputLength--;

}

NSIntegeroutputLength = inputLength *3/4;

NSMutableData* data = [NSMutableDatadataWithLength:outputLength];

uint8_t* output = data.mutableBytes;

NSIntegerinputPoint =0;

NSIntegeroutputPoint =0;

while(inputPoint < inputLength)

{

chari0 = string[inputPoint++];

chari1 = string[inputPoint++];

chari2 = inputPoint < inputLength ? string[inputPoint++] :'A';

chari3 = inputPoint < inputLength ? string[inputPoint++] :'A';

output[outputPoint++] = (DecodingTable[i0] <<2) | (DecodingTable[i1] >>4);

if(outputPoint < outputLength)

{

output[outputPoint++] = ((DecodingTable[i1] &0xf) <<4) | (DecodingTable[i2] >>2);

}

if(outputPoint < outputLength)

{

output[outputPoint++] = ((DecodingTable[i2] &0x3) <<6) |DecodingTable[i3];

}

}

returndata;

}

3.現(xiàn)在就可以在其他類中直接調(diào)用該方法

//字符串轉(zhuǎn)換成NSData

NSData* pData=[passworddataUsingEncoding:NSUTF8StringEncoding];

NSLog(@"-----%@",pData);

//對(duì)pData進(jìn)行加密得到加密后的NSData

NSData* encryptData=[pDataAES128EncryptWithKey:@"haha"iv:@"hehe"];

NSLog(@"aaaa%@",encryptData);

//把加密之后的NSData進(jìn)行base64編碼轉(zhuǎn)換成字符串。

NSString* encryptStr=[Base64Encodebase64StrFromData:encryptData];

NSLog(@"bbbb%@",encryptStr);

NSData* thedata=[Base64EncodedataFromBase64Str:encryptStr];

NSLog(@"eeee%@",thedata);

//對(duì)encryptData進(jìn)行解密羹令,得到解密后的NSData

NSData* decryptData=[encryptDataAES128DecryptWithKey:@"haha"iv:@"hehe"];

NSLog(@"%@",decryptData);

//

NSString* decryptStr=[[NSStringalloc]initWithData:decryptDataencoding:NSUTF8StringEncoding];

NSLog(@"%@",decryptStr);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲤屡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子福侈,更是在濱河造成了極大的恐慌酒来,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肪凛,死亡現(xiàn)場(chǎng)離奇詭異堰汉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)伟墙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門翘鸭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人戳葵,你說我怎么就攤上這事就乓。” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵生蚁,是天一觀的道長噩翠。 經(jīng)常有香客問我,道長邦投,這世上最難降的妖魔是什么伤锚? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮志衣,結(jié)果婚禮上屯援,老公的妹妹穿的比我還像新娘。我一直安慰自己蠢涝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布阅懦。 她就那樣靜靜地躺著和二,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耳胎。 梳的紋絲不亂的頭發(fā)上惯吕,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音怕午,去河邊找鬼废登。 笑死,一個(gè)胖子當(dāng)著我的面吹牛郁惜,可吹牛的內(nèi)容都是我干的堡距。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼兆蕉,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼羽戒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起虎韵,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤易稠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后包蓝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驶社,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年测萎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亡电。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡硅瞧,死狀恐怖逊抡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤冒嫡,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布拇勃,位于F島的核電站,受9級(jí)特大地震影響孝凌,放射性物質(zhì)發(fā)生泄漏方咆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一蟀架、第九天 我趴在偏房一處隱蔽的房頂上張望瓣赂。 院中可真熱鬧,春花似錦片拍、人聲如沸煌集。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苫纤。三九已至,卻和暖如春纲缓,著一層夾襖步出監(jiān)牢的瞬間卷拘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工祝高, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栗弟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓工闺,卻偏偏與公主長得像乍赫,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子陆蟆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • /**ios常見的幾種加密方法: 普通的加密方法是講密碼進(jìn)行加密后保存到用戶偏好設(shè)置( [NSUserDefaul...
    彬至睢陽閱讀 2,939評(píng)論 0 7
  • 首先羅列一些知識(shí)點(diǎn): 1.加密算法通常分為對(duì)稱性加密算法和非對(duì)稱性加密算法:對(duì)于對(duì)稱性加密算法耿焊,信息接收雙方都需事...
    JonesCxy閱讀 1,389評(píng)論 2 4
  • 常見的加密算法 MD5 \ SHA \ DES \ 3DES \ RC2和RC4 \ RSA \ IDEA \ D...
    小小啄閱讀 3,127評(píng)論 0 9
  • 前言 iOS系統(tǒng)由于其封閉性其安全系數(shù)要比安卓高不少罗侯,但是依然有插件可以捕捉到iOS端敏感數(shù)據(jù),特別是以plist...
    laitys閱讀 1,889評(píng)論 0 9
  • 唇齒和舌尖 酒精在捕捉溫存的瞬間 世界可以霎那崩塌 臨界溪猿,天和地钩杰,白晝和永夜 像兩棵無限接近的行道樹 太多相似 在...
    慕籽閱讀 133評(píng)論 2 1