iOS加密辈赋、解密、算法(MD5膏燕、SHA钥屈、RSA、DES坝辫、AES)

最近在做一個項目篷就,有使用到加密、解密操作近忙。本想打算直接使用openssl庫竭业,但考慮到openssl使用的還是libssl.a和libcrypto.a的靜態(tài)庫,而且存在安全漏洞及舍;再想想我要開發(fā)的項目是SDK形式未辆,供第三方使用的;最后選擇了使用iOS原生CommonCrypto和Security.framework锯玛。如下圖:


CommonCrypto.h

Security.h

先介紹幾個概念:
編碼:Base64編碼
算法:MD5咐柜、SHA兼蜈、RSA
標準:DES、AES

1拙友、Base64是網(wǎng)絡上最常見的用于傳輸8Bit字節(jié)代碼的編碼方式之一为狸。Base64編碼可用于在HTTP環(huán)境下傳遞較長的標識信息。采用Base64編碼具有不可讀性遗契,即所編碼的數(shù)據(jù)不會被人用肉眼所直接看到辐棒。

/**
 NSString編碼成NSString
 @param string
 */
+ (NSString *)encodeString:(NSString *)string {
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    NSString *encodeString = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    return encodeString;
}

/**
 NSString解碼成NSString
 @param data
 */
+ (NSString *)decodeString:(NSString *)string {
    NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
    NSString *decodeString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    return decodeString;
}

/**
 NSData編碼成NSString
 @param data
 */
+ (NSString *)encodeData:(NSData *)data {
    NSString *encodeString = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    return encodeString;
}

/**
 NSData解碼成NSString
 @param data
 */
+ (NSString *)decodeData:(NSData *)data {
    NSData *base64Data = [[NSData alloc] initWithBase64EncodedData:data options:0];
    NSString *decodeString = [[NSString alloc] initWithData:base64Data encoding:NSUTF8StringEncoding];
    return decodeString;
}
/**
 NSString字符串轉(zhuǎn)NSData
 */
+ (NSData *)base64DataFromString:(NSString *)string {
    unsigned long ixtext, lentext;
    unsigned char ch, inbuf[4], outbuf[3];
    short i, ixinbuf;
    Boolean flignore, flendtext = false;
    const unsigned char *tempcstring;
    NSMutableData *theData;
    
    if (string == nil) {
        return [NSData data];
    }
    
    ixtext = 0;
    
    tempcstring = (const unsigned char *)[string UTF8String];
    
    lentext = [string length];
    
    theData = [NSMutableData dataWithCapacity: lentext];
    
    for (int i=0; i<4; i++) {
        inbuf[i] = 0x00;
    }
    
    ixinbuf = 0;
    
    while (true) {
        if (ixtext >= lentext) {
            break;
        }
        
        ch = tempcstring [ixtext++];
        
        flignore = false;
        
        if ((ch >= 'A') && (ch <= 'Z')) {
            ch = ch - 'A';
        }
        else if ((ch >= 'a') && (ch <= 'z')) {
            ch = ch - 'a' + 26;
        }
        else if ((ch >= '0') && (ch <= '9')) {
            ch = ch - '0' + 52;
        }
        else if (ch == '+') {
            ch = 62;
        }
        else if (ch == '=') {
            flendtext = true;
        }
        else if (ch == '/') {
            ch = 63;
        }
        else {
            flignore = true;
        }
        
        if (!flignore) {
            short ctcharsinbuf = 3;
            Boolean flbreak = false;
            
            if (flendtext) {
                if (ixinbuf == 0) {
                    break;
                }
                
                if ((ixinbuf == 1) || (ixinbuf == 2)) {
                    ctcharsinbuf = 1;
                }
                else {
                    ctcharsinbuf = 2;
                }
                
                ixinbuf = 3;
                
                flbreak = true;
            }
            
            inbuf [ixinbuf++] = ch;
            
            if (ixinbuf == 4) {
                ixinbuf = 0;
                
                outbuf[0] = (inbuf[0] << 2) | ((inbuf[1] & 0x30) >> 4);
                outbuf[1] = ((inbuf[1] & 0x0F) << 4) | ((inbuf[2] & 0x3C) >> 2);
                outbuf[2] = ((inbuf[2] & 0x03) << 6) | (inbuf[3] & 0x3F);
                
                for (i = 0; i < ctcharsinbuf; i++) {
                    [theData appendBytes: &outbuf[i] length: 1];
                }
            }
            
            if (flbreak) {
                break;
            }
        }
    }
    
    return theData;
}

2、MD5即Message-Digest Algorithm 5(信息-摘要算法5)牍蜂,用于確保信息傳輸完整一致漾根。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法)捷兰。
MD5算法具有以下特點:
(1)壓縮性:任意長度的數(shù)據(jù)立叛,算出的MD5值長度都是固定的负敏。
(2)容易計算:從原數(shù)據(jù)計算出MD5值很容易贡茅。
(3)抗修改性:對原數(shù)據(jù)進行任何改動,哪怕只修改1個字節(jié)其做,所得到的MD5值都有很大區(qū)別顶考。
(4)強抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的妖泄。

