iOS Base64、凱撒加密 忌傻,MD5加密(16、32位)

詳細(xì)講解幾種簡(jiǎn)單的加密镰矿,讓你知其然知其所以然俘种。

1.Base64加密解密

Base64加密本質(zhì)上只是一種編碼方式,有標(biāo)準(zhǔn)的編碼表宙刘,任何人都可以解密。通常用于隱藏明文衙猪,具體的加密方案需要另行處理。iOS 提供了Base64加密的api垫释。使用非常簡(jiǎn)單撑瞧。具體加密規(guī)則探究會(huì)在進(jìn)階部分的文章中補(bǔ)上棵譬。

1.字符串加密
  NSString *originalStr = @"qwe中國(guó)468 &^*!@";
  NSData *data = [originalStr dataUsingEncoding:NSUTF8StringEncoding];
  //加密參數(shù)的通常選0
  NSString *base64EncodeStr = [data base64EncodedStringWithOptions:0];

2.字符串解密
  NSData *dataFromBase64String = [[NSData alloc]
                                  initWithBase64EncodedString:base64EncodeStr options:0];
  NSString *base64Decoded = [[NSString alloc]
                           initWithData:dataFromBase64String encoding:NSUTF8StringEncoding];

  加密結(jié)果為:cXdl5Lit5Zu9NDY4ICZeKiFA
  解密結(jié)果為:qwe中國(guó)468 &^*!@

3.data數(shù)據(jù)加密
  UIImage *image = [UIImage imageNamed:@"XXX"];
  NSData *data = UIImageJPEGRepresentation(image, 0.5);
  //加密參數(shù)的通常選0
  NSData *base64EncodeData = [data base64EncodedDataWithOptions:0];

4.data數(shù)據(jù)解密
  NSData *base64DecodeData= [[NSData alloc]initWithBase64EncodedData:base64EncodeData options:0];

2.凱撒加密解密

凱撒加密是一種簡(jiǎn)單的文字替換加密茫船。比如所有字母都向后3位替換,a換為d,b換位e涩禀,以此類推(最后幾位是x換為a,y換為b葵腹,z換為c)〖纾考慮到加密內(nèi)容不只是英文字母阻肩。此處改進(jìn)使用ASCII碼偏移進(jìn)行加密解密带欢。

1.加密
  NSString *originalStr = @"abc簡(jiǎn)書(shū)901 ~@#¥";
  NSMutableArray *arr = [NSMutableArray array];
  for (int i=0 ;i <originalStr.length; i++)
  {
      unichar asciiCode = [originalStr characterAtIndex:i];
      //右偏移3個(gè)單位
     asciiCode += 3;
      //注意:此處必須使用%C 不能用%c烤惊,否則會(huì)有亂碼!
      NSString *encryptStr = [NSString stringWithFormat:@"%C", asciiCode];
      [arr addObject:encryptStr];
  }
  //加密結(jié)果
  NSString *encodeStr = [arr componentsJoinedByString:@""];

2.解密
  NSMutableArray *arr = [NSMutableArray array];
  for (int i=0 ;i <encodeStr.length; i++)
  {
      unichar asciiCode = [encodeStr characterAtIndex:i];
      //左偏移3個(gè)單位(和加密相反即可)
      asciiCode -= 3;
      //注意:此處必須使用%C 不能用%c渡贾,否則會(huì)有亂碼雄右!
      NSString *encryptStr = [NSString stringWithFormat:@"%C", asciiCode];
      [arr addObject:encryptStr];
  }
  //解密結(jié)果
  NSString *decodeStr = [arr componentsJoinedByString:@""];

  加密結(jié)果:def箃乩<34#?C&?
  解密結(jié)果:abc簡(jiǎn)書(shū)901 ~@#¥

3.MD5加密

MD5加密通常用于數(shù)據(jù)準(zhǔn)確性檢測(cè),保存不需解密的數(shù)據(jù)等場(chǎng)合擂仍。加密結(jié)果不可逆,并且有較高的抗碰撞特性防楷,即很難找到兩個(gè)加密結(jié)果相同的數(shù)據(jù)复局。

