iOS開(kāi)發(fā)-AES叔磷、DES加密

本文主要說(shuō)AES加密,而DES大同小異奖磁,揭秘也是一個(gè)屬性的問(wèn)題
首先改基,網(wǎng)絡(luò)上關(guān)于iOSAES加密的資料與方法有很多,并且也都可以運(yùn)行咖为,但是大部分作者都是就自己項(xiàng)目寫的代碼秕狰,具體參數(shù)和可能出現(xiàn)坑的地方都沒(méi)有說(shuō)明白,也就是說(shuō)躁染,那些代碼可能沒(méi)有錯(cuò)鸣哀,但就是不適用于你自己的項(xiàng)目。

特別說(shuō)明:1. 本文是自己項(xiàng)目中用到后用來(lái)記錄之用褐啡,也為了興許能幫助到的同胞诺舔。如果有說(shuō)的不對(duì)的地方,感謝指正;2. 以下代碼是自己學(xué)習(xí)過(guò)程中低飒,通過(guò)網(wǎng)絡(luò)上不同大神們的代碼結(jié)合所成许昨;3. 以下言論需要斟酌后使用,出錯(cuò)不負(fù)責(zé)褥赊,幫你解決問(wèn)題也不收禮

先上代碼

/**
 *  加密
 *
 *  @param plainText 明文
 *  @param key       密鑰
 *  @param iv        向量
 *
 *  @return 密文
 */
+ (NSString *)AES256Encrypt:(NSString *)plainText key:(NSString *)key iv:(NSString *)iv {
    
    char keyPtr[kCCKeySizeAES256+1];
    memset(keyPtr, 0, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    char ivPtr[kCCBlockSizeAES128 + 1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
    
    size_t bufferSize = [data length] + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesEncrypted = 0;
    
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          [key length],
                                          ivPtr,
                                          [data bytes],
                                          [data length],
                                          buffer,
                                          bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        return [resultData base64EncodedStringWithOptions:0];
    }
    free(buffer);
    return nil;
}

需要注意的地方有幾個(gè):

  1. CCCrypt 第一個(gè)參數(shù):kCCEncrypt:加密 糕档;kCCDecrypt:解密
  2. CCCrypt 第二個(gè)參數(shù):區(qū)分AES加密與DES加密
  3. key(密鑰)的長(zhǎng)度,char keyPtr[kCCKeySizeAES256+1];需要注意此處后臺(tái)給你的key的長(zhǎng)度,AES的key長(zhǎng)度kCCKeySizeAES128 = 16, kCCKeySizeAES192 = 24, kCCKeySizeAES256 = 32,
  4. 向量的長(zhǎng)度,char ivPtr[kCCBlockSizeAES128 + 1];一般就是16位拌喉,我自己認(rèn)為沒(méi)有再多的了
  5. 最后一個(gè)非常要注意的點(diǎn):iOS中填充模式?jīng)]有[kCCOptionPKCS5Padding][1]模式速那,而如果后臺(tái)跟安卓又都是kCCOptionPKCS5Padding的話,那iOS就可以在CCCrypt參數(shù)中用kCCOptionPKCS7Padding | kCCOptionECBMode(不寫的話默認(rèn)為CBC模式)來(lái)代替尿背。以下純屬個(gè)人猜想??為什么加了這個(gè)東西端仰,結(jié)果出來(lái)就跟kCCOptionPKCS5Padding的一樣:因?yàn)镮V向量默認(rèn)是16個(gè)0,而kCCOptionPKCS7Padding的填充模式又是不足補(bǔ)0田藐,但是ECB加密模式是不需要向量的荔烧,所以在kCCOptionPKCS7Padding的基礎(chǔ)上加了kCCOptionECBMode就跟kCCOptionPKCS5Padding的是缺幾個(gè)字節(jié)就補(bǔ)充幾個(gè)字節(jié)的幾模式結(jié)果一樣了??
  6. 如果不寫kCCOptionECBMode,使用了默認(rèn)的CBC模式汽久,并且沒(méi)有固定向量IV的話鹤竭,每次的加密結(jié)果都會(huì)是不一樣的,因?yàn)榫按迹珻BC時(shí)需要向量的臀稚,所以每次會(huì)生成一個(gè)隨機(jī)的向量,所以每次加密結(jié)果都不一樣三痰。
  7. 在出現(xiàn)錯(cuò)誤時(shí)從以下幾個(gè)方面進(jìn)行檢查
    1. key與IV長(zhǎng)度問(wèn)題
    2. 填充模式問(wèn)題kCCOptionPKCS5Padding吧寺,kCCOptionPKCS7Padding
    3. 很多時(shí)候,后臺(tái)的同事也不明白AES加密的具體情況酒觅,他們可能也只是從網(wǎng)絡(luò)上找了一些方法來(lái)加密撮执,所以微峰,不用太指望別人跟你說(shuō)他們模式等東西舷丹。最好的辦法就是,給后臺(tái)一個(gè)明文蜓肆,讓他們用他們的模式生成一個(gè)秘文颜凯,然后確定好KEY與IV之后,在自己的程序中修改參數(shù)最終確定是那種模式(當(dāng)然仗扬,如果后臺(tái)給你症概,把AES加密的各種模式都跟你說(shuō)了,最好)

