AES加密打開(kāi)方式...

很久沒(méi)寫(xiě)博客,Markdown牽出來(lái)遛遛

AES加密時(shí)需要統(tǒng)一的幾個(gè)參數(shù)捅儒。

密鑰長(zhǎng)度(Key Size)
加密模式(Cipher Mode)
填充方式(Padding)
初始向量(Initialization Vector)

1.本例使用AES-128,

2.AES屬于塊加密BlockCipher,塊加密中有CBC振亮、ECB巧还、CTR、OFB坊秸、CFB等幾種工作模式麸祷。本例使用CBC模式

3.由于塊加密只能對(duì)特定長(zhǎng)度的數(shù)據(jù)塊進(jìn)行加密,因此CBC褒搔、ECB模式需要在最后一數(shù)據(jù)塊加密前進(jìn)行數(shù)據(jù)填充阶牍。(CFB,OFB和CTR模式由于與key進(jìn)行加密操作的是上一塊加密后的密文星瘾,因此不需要對(duì)最后一段明文進(jìn)行填充)
在iOS SDK中提供了PKCS7Padding

ECB加密模式(不推薦):容易被攻擊

1.每次key,明文,密文的長(zhǎng)度都必須是64位;
2.數(shù)據(jù)塊重復(fù)排序不需要檢測(cè);
3.相同的明文塊(使用相同的密鑰)產(chǎn)生相同的密文塊,容易遭受字典被攻擊
4.一個(gè)錯(cuò)誤僅僅會(huì)對(duì)一個(gè)密文塊產(chǎn)生影響

CBC加密方式(推薦):

1.每次加密的密文長(zhǎng)度為64位(8個(gè)字節(jié));
2.當(dāng)相同的明文使用相同的密鑰和初始向量的時(shí)候CBC模式總是產(chǎn)生相同的密文;
3.密文塊要依賴以前的操作結(jié)果,所以密文塊不能進(jìn)行重新排列;
4.可以使用不同的初始化向量來(lái)避免相同的明文產(chǎn)生相同的密文,一定程度上抵抗字典攻擊
5.一個(gè)錯(cuò)誤發(fā)生后,當(dāng)前和以后的密文都會(huì)被影響;

使用PKCS5Padding/PKCS7Padding填充可以兼容多平臺(tái)語(yǔ)言之間AES加密解密

注意: 這里每次產(chǎn)生的密文是相同的走孽,因?yàn)樵O(shè)置了初試向量iv為16位個(gè)數(shù)的“0”。要產(chǎn)生不同的密文就要使用變化的初試向量iv

ios使用案例

創(chuàng)建一個(gè)類AESCipher繼承NSObject

.h文件如下:

#import <Foundation/Foundation.h>

NSString * aesEncryptString(NSString *content, NSString *key);
NSString * aesDecryptString(NSString *content, NSString *key);

NSData * aesEncryptData(NSData *data, NSData *key);
NSData * aesDecryptData(NSData *data, NSData *key);

.m文件如下:

#import "AESCipher.h"
#import <CommonCrypto/CommonCryptor.h>

//注意:初始向量,默認(rèn)16個(gè)0(]前后端保持?統(tǒng)一)
NSString const *kInitVector = @"0000000000000000";


size_t const kKeySize = kCCKeySizeAES128;

NSData * cipherOperation(NSData *contentData, NSData *keyData, CCOperation operation) {
    NSUInteger dataLength = contentData.length;
    
    void const *initVectorBytes = [kInitVector dataUsingEncoding:NSUTF8StringEncoding].bytes;
    void const *contentBytes = contentData.bytes;
    void const *keyBytes = keyData.bytes;
    
    size_t operationSize = dataLength + kCCBlockSizeAES128;
    void *operationBytes = malloc(operationSize);
    size_t actualOutSize = 0;
    
    CCCryptorStatus cryptStatus = CCCrypt(operation,
                                          kCCAlgorithmAES,
                                          kCCOptionPKCS7Padding,
                                          keyBytes,
                                          kKeySize,
                                          initVectorBytes,
                                          contentBytes,
                                          dataLength,
                                          operationBytes,
                                          operationSize,
                                          &actualOutSize);
    
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:operationBytes length:actualOutSize];
    }
    free(operationBytes);
    return nil;
}