目前存在的MD5解密為“跑字典”窮舉解密冲簿,比如用戶密碼只有6位純數(shù)字亿昏,那么窮舉6位數(shù)字的排列組合的MD5,然后根據(jù)MD5的值去反查密碼吝沫。應(yīng)對(duì)“跑字典”的辦法為“加鹽”并多次MD5加密,如對(duì)原密碼的特定位置加入某字符串递礼,進(jìn)行多次MD5加密,中間可以多次加鹽等脊髓。

#import <CommonCrypto/CommonDigest.h>

NSString *originalStr = @"123456";
const char *original_str = [originalStr UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(original_str, (CC_LONG)strlen(original_str), result);
NSMutableString *md5EncodeStr = [NSMutableString string];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
{
    [md5EncodeStr appendFormat:@"%02X", result[i]];
}
//加密結(jié)果
NSLog(@"md5:%@",encodeStr);
輸出:md5:E10ADC3949BA59ABBE56E057F20F883E

MD5知識(shí)補(bǔ)充:
1. MD5加密結(jié)果為一個(gè)定長(zhǎng)為128bit(即128位的二進(jìn)制)的數(shù)将硝,以16進(jìn)制輸出則為32位(1個(gè)16進(jìn)制數(shù)用4bit表示即2的4次方)恭朗。
2. 計(jì)算機(jī)中最小存儲(chǔ)單位是字節(jié)屏镊,一個(gè)字節(jié)是8bit痰腮。128/8 = 16,即需要 16字節(jié)來(lái)存儲(chǔ)結(jié)果棍丐。宏CC_MD5_DIGEST_LENGTH即為16 虫腋。
3. 關(guān)于%02X。02表示不足2位前面補(bǔ)0悦冀。比如0000 0001表示1趋翻,轉(zhuǎn)16進(jìn)制后需要輸出為01盒蟆,而不能是1历等,以保證輸出結(jié)果正確讨惩。
4. 16位和32位MD5區(qū)別:16位即32位結(jié)果截取中間的16位。只是對(duì)MD5結(jié)果的一種處理方式寒屯。
5. 有些時(shí)候需要轉(zhuǎn)為小寫(xiě)寡夹,對(duì)結(jié)果調(diào)用方法lowercaseString即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末魂角,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子野揪,更是在濱河造成了極大的恐慌,老刑警劉巖斯稳,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沼溜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡通熄,警方通過(guò)查閱死者的電腦和手機(jī)找都,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)能耻,“玉大人晓猛,你說(shuō)我怎么就攤上這事〗渲埃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵磕秤,是天一觀的道長(zhǎng)市咆。 經(jīng)常有香客問(wèn)我再来,道長(zhǎng)蒙兰,這世上最難降的妖魔是什么芒篷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任梭伐,我火速辦了婚禮,結(jié)果婚禮上糊识,老公的妹妹穿的比我還像新娘。我一直安慰自己愉耙,他們只是感情好朴沿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布魏铅。 她就那樣靜靜地躺著坚芜,像睡著了一般鸿竖。 火紅的嫁衣襯著肌膚如雪缚忧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音峰弹,去河邊找鬼鞠呈。 笑死右钾,一個(gè)胖子當(dāng)著我的面吹牛舀射,可吹牛的內(nèi)容都是我干的脆烟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼框冀!你這毒婦竟也來(lái)了敏簿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎域那,沒(méi)想到半個(gè)月后猜煮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體王带,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了囱桨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗅绰。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翠语,死狀恐怖财边,靈堂內(nèi)的尸體忽然破棺而出酣难,到底是詐尸還是另有隱情鲸鹦,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站甘磨,受9級(jí)特大地震影響济舆,放射性物質(zhì)發(fā)生泄漏滋觉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一我纪、第九天 我趴在偏房一處隱蔽的房頂上張望浅悉。 院中可真熱鬧术健,春花似錦、人聲如沸比被。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)噪裕。三九已至股毫,卻和暖如春铃诬,著一層夾襖步出監(jiān)牢的瞬間苍凛,已是汗流浹背醇蝴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惭适,地道東北人腥沽。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓师溅,卻偏偏與公主長(zhǎng)得像墓臭,于是被迫代替她去往敵國(guó)和親窿锉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗡载,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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