iOS ?AES 加密吹截,CBC、NoPadding

這幾天項目要求做一個加密功能凝危,采用的是 AES 加密波俄,要求是 CBC 方式NoPadding。項目需求只有加密功能蛾默,所以這里沒有對應(yīng)的解密方法懦铺。不過照著加密的方法推導(dǎo)一下,結(jié)合網(wǎng)上的文章看一看支鸡,差不多也能寫出來冬念。
項目并沒有用GTMBase64做轉(zhuǎn)碼,大致的流程是:

加密內(nèi)容----轉(zhuǎn)成 NSData ---- AES 加密并得到結(jié)果 ---- 把結(jié)果轉(zhuǎn)成16進(jìn)制傳給后臺 ---- 完事兒

首先需要的參數(shù):
  • key:移動端和后端約定的秘鑰苍匆。
  • ivValue:可選的初始化向量刘急,我這方法里就沒用到這個值。
  • content:就是你需要加密的內(nèi)容浸踩。
接下來是加密部分:

導(dǎo)入頭文件#import <CommonCrypto/CommonCrypto.h>
代碼

+ (NSString *)AES128Encrypt:(NSData *)plainText keyString:(NSString *)keyStr
{
    //  這里的 plainText 是由需要加密的內(nèi)容 string 轉(zhuǎn)成 NSData 的叔汁,下面會詳細(xì)說.
    NSUInteger dataLength = [plainText length];
    
    unsigned long diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
    unsigned long newSize = 0;
    
    if(diff > 0)
    {
        newSize = dataLength + diff;
    }
    
    char dataPtr[newSize];
    memcpy(dataPtr, [plainText bytes], [plainText length]);
    for(int i = 0; i < diff; i++)
    {
        //  0x0000 代表 no padding 
        dataPtr[i + dataLength] = 0x0000;
    }
    
    size_t bufferSize = newSize + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    memset(buffer, 0, bufferSize);
    
    size_t numBytesCrypted = 0;
    
    //    這里的 byte 表示初始化向量,下面會詳細(xì)說.
    //    Byte byte[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          0x0000,                 //  0x00 表示 no padding检碗,其他的根據(jù)情況來選
                                          [keyStr UTF8String],    //  keyPtr
                                          kCCKeySizeAES128,
                                          NULL,                   //  原本是初始化向量值,不過是可選的据块,所以用 NULL
                                          dataPtr,
                                          sizeof(dataPtr),
                                          buffer,
                                          bufferSize,
                                          &numBytesCrypted);
    
    if (cryptStatus == kCCSuccess) {
        NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
        //    將加密好的數(shù)據(jù)轉(zhuǎn)成16進(jìn)制的字符
        return [self hexStringFromData:resultData];
    }
    free(buffer);
    return nil;
}


+ (NSString *)hexStringFromData:(NSData *)data {
    Byte *bytes = (Byte *)[data bytes];
    // 下面是Byte 轉(zhuǎn)換為16進(jìn)制。
    NSString *hexStr = @"";
    for(int i=0; i<[data length]; i++) {
        NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i] & 0xff]; //16進(jìn)制數(shù)
        newHexStr = [newHexStr uppercaseString];
        
        if([newHexStr length] == 1) {
            newHexStr = [NSString stringWithFormat:@"0%@",newHexStr];
        }
        
        hexStr = [hexStr stringByAppendingString:newHexStr];
        
    }
    return hexStr;
}
說明
  • 這里說說上面代碼里提到的 plainText折剃。
    項目里要求先把 content 轉(zhuǎn)成 data另假,如果 data 的長度不足64位需要在末尾補(bǔ)0。所以原本是 string 類型的 plainText 在這兒就是 data 類型了怕犁,可以根據(jù)自己的需要改一下子就行边篮。把代碼放在下面,有需要的就用奏甫,沒需要的就略過吧戈轿。
  • 還有一個初始化向量,剛開始后臺給了這個值阵子,就是代碼里那16個0x00的 byte 數(shù)組思杯。但是后來發(fā)現(xiàn)這個向量值用不上,所以本文一開頭兒也說了這玩意兒可選挠进,看具體情況來吧色乾。
  • 最后把加密完的內(nèi)容轉(zhuǎn)成16進(jìn)制也是項目需求誊册,具體轉(zhuǎn)不轉(zhuǎn)不強(qiáng)求,只要后臺能解密出來就行暖璧。
    NSString *contStr = @"這是一個天大的秘密內(nèi)容";
    //  把內(nèi)容轉(zhuǎn)成 data
    NSData *contData = [contStr dataUsingEncoding:NSUTF8StringEncoding];
    //  創(chuàng)建一個64位的 byte 數(shù)組
    //Byte *byteData = (Byte*)malloc(64);     //  這樣創(chuàng)建的數(shù)組在位數(shù)不夠時好像并不會補(bǔ)0
    Byte byteData[64] = {0};
    //  得到轉(zhuǎn)化成 data 的內(nèi)容的 byte 數(shù)組
    char *byteObj = (char *)[contData bytes];
    //  把內(nèi)容的 byte 遍歷到新的 byte 數(shù)組里去
    for (int i=0; i<contData.length; i++) {
            byteData[i] = byteObj[i];
    }
    //  得到新的 data
    //  這個 '48' 也是個不解的地方案怯,為啥不是 64 呢?
    NSData *encryptData = [[NSData alloc]initWithBytes:byteData length:48];
    //  把新的 data 進(jìn)行 AES 加密漆撞,并得到加密后的 string
    NSString *aesStr = [AESEncrypt AES128Encrypt:encryptData keyString:gkey];
    NSLog(@"加密:%@",aesStr);
