iOS加密之AES

心急的童鞋直接看這里Demo
運(yùn)行之后可以去在線加密網(wǎng)站驗(yàn)證

AES(Advanced Encryption Standard)高級加密標(biāo)準(zhǔn),又稱Rijndael加密法抡医,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)浦徊。這個(gè)標(biāo)準(zhǔn)用來替代原先的DES

AES的五種加密模式

AES有五種加密模式(CBC坛善、ECB喘蟆、CTR镇眷、OCF季惯、CFB)
1.電碼本模式(Electronic Code Book (ECB))
2.密碼分組鏈接模式(Cipher Block Chaining (CBC))
3.計(jì)算器模式(Counter (CTR))
4.密碼反饋模式(Cipher FeedBack (CFB))
5.輸出反饋模式(Output FeedBack (OFB))

在iOS用到的一般就是ECB和CBC兩種吠各。

ECB-電碼本模式

ECB是最簡單的塊密碼加密模式臀突,加密前根據(jù)加密塊大小(AES加密塊固定為128位)分成若干塊贾漏,之后將每塊使用相同的密鑰單獨(dú)加密候学,所以加密塊相同的明文會(huì)生成相同的密文。

CBC-密碼分組鏈接模式

CBC模式對于每個(gè)待加密的密碼塊在加密前會(huì)先與前一個(gè)密碼塊的密文異或然后再用加密器加密纵散。第一個(gè)明文塊與一個(gè)叫初始化向量的數(shù)據(jù)塊異或梳码。

OK,最簡單的理論理解了伍掀,就來看iOS最重要的干貨:加解密函數(shù)CCCrypt

CCCrypt - 加解密函數(shù)

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)

重要的參數(shù)說明:

  1. CCOperation op:加密kCCEncrypt掰茶,解密kCCDecrypt
  2. CCAlgorithm alg:加密算法,這里kCCAlgorithmAES128和kCCAlgorithmAES是一樣的,AES加密塊固定是128位蜜笤,咱們常說的AES128濒蒋、192、256加密只是加密秘鑰的長度不同(當(dāng)然加密處理輪數(shù)也不同把兔,這里就不做說明了)
  3. CCOptions options:
    kCCOptionPKCS7Padding:填充模式
    kCCOptionECBMode:ECB模式
  4. size_t keyLength:參數(shù)是下面這些沪伙,看到很多博客不管是128還是256,這里都寫kCCBlockSizeAES128县好,這是不對的围橡,這樣加密出來的其實(shí)還是128加密
enum {
    kCCKeySizeAES128          = 16,
    kCCKeySizeAES192          = 24,
    kCCKeySizeAES256          = 32,
    kCCKeySizeDES             = 8,
    kCCKeySize3DES            = 24,
    kCCKeySizeMinCAST         = 5,
    kCCKeySizeMaxCAST         = 16,
    kCCKeySizeMinRC4          = 1,
    kCCKeySizeMaxRC4          = 512,
    kCCKeySizeMinRC2          = 1,
    kCCKeySizeMaxRC2          = 128,
    kCCKeySizeMinBlowfish     = 8,
    kCCKeySizeMaxBlowfish     = 56,
};
  1. iv:偏移向量,CBC模式下需要缕贡,不傳默認(rèn)16位0翁授,ECB不需要
關(guān)于CCCrypt中的key和keyLength

AES數(shù)據(jù)塊長度為128位,所以IV長度需要為16個(gè)字符(ECB模式不用IV)善绎,密鑰根據(jù)指定密鑰位數(shù)分別為16黔漂、24、32個(gè)字符禀酱,IV與密鑰超過長度則截取炬守,不足則在末尾填充'\0'補(bǔ)足

key和keyLength之間的關(guān)系,現(xiàn)在算是搞明白了剂跟,key就是咱們傳入的密鑰减途,keyLength是決定密鑰長度的,也就是aes128曹洽,192鳍置,256的真正區(qū)別了,如果傳入的key是32位送淆,也就是256要求的位數(shù)税产,但是keyLength選擇了kCCKeySizeAES128,那么真正的key其實(shí)是截取前面的16位,如果key傳入16位辟拷,但是keyLength選擇了kCCKeySizeAES256撞羽,那就是密鑰位數(shù)不夠,會(huì)自動(dòng)補(bǔ)全到32位
雖然密鑰長度不夠的話會(huì)自動(dòng)補(bǔ)齊或者截取衫冻,不過感覺還是傳入正確的密鑰比較好诀紊,128的keysize=16,192keysize=24隅俘,256keysize=32

