iOS 常用的加密技術(shù)-MD5,DES,AES

網(wǎng)絡(luò)請求中為了數(shù)據(jù)的安全性 , 通常會對數(shù)據(jù)進(jìn)行加密之后再以JSON形式傳輸?shù)胶笈_ . 就算請求被攔截 , 也可以有效的保護(hù)用戶信息的安全性 . 今天就分享一下 常用的一些加密技術(shù) .


MD5 加密

MD5是利用哈希算法來加密的铺厨。哈希算法是一種摘要算法太颤,MD5有以下兩個最主要的特性 , 常用于用戶密碼的加密使用。

  • 加密的不可逆性窖式,只能夠加密,不能夠解密痊项。
  • 任意長度的明文經(jīng)過加密后長度都是固定的锅风,長度為16進(jìn)制32位。

使用MD5 加密之前應(yīng)該先導(dǎo)入框架 #import "CommonCrypto/CommonDigest.h"

// MD5 轉(zhuǎn)碼
-(NSString *) md5: (NSString *) inPutText
{
    const char *cStr = [inPutText UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(cStr, (CC_LONG)strlen(cStr), result);
    
    return [[NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
             result[0], result[1], result[2], result[3],
             result[4], result[5], result[6], result[7],
             result[8], result[9], result[10], result[11],
             result[12], result[13], result[14], result[15]
             ] lowercaseString];
}

DES加密

DES 加密是一種對稱式加密方法 . 其特點(diǎn)是

  • 加密與解密使用同一套密鑰 , 使用方便 .
  • 具有相當(dāng)高的復(fù)雜性, 其安全性僅以加密密鑰的保密為基礎(chǔ) .

與MD5 一樣也需要導(dǎo)入框架#import "CommonCrypto/CommonDigest.h"
然后還要導(dǎo)入GTMBase64文件

//加密
+(NSString *)decryptWithContent:(NSString *)content
{
    //密鑰 "abc123"
    char * keyChar =(char*)[@"abc123" UTF8String];
    
    if (content == nil) {
        content = @"";
    }
    
    NSString *jm = [NSString stringWithCString:encryptWithKeyAndType([content UTF8String], kCCEncrypt, keyChar) encoding:NSUTF8StringEncoding];
    
    return jm;
    
}
//解密
+ (NSData *)encryptWithContent:(NSData *)content
{
    NSString *contentStr = [[NSString alloc] initWithData:content encoding:NSUTF8StringEncoding];
    
    if (contentStr == nil || [contentStr isEqualToString:@""]) {
        return nil;
    }
    
    const char * contentChar =[contentStr UTF8String];
    //密鑰 "abc123"
    char * keyChar =(char*)[@"abc123" UTF8String];
    const char *miChar;
    miChar = encryptWithKeyAndType(contentChar, kCCDecrypt, keyChar);
    if (miChar == nil) {
        miChar = "";
    }
    
    NSString *zmStr = [NSString stringWithCString:miChar encoding:NSUTF8StringEncoding];
    if (zmStr == nil) {
        zmStr =@"";
    }
    return [zmStr dataUsingEncoding:NSUTF8StringEncoding];
}
//核心代碼
static const char* encryptWithKeyAndType(const char *text,CCOperation encryptOperation,char *key)
{
    NSString *textString=[[NSString alloc]initWithCString:text encoding:NSUTF8StringEncoding];
    //      NSLog(@"[[item.url description] UTF8String=%@",textString);
    const void *dataIn;
    size_t dataInLength;
    
    if (encryptOperation == kCCDecrypt)//傳遞過來的是decrypt 解碼
    {
        //解碼 base64
        NSData *decryptData = [GTMBase64 decodeData:[textString dataUsingEncoding:NSUTF8StringEncoding]];//轉(zhuǎn)成utf-8并decode
        dataInLength = [decryptData length];
        dataIn = [decryptData bytes];
    }
    else  //encrypt
    {
        NSData* encryptData = [textString dataUsingEncoding:NSUTF8StringEncoding];
        dataInLength = [encryptData length];
        dataIn = (const void *)[encryptData bytes];
    }
    
    
    CCCryptorStatus ccStatus;
    uint8_t *dataOut = NULL; //可以理解位type/typedef 的縮寫(有效的維護(hù)了代碼鞍泉,比如:一個人用int皱埠,一個人用long。最好用typedef來定義)
    size_t dataOutAvailable = 0; //size_t  是操作符sizeof返回的結(jié)果類型
    size_t dataOutMoved = 0;
    
    dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
    dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
    memset((void *)dataOut, 00, dataOutAvailable);//將已開辟內(nèi)存空間buffer的首 1 個字節(jié)的值設(shè)為值 0
    
    //NSString *initIv = @"12345678";
    const void *vkey = key;
    const void *iv = (const void *) key; //[initIv UTF8String];
    
    //CCCrypt函數(shù) 加密/解密
    ccStatus = CCCrypt(encryptOperation,//  加密/解密
                       kCCAlgorithmDES,//  加密根據(jù)哪個標(biāo)準(zhǔn)(des咖驮,3des边器,aes。托修。忘巧。。)
                       kCCOptionPKCS7Padding,//  選項分組密碼算法(des:對每塊分組加一次密  3DES:對每塊分組加三個不同的密)
                       vkey,  //密鑰    加密和解密的密鑰必須一致
                       kCCKeySizeDES,//   DES 密鑰的大心廊小(kCCKeySizeDES=8)
                       iv, //  可選的初始矢量
                       dataIn, // 數(shù)據(jù)的存儲單元
                       dataInLength,// 數(shù)據(jù)的大小
                       (void *)dataOut,// 用于返回數(shù)據(jù)
                       dataOutAvailable,
                       &dataOutMoved);
    
    NSString *result = nil;
    
    if (encryptOperation == kCCDecrypt)//encryptOperation==1  解碼
    {
        //得到解密出來的data數(shù)據(jù)砚嘴,改變?yōu)閡tf-8的字符串
        result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding];
    }
    else //encryptOperation==0  (加密過程中,把加好密的數(shù)據(jù)轉(zhuǎn)成base64的)
    {
        //編碼 base64
        NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];
        result = [GTMBase64 stringByEncodingData:data];
    }
    
    return [result UTF8String];
    
}