阿里云服務(wù)器免費(fèi)領(lǐng)了,企業(yè)新用戶:4核-8G-5M,個(gè)人用戶:2核-4G-1M
點(diǎn)擊立即領(lǐng)取

免費(fèi)阿里云服務(wù)器立即領(lǐng)取


  1. PKCS7Padding跟PKCS5Padding的區(qū)別就在于數(shù)據(jù)填充方式早芭,PKCS7Padding是缺幾個(gè)字節(jié)就補(bǔ)幾個(gè)字節(jié)的0彼城,而PKCS5Padding是缺幾個(gè)字節(jié)就補(bǔ)充幾個(gè)字節(jié)的幾,好比缺6個(gè)字節(jié),就補(bǔ)充6個(gè)字節(jié)的6 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末募壕,一起剝皮案震驚了整個(gè)濱河市调炬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舱馅,老刑警劉巖缰泡,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異代嗤,居然都是意外死亡棘钞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門干毅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宜猜,“玉大人,你說(shuō)我怎么就攤上這事硝逢”Χ瘢” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵趴捅,是天一觀的道長(zhǎng)垫毙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)拱绑,這世上最難降的妖魔是什么综芥? 我笑而不...
    開(kāi)封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮猎拨,結(jié)果婚禮上膀藐,老公的妹妹穿的比我還像新娘。我一直安慰自己红省,他們只是感情好额各,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著吧恃,像睡著了一般虾啦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痕寓,一...
    開(kāi)封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天傲醉,我揣著相機(jī)與錄音,去河邊找鬼呻率。 笑死硬毕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的礼仗。 我是一名探鬼主播吐咳,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逻悠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了韭脊?” 一聲冷哼從身側(cè)響起蹂风,我...
    開(kāi)封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乾蓬,沒(méi)想到半個(gè)月后惠啄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡任内,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年撵渡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片死嗦。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡趋距,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出越除,到底是詐尸還是另有隱情节腐,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布摘盆,位于F島的核電站翼雀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏孩擂。R本人自食惡果不足惜狼渊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望类垦。 院中可真熱鬧狈邑,春花似錦、人聲如沸蚤认。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)砰琢。三九已至蘸嘶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氯析,已是汗流浹背亏较。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工莺褒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掩缓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓遵岩,卻偏偏與公主長(zhǎng)得像你辣,于是被迫代替她去往敵國(guó)和親巡通。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • Base64 base64是一種基于64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的表示方法.嚴(yán)格來(lái)說(shuō)它只能算作一種編碼方式.B...
    miku醬啦閱讀 1,197評(píng)論 0 3
  • 原文: http://mrpeak.cn/blog/encrypt/ 移動(dòng)端App安全如果按CS結(jié)構(gòu)來(lái)劃分的話舍哄,主...
    vb12閱讀 899評(píng)論 0 6
  • 這篇文章主要講述在Mobile BI(移動(dòng)商務(wù)智能)開(kāi)發(fā)過(guò)程中宴凉,在網(wǎng)絡(luò)通信、數(shù)據(jù)存儲(chǔ)表悬、登錄驗(yàn)證這幾個(gè)方面涉及的加密...
    雨_樹閱讀 2,439評(píng)論 0 6
  • 我的包山底很小弥锄,小如一粒稻谷 一粒小麥、一顆土豆 躺臥在我靈魂的版圖上 我用思念的放大鏡蟆沫,把這一粒鄉(xiāng)愁 放大成96...
    溫州慕白閱讀 599評(píng)論 0 2
  • 當(dāng)然是不幸籽暇,但同時(shí)也是必然,在高4畢業(yè)的這個(gè)暑假饭庞,我被確診為混合痔瘡戒悠。 痔瘡分為內(nèi)痔和外痔,內(nèi)痔長(zhǎng)在肛門內(nèi)舟山,外痔長(zhǎng)...
    yingshaoxo閱讀 501評(píng)論 0 0