關(guān)于加密,首先得理解下加密的概念。
明文 :加密前的信息
密文 :加密后的信息
加密算法: 加密或解密的算法
密鑰:算法使用的鑰匙
舉例說明
明文:123456
密文:234567
加密算法:每位加1
加密密鑰:1
本文簡單介紹下經(jīng)典的哈希算法中的一種MD5加密,一般使用的32位加密和16位加密。兩種加密方法本質(zhì)上是沒有區(qū)別的,16位加密是基于32位加密,也就是說從32位加密后的密文中提取16位出來,作為密文。
了解加密算法之前,先認識在計算機中位和字節(jié)和字的概念
1、位(bit)
來自英文bit,音譯為“比特”,表示二進制位。
位是計算機內(nèi)部數(shù)據(jù)儲存的最小單位,11010100是一個8位二進制數(shù)。
一個二進制位只可以表示0和1兩種狀態(tài)(21);
兩個二進制位可以表示00、01、10、11四種(22)狀態(tài);
三位二進制數(shù)可表示八種狀態(tài)(23)……。
2、字節(jié)(byte)
字節(jié)來自英文Byte,音譯為“拜特”,習(xí)慣上用大寫的“B”表示。
字節(jié)是計算機中數(shù)據(jù)處理的基本單位。
計算機中以字節(jié)為單位存儲和解釋信息,規(guī)定一個字節(jié)由八個二進制位構(gòu)成,即1個字節(jié)等于8個比特(1Byte=8bit)。
八位二進制數(shù)最小為00000000,最大為11111111;通常1個字節(jié)可以存入一個ASCII碼,2個字節(jié)可以存放一個漢字國標碼。
3、字
計算機進行數(shù)據(jù)處理時,一次存取、加工和傳送的數(shù)據(jù)長度稱為字(word)。
一個字通常由一個或多個(一般是字節(jié)的整數(shù)位)字節(jié)構(gòu)成。例如286微機的字由2個字節(jié)組成,它的字長為16;486微機的字由4個字節(jié)組成,它的字長為32位機。
計算機的字長決定了其CPU一次操作處理實際位數(shù)的多少,由此可見計算機的字長越大,其性能越優(yōu)越。
接下來簡單看下32位的加密方法在ios中的實現(xiàn)
+ (NSString *)getMd5_32Bit_String:(NSString *)srcString isUppercase:(BOOL)isUppercase{
// 參數(shù) srcString 傳進來的字符串
// 參數(shù) isUppercase 是否需要大小寫
const char *cStr = [srcString UTF8String];// 先轉(zhuǎn)為UTF_8編碼的字符串
unsigned char digest[CC_MD5_DIGEST_LENGTH];//設(shè)置一個接受字符數(shù)組
CC_MD5( cStr, (int)strlen(cStr), digest );// 把str字符串轉(zhuǎn)換成為32位的16進制數(shù)列,存到了result這個空間中
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進制轉(zhuǎn)成32字節(jié)的16進制字符串
}
// x表示十六進制,%02X 意思是不足兩位將用0補齊,如果多余兩位則不影響
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進制數(shù)列(這個過程不可逆轉(zhuǎn)) 存儲到了result這個空間中
關(guān)于拼接字符串的占位符使用
x表示十六進制,%02X 意思是不足兩位將用0補齊,如果多余兩位則不影響
NSLog("%02X", 0x888); //888
NSLog("%02X", 0x4); //04
16位的加密方法在ios中的實現(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