iOS 加密總結(jié)(Base64 嫂拴、DES、MD5)

開篇應(yīng)該先說明一下這是我寫的第一篇技術(shù)博客贮喧,水平高低的大家多提寶貴意見筒狠。
  最近做的一個(gè)和藍(lán)牙交互的iOS APP,其中中用到了各種各樣的加密和驗(yàn)證箱沦,包括:Base64 加解密辩恼、MD5 加密、DES 加解密谓形、AES加解密灶伊、CRC驗(yàn)證等,其中還有16進(jìn)制寒跳,ASCII碼聘萨,NSdata 等各種數(shù)據(jù)之間的轉(zhuǎn)換,而且也還用到了Socket 傳輸數(shù)據(jù)童太,涉及到的技術(shù)點(diǎn)比較多米辐,這篇文章就簡單總結(jié)一下加解密之間的問題吧。

  • Base 64 加解密
    Base 64 加解密 沒有什么好說的书释,系統(tǒng)自帶的辦法就可以解決了翘贮,或者使用 第三方GTMBase64
//Base64加密
+(NSString *)encodeBase64:(NSString *)input{
    NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    data = [GTMBase64 encodeData:data];
    NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"encodeBase64 == %@",base64String);
    return base64String;
}

//Base64編碼
+(NSString *)base64EncodeString:(NSString *)string
{
    //1.先把字符串轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    //2.對二進(jìn)制數(shù)據(jù)進(jìn)行base64編碼,返回編碼后的字符串
    //這是蘋果已經(jīng)給我們提供的方法
    NSString *str = [data base64EncodedStringWithOptions:0];
    return str;
}
//Base64解密
+(NSString *)decodeBase64:(NSString *)input{
    NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    data = [GTMBase64 decodeData:data];
    NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"decodeBase64 == %@",base64String);
    return base64String;
}

//對base64編碼后的字符串進(jìn)行解碼
+(NSString *)base64DecodeString:(NSString *)string
{
    //1.將base64編碼后的字符串『解碼』為二進(jìn)制數(shù)據(jù)
    //這是蘋果已經(jīng)給我們提供的方法
    NSData *data = [[NSData alloc]initWithBase64EncodedString:string options:0];
    //2.把二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為字符串返回
    NSString *str =  [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    return str;
}
//Base64 字符串解碼成 字符串
+(NSString *)decodeBase64ToHexString:(NSString *)input{
    //1.將base64編碼后的字符串『解碼』為二進(jìn)制數(shù)據(jù)
    //這是蘋果已經(jīng)給我們提供的方法
    NSData *myD = [[NSData alloc]initWithBase64EncodedString:input options:0];
    Byte *bytes = (Byte *)[myD bytes];
    //下面是Byte 轉(zhuǎn)換為16進(jìn)制征冷。
    NSString *hexStr=@"";
    for(int i=0;i<[myD length];i++)
    {
        NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16進(jìn)制數(shù)
        if([newHexStr length]==1)
            hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
        else
            hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
    }
    return hexStr;
    
}

要使用DES加密肴捉,首先必須要引入 <CommonCrypto/CommonCrypto.h>
我們常用的無非就是下面的這種加密方法:其中 plainText 使我們要傳的 數(shù)據(jù) Nsdata , key 是我們加密的 秘鑰,是Byte格式的脖卖。

//DES 加密
+(NSData *)encryptUseDES:(NSData *)plainText key:(Byte *)key
{
    NSData *textData = plainText;
    NSUInteger dataLength = [textData length];
    unsigned char buffer[1024];
    memset(buffer, 0, sizeof(char));
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
                                          kCCOptionECBMode,
                                          key, kCCKeySizeDES,
                                          nil,
                                          [textData bytes], dataLength,
                                          buffer, 1024,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
        return data;
    }
    return nil;
}
//DES 解密
+(NSData *)decrypUseDES:(NSData *)plainText key:(Byte *)key{
    
    NSData *cipherdata = plainText;
    unsigned char buffer[1024];
    memset(buffer, 0, sizeof(char));
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,
                                          kCCOptionECBMode,
                                          key, kCCKeySizeDES,
                                          nil,
                                          [cipherdata bytes], [cipherdata length],
                                          buffer, 1024,
                                          &numBytesDecrypted);
    if(cryptStatus == kCCSuccess)
    {
        NSData *plaindata = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
        return plaindata;
    }
    return nil;
}
  • MD5加密