最后

不明白的地方殴泰,如果哪位明白人兒能搞懂,麻煩你給翻譯翻譯浮驳,謝謝了悍汛!
當(dāng)然了,自己也得找找帖子琢磨琢磨至会,以下是參考過的帖子离咐。

iOS AES128 CBC No Padding加密解密
AES加密 - iOS與Java的同步實現(xiàn)
[拿走直接用] iOS加密:AES+Base64

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奉件,隨后出現(xiàn)的幾起案子宵蛀,更是在濱河造成了極大的恐慌,老刑警劉巖县貌,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件术陶,死亡現(xiàn)場離奇詭異,居然都是意外死亡煤痕,警方通過查閱死者的電腦和手機(jī)梧宫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摆碉,“玉大人塘匣,你說我怎么就攤上這事∠锏郏” “怎么了忌卤?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長楞泼。 經(jīng)常有香客問我驰徊,道長,這世上最難降的妖魔是什么堕阔? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任辣垒,我火速辦了婚禮,結(jié)果婚禮上印蔬,老公的妹妹穿的比我還像新娘。我一直安慰自己脱衙,他們只是感情好侥猬,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布例驹。 她就那樣靜靜地躺著,像睡著了一般退唠。 火紅的嫁衣襯著肌膚如雪鹃锈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天瞧预,我揣著相機(jī)與錄音屎债,去河邊找鬼。 笑死垢油,一個胖子當(dāng)著我的面吹牛盆驹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滩愁,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼躯喇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了硝枉?” 一聲冷哼從身側(cè)響起廉丽,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妻味,沒想到半個月后正压,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡责球,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年焦履,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棕诵。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡裁良,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出校套,到底是詐尸還是另有隱情价脾,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布笛匙,位于F島的核電站侨把,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏妹孙。R本人自食惡果不足惜秋柄,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蠢正。 院中可真熱鬧骇笔,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芦劣,卻和暖如春粗俱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虚吟。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工寸认, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人串慰。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓偏塞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親模庐。 傳聞我的和親對象是個殘疾皇子烛愧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

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

  • 概述 之前一直對加密相關(guān)的算法知之甚少,只知道類似DES掂碱、RSA等加密算法能對數(shù)據(jù)傳輸進(jìn)行加密怜姿,且各種加密算法各有...
    Henryzhu閱讀 3,009評論 0 14
  • 前言: 在我們開發(fā)中免不了和服務(wù)器做一些數(shù)據(jù)交互,在交互過程中走得都是http請求疼燥,這類請求不像https那樣的安...
    退役程序猿閱讀 4,603評論 2 6
  • 成長是什么沧卢,是蝴蝶蛻變的過程,是寶劍磨出的過程醉者,想更要美麗就必須痛苦但狭,想要堅強(qiáng)就必須千錘百煉。 成長在還蠢時的我以...
    吾木子生閱讀 188評論 0 0
  • 在我讀書的地方撬即,也不是特別發(fā)達(dá)立磁,但是與我的家鄉(xiāng)相比,仍然是有差距的剥槐。 在讀書時去辦一張卡唱歧,銀行里面有好幾個窗口,有...
    may徊閱讀 254評論 0 0
  • 此刻在食堂等飯,爸爸昨天打電話說是想要去眼袋蕊苗,讓我給他帶眼霜沿后。 正好也是前期有給他嘗試過的,爸爸開注重健康和美麗朽砰,...
    作家阿紫閱讀 190評論 0 1