NSString * aesEncryptString(NSString *content, NSString *key) {
    NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
    NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
    NSData *encrptedData = aesEncryptData(contentData, keyData);
    return [encrptedData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
}

NSString * aesDecryptString(NSString *content, NSString *key) {
    NSData *contentData = [[NSData alloc] initWithBase64EncodedString:content options:NSDataBase64DecodingIgnoreUnknownCharacters];
    NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
    NSData *decryptedData = aesDecryptData(contentData, keyData);
    return [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
}

NSData * aesEncryptData(NSData *contentData, NSData *keyData) {
    NSString *hint = [NSString stringWithFormat:@"The key size of AES-%lu should be %lu bytes!", kKeySize * 8, kKeySize];
    NSCAssert(keyData.length == kKeySize, hint);
    return cipherOperation(contentData, keyData, kCCEncrypt);
}

NSData * aesDecryptData(NSData *contentData, NSData *keyData) {
    NSString *hint = [NSString stringWithFormat:@"The key size of AES-%lu should be %lu bytes!", kKeySize * 8, kKeySize];
    NSCAssert(keyData.length == kKeySize, hint);
    return cipherOperation(contentData, keyData, kCCDecrypt);
}

使用方法如下:

/*
 使用案例:
 
 第一: 導(dǎo)入頭文件
 #import "AESCipher.h"

 測(cè)試字符串
 NSString *TestStr = @"abc";
 設(shè)置key
 NSString *key = @"1234567812345678";
 
 NSString *cipherText = aesEncryptString(TestStr, key);
 
 NSLog(@"加密==%@", cipherText);
 
 NSString *decryptedText = aesDecryptString(cipherText, key);
 
 NSLog(@"解密==%@", decryptedText);
 
 
 */
 

原文查看:
http://blog.csdn.net/u013749540/article/details/70225594
http://www.cnblogs.com/dcb3688/p/4608007.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琳状,一起剝皮案震驚了整個(gè)濱河市磕瓷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖困食,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件边翁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡硕盹,警方通過(guò)查閱死者的電腦和手機(jī)符匾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瘩例,“玉大人啊胶,你說(shuō)我怎么就攤上這事⊙鼋耍” “怎么了创淡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)南吮。 經(jīng)常有香客問(wèn)我琳彩,道長(zhǎng),這世上最難降的妖魔是什么部凑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任露乏,我火速辦了婚禮,結(jié)果婚禮上涂邀,老公的妹妹穿的比我還像新娘瘟仿。我一直安慰自己,他們只是感情好比勉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布劳较。 她就那樣靜靜地躺著,像睡著了一般浩聋。 火紅的嫁衣襯著肌膚如雪观蜗。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天衣洁,我揣著相機(jī)與錄音墓捻,去河邊找鬼。 笑死坊夫,一個(gè)胖子當(dāng)著我的面吹牛砖第,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播环凿,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梧兼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了拷邢?” 一聲冷哼從身側(cè)響起袱院,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后忽洛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腻惠,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年欲虚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了集灌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡复哆,死狀恐怖欣喧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梯找,我是刑警寧澤唆阿,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站锈锤,受9級(jí)特大地震影響驯鳖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜久免,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一浅辙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阎姥,春花似錦记舆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至衣赶,卻和暖如春盛正,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屑埋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痰滋,地道東北人摘能。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像敲街,于是被迫代替她去往敵國(guó)和親团搞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • 這篇文章主要講述在Mobile BI(移動(dòng)商務(wù)智能)開(kāi)發(fā)過(guò)程中多艇,在網(wǎng)絡(luò)通信逻恐、數(shù)據(jù)存儲(chǔ)、登錄驗(yàn)證這幾個(gè)方面涉及的加密...
    雨_樹(shù)閱讀 2,424評(píng)論 0 6
  • 一:前言 AES是開(kāi)發(fā)中常用的加密算法之一拨匆。然而由于前后端開(kāi)發(fā)使用的語(yǔ)言不統(tǒng)一,導(dǎo)致經(jīng)常出現(xiàn)前端加密而后端不能解密...
    LikeSomeBody閱讀 2,387評(píng)論 1 1
  • 本文主要介紹移動(dòng)端的加解密算法的分類挽拂、其優(yōu)缺點(diǎn)特性及應(yīng)用惭每,幫助讀者由淺入深地了解和選擇加解密算法。文中會(huì)包含算法的...
    蘋(píng)果粉閱讀 11,504評(píng)論 5 29
  • BBC紀(jì)錄片鍛煉的真相[http://v.qq.com/cover/n/n4cftqwyisz3up5.html]...
    Juude閱讀 407評(píng)論 0 1
  • 已經(jīng)過(guò)了立夏的節(jié)氣亏栈,大家所一直期待的暑假也快要到來(lái)台腥。而相應(yīng)的,有了得以空閑的時(shí)間后绒北,很多人都會(huì)選擇在暑假出游黎侈。而在...
    佛城西雜貨鋪閱讀 1,006評(píng)論 0 13