MD5 (Message Digest Algorithm MD5)是一種不可逆的加密方式围俘,用于確保信息傳輸完整一致。是計(jì)算機(jī)廣泛使用的雜湊算法之一楷拳。網(wǎng)上那些可以看到的解密MD5的都是自建了一個(gè)龐大的MD5加密之后結(jié)果的數(shù)據(jù)庫绣夺,當(dāng)解密的時(shí)候去查找吏奸,而并不是真正的解密欢揖。
  MD5其實(shí)進(jìn)過算法產(chǎn)生的是固定的128bit,即128個(gè)0和1的二進(jìn)制位奋蔚,而在實(shí)際應(yīng)用開發(fā)中她混,通常是以16進(jìn)制輸出的,所以正好就是32位的16進(jìn)制泊碑,說白了也就是32個(gè)16進(jìn)制的數(shù)字坤按。

如下,是MD5的 返回Nsdata 的加密方法馒过。

//MD5加密返回Nsdata
+(NSData *)encodeMD5:(NSData *)input{
    
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(input.bytes, (CC_LONG)input.length, result);
    
    NSData *data =[[NSData alloc] initWithBytes:result length:CC_MD5_DIGEST_LENGTH];
    return data;
}

如下臭脓,生成是小寫的MD5的字符串,如果要生成大寫的腹忽,只需要把
[ret appendFormat:@"%02X",result[i]];中的 "%02X"X改成小寫的 x即可来累。

//MD5加密返回Nsstring
+(NSString *)MD5HexDigest:(NSData *)input {
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    
    CC_MD5(input.bytes, (CC_LONG)input.length, result);
    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];
    for (int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
        [ret appendFormat:@"%02X",result[i]];
    }
    return ret;
}

如上窘奏, 其中%02x是格式控制符:‘x’表示以16進(jìn)制輸出嘹锁,‘02’表示不足兩位,前面補(bǔ)0着裹;如‘f’輸出為0f,‘1f3’則輸出1f3; 其實(shí)CC_MD5_DIGEST_LENGTH 等于16面粮,也就是說我們定義了一個(gè)字符數(shù)組result但金,并且是 16位的。那為什么是[16]呢梦裂,這是因?yàn)镸D5算法最后生成的是128位,而在計(jì)算機(jī)的最小存儲(chǔ)單位為字節(jié)年柠,1個(gè)字節(jié)是8位答憔,對應(yīng)一個(gè)char類型,計(jì)算可得需要16個(gè)char虐拓。所以result是[16]。
  那么為什么輸出的格式一定是%02x呢态兴,而不是其它呢瞻润。這也是有原因的:因?yàn)榧s定MD5一般是以16進(jìn)制的格式輸出绍撞,那么其實(shí)這個(gè)問題就轉(zhuǎn)換為把128個(gè)0和1以16進(jìn)制來表示,每4位二進(jìn)制對應(yīng)一個(gè)16進(jìn)制的元素矾柜,則需要32個(gè)16進(jìn)制的元素里覆,如果元素全部為0喧枷,放到char的數(shù)組中弓坞,正常是不會(huì)輸出渡冻,如00001111帽借,以%x輸出砍艾,則是f,那么就會(huì)丟失0;但如果以%02x表示則輸出結(jié)果是0f禀综,正好是轉(zhuǎn)換的正確結(jié)果定枷。

  • 補(bǔ)充:NSdata 和 Byte 互相轉(zhuǎn)換

Nsdata ->Byte

NSData *testData = [[NSData alloc]init];
Byte *testByte = (Byte *)[testData bytes];

Byte ->NSdata

 Byte bytes[]= {0X01,0X02,0X03,0X04,0X05,0X06};
 NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];

代碼已經(jīng)上傳到GitHub:https://github.com/AmdyTeng/iOS-Encrypt
歡迎提出寶貴意見欠窒,不吝嗇的話來個(gè)Star岖妄,哈哈

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腕铸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俗冻,老刑警劉巖噪奄,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件色罚,死亡現(xiàn)場離奇詭異金抡,居然都是意外死亡梗肝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人弓颈,你說我怎么就攤上這事∠担” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵象颖,是天一觀的道長。 經(jīng)常有香客問我抄瓦,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任基跑,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘室抽。我一直安慰自己,他們只是感情好兽泄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般填抬。 火紅的嫁衣襯著肌膚如雪仆潮。 梳的紋絲不亂的頭發(fā)上鸵闪,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天继控,我揣著相機(jī)與錄音珊搀,去河邊找鬼派诬。 笑死括勺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冯挎。 我是一名探鬼主播咙鞍,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼蜡峰,長吁一口氣:“原來是場噩夢啊……” “哼油航!你這毒婦竟也來了镰踏?” 一聲冷哼從身側(cè)響起灌诅,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盯仪,沒想到半個(gè)月后耀石,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梆奈,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年总处,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荸频。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片退疫。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遭笋,死狀恐怖吵血,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侦另,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站馒吴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏齿椅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一纱耻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦镐躲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脖律。三九已至,卻和暖如春兢交,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赞别。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工曙咽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洁奈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子膘茎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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