【iOS開發(fā)】常用加密算法(一)AES加密算法

對稱算法

采用單鑰密碼的加密方法矩屁,同一個密鑰可以同時用來加密和解密冲甘,這種加密方法稱為對稱加密捷雕,也稱為單密鑰加密

常用的對稱加密算法:
DES:數(shù)據(jù)加密標(biāo)準(zhǔn)湾蔓,速度較快瘫析,適用于加密大量數(shù)據(jù)的場合(用得少,因為強(qiáng)度不夠)
3DES:是基于DES卵蛉,對一塊數(shù)據(jù)用3個不同的密鑰進(jìn)行3次加密颁股,強(qiáng)度更高
AES:高級加密標(biāo)準(zhǔn),是下一代的加密算法標(biāo)準(zhǔn)傻丝,速度快甘有,安全級別高,支持128葡缰、192亏掀、256忱反、512位密鑰的加密

算法特征:
加密方和解密方使用同一個密鑰
加密解密的速度比較快,適合數(shù)據(jù)比較長時的使用
密鑰傳輸?shù)倪^程不安全滤愕,且容易被破解温算,密鑰管理也比較麻煩

應(yīng)用模式

ECB(Electronic Code Book)

電子密碼本模式。每一塊數(shù)據(jù)间影,獨(dú)立加密注竿。最基本的加密模式,也就是通常理解的加密魂贬,相同的明文將永遠(yuǎn)加密成相同的密文巩割,無初始向量,容易受到密碼本重放攻擊付燥,一般情況下很少用宣谈。

CBC(Cipher Block Chaining)

密碼分組鏈接模式。使用一個密鑰和一個初始化向量iv對數(shù)據(jù)執(zhí)行加密明文被加密前要與前面的密文進(jìn)行異或運(yùn)算后再加密键科,因此只要選擇不同的初始向量闻丑,相同的密文加密后會形成不同的密文,這是目前應(yīng)用最廣泛的模式勋颖。CBC加密后的密文是上下文相關(guān)的嗦嗡,但明文的錯誤不會傳遞到后續(xù)分組,但如果一個分組丟失牙言,后面的分組將全部作廢(同步錯誤)CBC可以有效的保證密文的完整性酸钦,如果一個數(shù)據(jù)塊在傳遞是丟失或改變,后面的數(shù)據(jù)將無法正常解密咱枉。
向量iv的作用:
很多加密算法都和幾何圖形有關(guān)卑硫,幾何圖形的變量算法同樣具有規(guī)律性,但算法的規(guī)律結(jié)果變幻莫測蚕断。
例如:一個圓上有無數(shù)個點(diǎn)欢伏,如果把某一個點(diǎn)視為向量iv,加密結(jié)果則會有無數(shù)種亿乳,所以將幾何算法添加到加密算法中硝拧,它的破解難度系數(shù)變得更大。

用OC實現(xiàn)AES加解密

1葛假、導(dǎo)入頭文件 (Ps:Ivv是CBC模式的偏移向量障陶,ECB模式不需要)

#import <CommonCrypto/CommonCryptor.h>
#define Ivv @"0000000000000000" //偏移量,可自行修改

2、主要實現(xiàn)代碼:
加密部分:

#pragma mark - encrypt
+ (NSString *)encrypt:(NSString *)message password:(NSString *)password {
    //將hexstring轉(zhuǎn)化為nsdata
    NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding];
    //使用密碼對nsdata進(jìn)行加密
    NSData *encryptedData = [self AES128EncryptWithKey:password gIv:Ivv messageData:data];
    
    //返回進(jìn)行16進(jìn)制轉(zhuǎn)碼的加密字符串
    return [self hexStringFromData:encryptedData];
}

