關(guān)于加密鲫骗,首先得理解下加密的概念赐俗。
明文 :加密前的信息
密文 :加密后的信息
加密算法: 加密或解密的算法
密鑰:算法使用的鑰匙
舉例說(shuō)明
明文:123456
密文:234567
加密算法:每位加1
加密密鑰:1
本文簡(jiǎn)單介紹下經(jīng)典的哈希算法中的一種MD5加密排吴,一般使用的32位加密和16位加密泪电。兩種加密方法本質(zhì)上是沒(méi)有區(qū)別的般妙,16位加密是基于32位加密,也就是說(shuō)從32位加密后的密文中提取16位出來(lái)相速,作為密文碟渺。
了解加密算法之前,先認(rèn)識(shí)在計(jì)算機(jī)中位和字節(jié)和字的概念
1突诬、位(bit)
來(lái)自英文bit苫拍,音譯為“比特”芜繁,表示二進(jìn)制位。
位是計(jì)算機(jī)內(nèi)部數(shù)據(jù)儲(chǔ)存的最小單位绒极,11010100是一個(gè)8位二進(jìn)制數(shù)骏令。
一個(gè)二進(jìn)制位只可以表示0和1兩種狀態(tài)(21);
兩個(gè)二進(jìn)制位可以表示00垄提、01榔袋、10、11四種(22)狀態(tài)铡俐;
三位二進(jìn)制數(shù)可表示八種狀態(tài)(23)……凰兑。
2、字節(jié)(byte)
字節(jié)來(lái)自英文Byte审丘,音譯為“拜特”吏够,習(xí)慣上用大寫(xiě)的“B”表示。
字節(jié)是計(jì)算機(jī)中數(shù)據(jù)處理的基本單位滩报。
計(jì)算機(jī)中以字節(jié)為單位存儲(chǔ)和解釋信息锅知,規(guī)定一個(gè)字節(jié)由八個(gè)二進(jìn)制位構(gòu)成,即1個(gè)字節(jié)等于8個(gè)比特(1Byte=8bit)脓钾。
八位二進(jìn)制數(shù)最小為00000000售睹,最大為11111111;通常1個(gè)字節(jié)可以存入一個(gè)ASCII碼惭笑,2個(gè)字節(jié)可以存放一個(gè)漢字國(guó)標(biāo)碼侣姆。
3生真、字
計(jì)算機(jī)進(jìn)行數(shù)據(jù)處理時(shí)沉噩,一次存取、加工和傳送的數(shù)據(jù)長(zhǎng)度稱(chēng)為字(word)柱蟀。
一個(gè)字通常由一個(gè)或多個(gè)(一般是字節(jié)的整數(shù)位)字節(jié)構(gòu)成川蒙。例如286微機(jī)的字由2個(gè)字節(jié)組成,它的字長(zhǎng)為16长已;486微機(jī)的字由4個(gè)字節(jié)組成畜眨,它的字長(zhǎng)為32位機(jī)。
計(jì)算機(jī)的字長(zhǎng)決定了其CPU一次操作處理實(shí)際位數(shù)的多少术瓮,由此可見(jiàn)計(jì)算機(jī)的字長(zhǎng)越大康聂,其性能越優(yōu)越。
接下來(lái)簡(jiǎn)單看下32位的加密方法在ios中的實(shí)現(xiàn)
+ (NSString *)getMd5_32Bit_String:(NSString *)srcString isUppercase:(BOOL)isUppercase{
// 參數(shù) srcString 傳進(jìn)來(lái)的字符串
// 參數(shù) isUppercase 是否需要大小寫(xiě)
const char *cStr = [srcString UTF8String];// 先轉(zhuǎn)為UTF_8編碼的字符串
unsigned char digest[CC_MD5_DIGEST_LENGTH];//設(shè)置一個(gè)接受字符數(shù)組
CC_MD5( cStr, (int)strlen(cStr), digest );// 把str字符串轉(zhuǎn)換成為32位的16進(jìn)制數(shù)列胞四,存到了result這個(gè)空間中
NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
{
[result appendFormat:@"%02x", digest[i]];//將16字節(jié)的16進(jìn)制轉(zhuǎn)成32字節(jié)的16進(jìn)制字符串
}
// x表示十六進(jìn)制恬汁,%02X 意思是不足兩位將用0補(bǔ)齊,如果多余兩位則不影響
if (isUppercase) {
return [result uppercaseString];
}else{
return result;
}
}
關(guān)于一些重要的方法的詳解
官方的封裝好的MD5加密方法
extern unsigned char *CC_MD5(const void *data, CC_LONG len, unsigned char *md)官方封裝好的加密方法
把str字符串轉(zhuǎn)換成了32位的16進(jìn)制數(shù)列(這個(gè)過(guò)程不可逆轉(zhuǎn)) 存儲(chǔ)到了result這個(gè)空間中
關(guān)于拼接字符串的占位符使用
x表示十六進(jìn)制辜伟,%02X 意思是不足兩位將用0補(bǔ)齊氓侧,如果多余兩位則不影響
NSLog("%02X", 0x888); //888
NSLog("%02X", 0x4); //04
16位的加密方法在ios中的實(shí)現(xiàn)
+ (NSString *)getMd5_16Bit_String:(NSString *)srcString isUppercase:(BOOL)isUppercase{
//提取32位MD5散列的中間16位
NSString *md5_32Bit_String=[self getMd5_32Bit_String:srcString isUppercase:NO];
NSString *result = [[md5_32Bit_String substringToIndex:24] substringFromIndex:8];//即9~25位
if (isUppercase) {
return [result uppercaseString];
}else{
return result;
}
}
明文加密使用
NSString*test=@"123";
NSString*md5_16=[GBEncodeTool getMd5_16Bit_String:test isUppercase:YES];
NSLog(@"md5_16-->%@",md5_16);
// 打印數(shù)值: md5_16-->AC59075B964B0715
NSString*md5_32=[GBEncodeTool getMd5_32Bit_String:test isUppercase:YES];
NSLog(@"md5_32-->%@",md5_32);
// 打印數(shù)值: md5_16-->md5_32-->202CB962AC59075B964B07152D234B70