什么是base64?
base64是一種用64個(gè)字符串來(lái)表示任意二進(jìn)制數(shù)據(jù)的方法。這是一種可逆的編碼方式
base64的原理:
編碼后的數(shù)據(jù)是一個(gè)字符串,其中包含的字符為:A-Z、a-z、0-9、+、/共64個(gè)字符:26 + 26 + 10 + 1 + 1 = 64。【注:其實(shí)是65個(gè)字符,“=”是填充字符】。64個(gè)字符需要6位來(lái)表示,表示成數(shù)值為0~63。
這樣,長(zhǎng)度為3個(gè)字節(jié)的數(shù)據(jù)經(jīng)過(guò)Base64編碼后就變?yōu)?個(gè)字節(jié)。
例:字符串“Xue”經(jīng)過(guò)Base64編碼后變?yōu)椤癢HVl”。
長(zhǎng)度為3個(gè)字節(jié)的數(shù)據(jù)位數(shù)是8*3=24,可以精確地分成6*4。如果數(shù)據(jù)的字節(jié)數(shù)不是3的倍數(shù),則其位數(shù)就不是6的倍數(shù),那么需要就不能精確地劃分成6位的塊。,此時(shí),需在原數(shù)據(jù)后面添加1個(gè)或2個(gè)零值字節(jié),使其字節(jié)數(shù)是3的倍數(shù)。然后,在編碼后的字符串后面添加1個(gè)或2個(gè)等號(hào)“=”,表示所添加的零值字節(jié)數(shù)。
例:字符串“Xu”經(jīng)過(guò)Base64編碼后變?yōu)椤癢HU=”。
字符串“X”經(jīng)過(guò)Base64編碼后變?yōu)椤癢A==”。
應(yīng)用:
需要明文保存二進(jìn)制數(shù)據(jù)時(shí),可以將不可打印的二進(jìn)制數(shù)據(jù)經(jīng)過(guò)Base64編碼轉(zhuǎn)成可打印的字符串。
Mozilla Thunderbird和Evolution用Base64來(lái)保密電子郵件密碼
Base64也會(huì)經(jīng)常用作一個(gè)簡(jiǎn)單的“加密”來(lái)保護(hù)某些數(shù)據(jù),而真正的加密通常都比較繁瑣。
垃圾訊息傳播者用Base64來(lái)避過(guò)反垃圾郵件工具,因?yàn)槟切┕ぞ咄ǔ6疾粫?huì)翻譯Base64的訊息。
在LDIF檔案,Base64用作編碼字串。
iOS中使用base64編碼的案例:
對(duì)文件進(jìn)行加密
// 加密文件
-(void)base64FileEncryption
{
? ?// 加密文件
? ?// 1.得到需要加密文件的二進(jìn)制數(shù)據(jù)
? ?NSString *path = @"/Users/apple/Desktop/xuexiwenjian.jpg";
? ?NSData *data = [NSData dataWithContentsOfFile:path];
? ?// base64加密并保存
? ?NSData *base64Data = [data base64EncodedDataWithOptions:0];
? ?[base64Data ?writeToFile:@"/Users/apple/Desktop/好好學(xué)習(xí)" atomically:YES];
}
對(duì)文件進(jìn)行解密
- (void)base64FileDecryption
{
? ?// 解密 base64 加密之后的文件
? ?NSString *path = @"/Users/apple/Desktop/好好學(xué)習(xí)";
?? NSData *base64Data = [NSData dataWithContentsOfFile:path];
? ?// 解密
? ?NSData *data = [[NSData alloc] initWithBase64EncodedData:base64Data options:0];
? ?[data writeToFile:@"/Users/apple/Desktop/私密文件" atomically:YES];
}
對(duì)字符串進(jìn)行加密
// 對(duì)字符串加密與解密 (base64)
-(void)base64StringEncryption
{
? ?// base64 加密! 將二進(jìn)制數(shù)據(jù)進(jìn)行加密!
? ?NSString *password = @"hello base64";
? ?NSLog(@"password: %@",password);
? ?// 1.將字符串轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)!
? ?NSData *data = [password dataUsingEncoding:NSUTF8StringEncoding];
? ?NSLog(@"data: %@",data);
? ?// 2.對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行base64加密
? ?// 1> 可以直接加密出 base64的二進(jìn)制數(shù)據(jù)
? ?// 2> 可以直接加密出 base64的字符串!
? ?NSData *base64Data = [data base64EncodedDataWithOptions:0];
? ?NSLog(@"base64Data: %@",base64Data);
? ?NSString *base64String = [data base64EncodedStringWithOptions:0];
? ?NSLog(@"base64String: %@",base64String);
}
對(duì)字符串進(jìn)行解密
-(void)base64StringDecryption{
? ?// 1.將base64加密之后的數(shù)據(jù)轉(zhuǎn)換成普通的二進(jìn)制數(shù)據(jù)!
? ?NSData *data1 = [[NSData alloc] initWithBase64EncodedData:base64Data options:0];
? ?NSLog(@"data1: %@",data1);
? ?NSString *password1 = [[NSString alloc] initWithData:data1 encoding:NSUTF8StringEncoding];
? ?NSLog(@"password1: %@",password1);
? ?NSData *data2 = [[NSData alloc] initWithBase64EncodedString:base64String options:0];
? ?NSLog(@"data2: %@",data2);
? ?NSString *password2 = [[NSString alloc] initWithData:data2 encoding:NSUTF8StringEncoding];
? ?NSLog(@"password2: %@",password2);
}