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)書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)書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é)來存儲(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)為小寫,對(duì)結(jié)果調(diào)用方法lowercaseString即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容