+ (NSData *)AES128EncryptWithKey:(NSString *)key gIv:(NSString *)Iv messageData:(NSData *)data{//加密
    char keyPtr[kCCKeySizeAES128+1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    char ivPtr[kCCKeySizeAES128+1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [Iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = [data length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          kCCBlockSizeAES128,
                                          ivPtr,
                                          [data bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    free(buffer);
    return nil;
}

//data數(shù)據(jù)轉(zhuǎn)hex string
+ (NSString *) hexStringFromData:(NSData*) data
{
    NSUInteger i, len;
    unsigned char *buf, *bytes;
    
    len = data.length;
    bytes = (unsigned char*)data.bytes;
    //buf = malloc(len*2);
    buf = (unsigned char *)malloc(len*2);
    for (i=0; i<len; i++) {
        buf[i*2] = itoh((bytes[i] >> 4) & 0xF);
        buf[i*2+1] = itoh(bytes[i] & 0xF);
    }
    
    return [[NSString alloc] initWithBytesNoCopy:buf
                                          length:len*2
                                        encoding:NSASCIIStringEncoding
                                    freeWhenDone:YES];
}

解密部分:

#pragma mark - decrypt

+ (NSString *)decrypt:(NSString *)encodedString password:(NSString *)password {
    //hexstring轉(zhuǎn)data
    NSData *strata = [EAccountSDKCommonUtil dataFromHexString:encodedString];
    //使用密碼對data進(jìn)行解密
    NSData *decryData = [self AES128DecryptWithKey:password gIv:Ivv decrypData:strata];
    //將解了密碼的nsdata轉(zhuǎn)化為nsstring
    NSString *str = [[NSString alloc] initWithData:decryData encoding:NSUTF8StringEncoding];
    return str;
    
}

+ (NSData *)AES128DecryptWithKey:(NSString *)key gIv:(NSString *)Iv decrypData:(NSData *)data{//解密
    char keyPtr[kCCKeySizeAES128+1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    char ivPtr[kCCKeySizeAES128+1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [Iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = [data length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          kCCBlockSizeAES128,
                                          ivPtr,
                                          [data bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesDecrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }
    free(buffer);
    return nil;
}

加解密都是通過系統(tǒng)的CCCrypt實現(xiàn)聊训,其中涉及11個參數(shù)抱究,稍微做下說明(Ps:CCCrypt函數(shù)的使用,盡量不要直接傳遞原文和key带斑,建議對其進(jìn)行異或加密鼓寺,然后再調(diào)用CCCrypt函數(shù))

CCCryptorStatus CCCrypt(
   CCOperation op,               kCCEncrypt 加密 / kCCDeccrypt 解密
   CCAlgorithm alg,               加密算法
   CCOptions options,           加密選項 ECB / CBC
   const void *key,                 KEY的地址
   size_t keyLength,              KEY的長度
   const void *iv,                    iv初始化向量
   const void *dataIn,            加密的數(shù)據(jù)
   size_t dataInLength,         加密數(shù)據(jù)的長度
   void *dataOut,                   密文的內(nèi)存地址
   size_t dataOutAvailable,   密文緩沖區(qū)的大小
   size_t *dataOutMoved       數(shù)據(jù)的指針(加密結(jié)果大醒狻)
)

AES算法原理

具體的原理有興趣的參考這篇博客:https://blog.csdn.net/qq_28205153/article/details/55798628

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妈候,隨后出現(xiàn)的幾起案子敢靡,更是在濱河造成了極大的恐慌,老刑警劉巖苦银,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啸胧,死亡現(xiàn)場離奇詭異,居然都是意外死亡幔虏,警方通過查閱死者的電腦和手機(jī)吓揪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來所计,“玉大人,你說我怎么就攤上這事团秽≈麟剩” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵习勤,是天一觀的道長踪栋。 經(jīng)常有香客問我,道長图毕,這世上最難降的妖魔是什么夷都? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮予颤,結(jié)果婚禮上囤官,老公的妹妹穿的比我還像新娘。我一直安慰自己蛤虐,他們只是感情好党饮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驳庭,像睡著了一般刑顺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饲常,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天蹲堂,我揣著相機(jī)與錄音,去河邊找鬼贝淤。 笑死柒竞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的霹娄。 我是一名探鬼主播能犯,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鲫骗,長吁一口氣:“原來是場噩夢啊……” “哼权旷!你這毒婦竟也來了倒源?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤嗡善,失蹤者是張志新(化名)和其女友劉穎渡蜻,沒想到半個月后术吝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茸苇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年排苍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片学密。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡淘衙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腻暮,到底是詐尸還是另有隱情彤守,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布哭靖,位于F島的核電站具垫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏试幽。R本人自食惡果不足惜筝蚕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铺坞。 院中可真熱鬧起宽,春花似錦、人聲如沸康震。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腿短。三九已至屏箍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間橘忱,已是汗流浹背赴魁。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钝诚,地道東北人颖御。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親潘拱。 傳聞我的和親對象是個殘疾皇子疹鳄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

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