/**
 MD5加密(16位)
 */
+ (NSString *)MD5:(NSString *)str {
    const char *source = [str UTF8String];
    unsigned char md5[CC_MD5_DIGEST_LENGTH];
    CC_MD5(source, (uint32_t)strlen(source), md5);
    
    NSMutableString *retString = [NSMutableString stringWithCapacity:40];
    
    for (int i = 0; i < CC_MD5_DIGEST_LENGTH; ++ i) {
        NSString *strValue = [NSString stringWithFormat:@"%02X", md5[i]];
        if ([strValue length] == 0) {
            strValue = @"";
        }
        
        [retString appendString:strValue];
    }
    
    if ([retString length] == 0) {
        return @"";
    }
    
    return retString;
}

2驹沿、SHA即Secure Hash Algorithm(安全哈希算法),主要適用于數(shù)字簽名標準(Digital Signature Standard DSS)里面定義的數(shù)字簽名算法(Digital Signature Algorithm DSA)蹈胡。對于長度小于2^64位的消息渊季,SHA1會產(chǎn)生一個160位的消息摘要。

/**
 SHA1加密
 */
+ (NSString *)SHA1:(NSString *)str {
    const char *cstr = [str cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:str.length];
    
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    
    CC_SHA1(data.bytes, (uint32_t)data.length, digest);
    
    NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    
    for(int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
        [output appendFormat:@"%02x", digest[i]];
    }
    
    return output;
}

/**
 Hmac-SHA256加密算法
 */
+ (NSData *)hmacSha256:(NSString *)hashString hmacKey:(NSString *)key {
    NSData *hashData = [hashString dataUsingEncoding:NSUTF8StringEncoding];
    
    unsigned char *digest;
    digest = malloc(CC_SHA256_DIGEST_LENGTH);
    const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
    
    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), [hashData bytes], [hashData length], digest);
    
    NSData *data = [NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
    
    free(digest);
    cKey = nil;
    
    return data;
}

3罚渐、RSA即公鑰加密算法却汉,是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的荷并。1987年首次公布合砂,當時他們?nèi)硕荚诼槭±砉W院工作。RSA就是他們?nèi)诵帐祥_頭字母拼在一起組成的源织。

4翩伪、DES即Data Encryption Standard(數(shù)據(jù)加密標準),是一種使用密鑰加密的塊算法谈息。

5缘屹、AES即Advanced Encryption Standard(高級加密標準),在密碼學中又稱Rijndael加密法侠仇,是美國聯(lián)邦政府采用的一種區(qū)塊加密標準轻姿。這個標準用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。

關(guān)于RSA踢代、DES盲憎、AES代碼有點多,這里就不貼出來了胳挎。有需要的可以聯(lián)系我饼疙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市慕爬,隨后出現(xiàn)的幾起案子窑眯,更是在濱河造成了極大的恐慌,老刑警劉巖医窿,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磅甩,死亡現(xiàn)場離奇詭異,居然都是意外死亡姥卢,警方通過查閱死者的電腦和手機卷要,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來独榴,“玉大人僧叉,你說我怎么就攤上這事」桌疲” “怎么了瓶堕?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長症歇。 經(jīng)常有香客問我郎笆,道長,這世上最難降的妖魔是什么忘晤? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任宛蚓,我火速辦了婚禮,結(jié)果婚禮上德频,老公的妹妹穿的比我還像新娘苍息。我一直安慰自己,他們只是感情好壹置,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布竞思。 她就那樣靜靜地躺著,像睡著了一般钞护。 火紅的嫁衣襯著肌膚如雪盖喷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天难咕,我揣著相機與錄音课梳,去河邊找鬼距辆。 笑死,一個胖子當著我的面吹牛暮刃,可吹牛的內(nèi)容都是我干的跨算。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼椭懊,長吁一口氣:“原來是場噩夢啊……” “哼诸蚕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氧猬,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤背犯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后盅抚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漠魏,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年妄均,在試婚紗的時候發(fā)現(xiàn)自己被綠了柱锹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡丛晦,死狀恐怖奕纫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烫沙,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布隙笆,位于F島的核電站锌蓄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏撑柔。R本人自食惡果不足惜瘸爽,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铅忿。 院中可真熱鬧剪决,春花似錦、人聲如沸檀训。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峻凫。三九已至渗鬼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荧琼,已是汗流浹背譬胎。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工差牛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堰乔。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓偏化,卻偏偏與公主長得像,于是被迫代替她去往敵國和親镐侯。 傳聞我的和親對象是個殘疾皇子夹孔,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

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