IOS密碼學(xué)分論-base64

什么是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);

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • /**ios常見(jiàn)的幾種加密方法: 普通的加密方法是講密碼進(jìn)行加密后保存到用戶偏好設(shè)置( [NSUserDefaul...
    彬至睢陽(yáng)閱讀 3,001評(píng)論 0 7
  • 前言 最先接觸編程的知識(shí)是在大學(xué)里面,大學(xué)里面學(xué)了一些基礎(chǔ)的知識(shí),c語(yǔ)言,java語(yǔ)言,單片機(jī)的匯編語(yǔ)言等;大學(xué)畢...
    oceanfive閱讀 3,130評(píng)論 0 7
  • 嘟噥嘟噥:最近接到一個(gè)任務(wù):在客戶端動(dòng)態(tài)生成RSA密鑰對(duì),然后向服務(wù)器發(fā)送這個(gè)密鑰對(duì)中的公鑰字符串,由服務(wù)器進(jìn)行公...
    TimmyR閱讀 8,096評(píng)論 19 21
  • NSData全部API學(xué)習(xí)。 大家好,我是大鵬,在socket網(wǎng)絡(luò)編程傳輸?shù)倪^(guò)程中NSData用的地方很多,也總結(jié)...
    li大鵬閱讀 7,853評(píng)論 1 2
  • 大疆在紐約發(fā)布了第一款掌上無(wú)人機(jī): 非常酷,應(yīng)該說(shuō)是重新定義了無(wú)人機(jī)! 非常小 一個(gè)巴掌那么大,是大疆最小的無(wú)人機(jī)...
    8d3638322ea0閱讀 340評(píng)論 0 0