詳細(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
即可。