好了邻奠,直接上代碼
Demo
需要引入 #import <CommonCrypto/CommonCrypto.h>

AES256 ECB模式加密

+(NSData *)dataByAes256ECB:(NSData *)data key:(NSString *)key mode:(CCOperation)operation {
    char keyPtr[kCCKeySizeAES256 + 1];//選擇aes256加密,所以key長度應(yīng)該是kCCKeySizeAES256为居,32位
    bzero(keyPtr, sizeof(keyPtr));//清零
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];//秘鑰key轉(zhuǎn)成cString
    
    NSUInteger dataLength = data.length;
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    
    void * buffer = malloc(bufferSize);
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(operation,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,//ECB模式
                                          keyPtr,
                                          kCCKeySizeAES256,
                                          NULL,//選擇ECB模式碌宴,不需要向量
                                          data.bytes,
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesDecrypted);
    if (cryptStatus == kCCSuccess) {
        NSData * result = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
        return result;
    }
    free(buffer);
    return nil;
}

AES128 CBC模式加解密

+(NSData *)dataByAes128CBC:(NSData *)data key:(NSString *)key mode:(CCOperation)operation iv:(NSString *)iv {
    char keyPtr[kCCKeySizeAES128 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = data.length;
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void * buffer = malloc(bufferSize);
    size_t numBytesDecrypted = 0;
    
    NSString * initIv = iv;
    char ivPtr[kCCBlockSizeAES128+1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [initIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    CCCryptorStatus cryptStatus = CCCrypt(operation,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          kCCKeySizeAES128,
                                          ivPtr,
                                          data.bytes,
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesDecrypted);
    if (cryptStatus == kCCSuccess) {
        NSData * result = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
        return result;
    }
    free(buffer);
    return nil;
}

在線驗(yàn)證

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市颜骤,隨后出現(xiàn)的幾起案子唧喉,更是在濱河造成了極大的恐慌,老刑警劉巖忍抽,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異董朝,居然都是意外死亡鸠项,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門子姜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祟绊,“玉大人,你說我怎么就攤上這事哥捕∧脸椋” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵遥赚,是天一觀的道長扬舒。 經(jīng)常有香客問我,道長凫佛,這世上最難降的妖魔是什么讲坎? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮愧薛,結(jié)果婚禮上晨炕,老公的妹妹穿的比我還像新娘。我一直安慰自己毫炉,他們只是感情好瓮栗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般费奸。 火紅的嫁衣襯著肌膚如雪弥激。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天货邓,我揣著相機(jī)與錄音秆撮,去河邊找鬼。 笑死换况,一個(gè)胖子當(dāng)著我的面吹牛职辨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戈二,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舒裤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了觉吭?” 一聲冷哼從身側(cè)響起腾供,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲜滩,沒想到半個(gè)月后伴鳖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徙硅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年榜聂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗓蘑。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡须肆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桩皿,到底是詐尸還是另有隱情豌汇,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布泄隔,位于F島的核電站拒贱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏梅尤。R本人自食惡果不足惜柜思,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巷燥。 院中可真熱鬧赡盘,春花似錦、人聲如沸缰揪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抛姑,卻和暖如春赞厕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背定硝。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工皿桑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔬啡。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓诲侮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親箱蟆。 傳聞我的和親對象是個(gè)殘疾皇子沟绪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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

  • 很久沒寫博客,Markdown牽出來遛遛 AES加密時(shí)需要統(tǒng)一的幾個(gè)參數(shù)。 1.本例使用AES-128, 2.AE...
    ZIM東東閱讀 1,856評論 0 1
  • 高級加密標(biāo)準(zhǔn)(英語:Advanced EncryptionStandard空猜,縮寫:AES)绽慈,在密碼學(xué)中又稱Rijn...
    黃曉果閱讀 11,065評論 0 2
  • AES是開發(fā)中常用的加密算法之一。然而由于前后端開發(fā)使用的語言不統(tǒng)一辈毯,導(dǎo)致經(jīng)常出現(xiàn)前端加密而后端不能解密的情況出現(xiàn)...
    WelkinXie閱讀 27,067評論 35 86
  • 古人云:久病成良醫(yī)谆沃!究其根源裙士,無外乎,別人的不適管毙,自己皆有經(jīng)歷,推己及人桌硫,推人及己夭咬,一念悲心而已 漫長的求醫(yī),學(xué)醫(yī)...
    SunnyGe閱讀 175評論 0 0
  • 默認(rèn)Library是隱藏的卓舵,隱藏顯示文件夾參考Mac 終端命令 Xcode 代碼片段-CodeSnippets 默...
    WeeverLu閱讀 4,160評論 0 3