Base64编码

简单说明

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,需要解码后才能阅读。
---来自百度百科

迅雷下载的链接,地址就是加密的专用下载地址,也是用Base64加密的,过程如下:

  • 在地址前后分别添加AA和ZZ
  • 对新的字符串进行Base64编码
    Flashget与迅雷类似,只是加不同罢了,QQ旋风根本不加料,直接进行Base64编码。

使用说明
1)从iOS7.0 开始,苹果就提供了base64的编码和解码支持
2)如果是老项目,则还能看到base64编码和解码的第三方框架,如果当前不再支持iOS7.0以下版本,则建议替换。
描述
Base64可以成为密码学的基石,非常重要。

特点

  • 可以将任意的二进制数据进行Base64编码。
  • 数据加密之后,数据量会变大,变大1/3左右。
  • 编码后有个非常显著的特点,末尾有个=号。
  • 可进行反向解密
  • Base64编码具有不可读性

结果
所有的数据都能被编码为并只用65个字符就能表示的文本文件
65字符

A~Z a~z 0~9 + / =
Base64对应编码字母表

对文件进行base64编码后文件数据的变化

编码后的数据~=编码 前数据的4/3,会大1/3左右。

Base64加密原则

6bit(原8bit)一个字节,不足的位数用0补齐,两个0用一个=表示。

Base64编码原理

Base64编码的思想是:采用64个基本的ASCII码字符对数据进行重新编码。

  • 将需要编码的数据拆分成字节数组,以3个字节为一组,按顺序排列24位数据,再把这24位数据分成4组,即每组6位;
  • 再在每组的的最高位前补两个0凑足一个字节,这样就把一个3字节为一组的数据重新编码成了4个字节;
  • 当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节,这时在最后一组填充1到2个0字节,并在最后编码完成后在结尾添加1到2个=号。

对ABC进行Base64编码过程

- 首先取ABC对应的ASCII码值
A : 65、B : 66、C : 67
- 再取二进制值
A : 01000001、B : 01000010、C : 01000011
- 然后把这三个字节的二进制码接起来
010000010100001001000011
- 再以6位为单位分成4个数据块并在最高位填充两个0后形成4个字节的编码后的值
00010000、00010100、00001001、00000011
- 再把这4个字节数据转化成10进制数
16、20、19、3
- 最后根据Base64给出的64个基本字符表,查出对应的ASCII码字符
Q、U、J、D
这里的值实际就是数据在字符表中的索引。
解码过程就是把4个字节再还原成3个字节再根据不同的数据形式把字节数组重新整理成数据。

注:Base64字符表,包括大写A-Z小写a-z数字0-9+以及/

处理过程说明

a. 转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
b. 数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
c. 不断进行,直到全部输入数据转换完成。
d. 如果最后剩下两个输入数据,在编码结果后加1个“=”;
e. 如果最后剩下一个输入数据,编码结果后加2个“=”;
f. 如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
g. 编码"Man"->Base64:"TWFu"

man-base64.png

A和BC的编码过程

API

下面看一下Base64相关的API

@interface NSData (NSDataBase64Encoding)

/* Create an NSData from a Base-64 encoded NSString using the given options. By default, returns nil when the input is not recognized as valid Base-64.
*/
- (nullable instancetype)initWithBase64EncodedString:(NSString *)base64String options:(NSDataBase64DecodingOptions)options NS_AVAILABLE(10_9, 7_0);

/* Create a Base-64 encoded NSString from the receiver's contents using the given options.
*/
- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0);

/* Create an NSData from a Base-64, UTF-8 encoded NSData. By default, returns nil when the input is not recognized as valid Base-64.
*/
- (nullable instancetype)initWithBase64EncodedData:(NSData *)base64Data options:(NSDataBase64DecodingOptions)options NS_AVAILABLE(10_9, 7_0);

/* Create a Base-64, UTF-8 encoded NSData from the receiver's contents using the given options.
*/
- (NSData *)base64EncodedDataWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0);

@end

这里还有两个枚举,分别对应编码encode和解码decode的option。

1. 编码 NSDataBase64EncodingOptions
typedef NS_OPTIONS(NSUInteger, NSDataBase64EncodingOptions) {
    // Use zero or one of the following to control the maximum line length after which a line ending is inserted. No line endings are inserted by default.
    NSDataBase64Encoding64CharacterLineLength = 1UL << 0,
    NSDataBase64Encoding76CharacterLineLength = 1UL << 1,
    
    // Use zero or more of the following to specify which kind of line ending is inserted. The default line ending is CR LF.
    NSDataBase64EncodingEndLineWithCarriageReturn = 1UL << 4,
    NSDataBase64EncodingEndLineWithLineFeed = 1UL << 5,
    
} NS_ENUM_AVAILABLE(10_9, 7_0);

下面具体看一下这几个枚举的含义:

  • NSDataBase64Encoding64CharacterLineLength: 作用是将生成的Base64字符串按照64个字符长度进行等分换行。
  • NSDataBase64Encoding76CharacterLineLength:作用是将生成的Base64字符串按照76个字符长度进行等分换行。
  • NSDataBase64EncodingEndLineWithCarriageReturn:作用是将生成的Base64字符串以回车结束。
  • NSDataBase64EncodingEndLineWithLineFeed:作用是将生成的Base64字符串以换行结束
2. 解码 NSDataBase64DecodingOptions
typedef NS_OPTIONS(NSUInteger, NSDataBase64DecodingOptions) {
    // Use the following option to modify the decoding algorithm so that it ignores unknown non-Base64 bytes, including line ending characters.
    NSDataBase64DecodingIgnoreUnknownCharacters = 1UL << 0
} NS_ENUM_AVAILABLE(10_9, 7_0);

下面看一下枚举的具体含义:

  • NSDataBase64DecodingIgnoreUnknownCharacters:表示在将解码过程中忽略不能识别的字节

代码实现

 //给定一个字符串,对该字符串进行Base64编码,然后返回编码后的结果
 - (NSString *)base64EncodeString:(NSString *)string {
     //1.先把字符串转换为二进制数据
     NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

     //2.对二进制数据进行base64编码,返回编码后的字符串
     return [data base64EncodedStringWithOptions:0];
 }

 //对base64编码后的字符串进行解码
 - (NSString *)base64DecodeString:(NSString *)string {
     //1.将base64编码后的字符串『解码』为二进制数据
     NSData *data = [[NSData alloc]initWithBase64EncodedString:string options:0];

     //2.把二进制数据转换为字符串返回
     return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
 }

命令行进行Base64编码和解码

(A进行编码后是QQ==)
  编码    $ echo -n A | base64
  解码    $ echo -n QQ== |base64 -D

参考:https://www.jianshu.com/p/4f4e7288c90e

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350