AES加密

AES加密是一種更高級的對稱加密算法 . 其特點(diǎn)是

  • 密鑰為128位(也有192-256的變體) , 相比DES(56位)更安全.
  • 隱藏了明文模式 , 分組密碼轉(zhuǎn)化為流模式

先導(dǎo)入框架 #import <CommonCrypto/CommonCryptor.h>
代碼下載地址

//加密
- (NSData *)AES256EncryptWithKey:(NSString *)key {
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
    
    // fetch key data
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = [self length];
    
    //See the doc: For block ciphers, the output size will always be less than or
    //equal to the input size plus the size of one block.
    //That's why we need to add the size of one block here
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL /* initialization vector (optional) */,
                                          [self bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    
    free(buffer); //free the buffer;
    return nil;
}
//解密
- (NSData *)AES256DecryptWithKey:(NSString *)key {
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
    
    // fetch key data
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = [self length];
    
    //See the doc: For block ciphers, the output size will always be less than or
    //equal to the input size plus the size of one block.
    //That's why we need to add the size of one block here
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL /* initialization vector (optional) */,
                                          [self bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesDecrypted);
    
    if (cryptStatus == kCCSuccess) {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }
    
    free(buffer); //free the buffer;
    return nil;
}

如果感覺還不錯 , 點(diǎn)擊喜歡鼓勵一下哦 ????????

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涩拙,一起剝皮案震驚了整個濱河市际长,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兴泥,老刑警劉巖工育,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搓彻,居然都是意外死亡如绸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門好唯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竭沫,“玉大人燥翅,你說我怎么就攤上這事骑篙。” “怎么了森书?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵靶端,是天一觀的道長。 經(jīng)常有香客問我凛膏,道長杨名,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任猖毫,我火速辦了婚禮台谍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吁断。我一直安慰自己趁蕊,他們只是感情好坞生,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掷伙,像睡著了一般是己。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上任柜,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天卒废,我揣著相機(jī)與錄音,去河邊找鬼宙地。 笑死摔认,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绸栅。 我是一名探鬼主播级野,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粹胯!你這毒婦竟也來了蓖柔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤风纠,失蹤者是張志新(化名)和其女友劉穎况鸣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竹观,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镐捧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了臭增。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懂酱。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖誊抛,靈堂內(nèi)的尸體忽然破棺而出列牺,到底是詐尸還是另有隱情,我是刑警寧澤拗窃,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布瞎领,位于F島的核電站,受9級特大地震影響随夸,放射性物質(zhì)發(fā)生泄漏九默。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一宾毒、第九天 我趴在偏房一處隱蔽的房頂上張望驼修。 院中可真熱鬧,春花似錦、人聲如沸乙各。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽觅丰。三九已至饵溅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妇萄,已是汗流浹背蜕企。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冠句,地道東北人轻掩。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像懦底,于是被迫代替她去往敵國和親唇牧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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