ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

base64编码与一般的ASCII码和二进制编码有什么不同?base64详解

2022-07-03 21:32:15  阅读:265  来源: 互联网

标签:编码 Base64 计算机 字符 base64 16 ASCII


在密码学实践中,经常会用到Base64编码。比如大名鼎鼎的密码学挑战题“Matasano Crypto Challenges”的第一集合的第一题,就是要求把一个Hex编码的字符串转化为Base64编码的(Convert hex to base64),转化前和转化后的结果差不多是这个样子:

转化前:49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d

转化后:SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t

那么,Base64又是什么呢?和我们听说过的Hex编码,ASCII编码,UTF-8编码什么的,有什么关系吗?我尽量用简单的语言来讲讲故事。

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于{\displaystyle 2^{6}=64}base64编码与一般的ASCII码和二进制编码有什么不同?base64详解,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母 A-Za-z数字 0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后BinHex的版本使用不同的64字符集来代表6个二进制数字,但是不被称为Base64。

==============================
1 计算机开始之初,二进制与Hex

计算机这个东西,最初是美国人发明的。作为一个可以计算、存储、通信的复杂玩意,最最基本的功能,应该是能读懂人类让它干的事情。所以呢,我们得构造一个计算机能用的语言,这个语言计算机能看懂,人也能看懂,这样才能交流嘛。

计算机所用的语言是什么呢?这个语言非常简单,只有0和1两种表示。0代表否,1代表是。通过0和1的各种组合,以及0和1之间的各种运算(位运算),计算机就能进行理解、分析这个世界,并帮助人类完成工作了。

但是0和1太简单了,简单到任何一个简单的数字都可能用一长串0和1来表示。举了例子,如果让计算机记住1000这个数,计算机就要记住11,1110,1000这么长一串数字。计算机倒是好记,但是人类记不住啊… 有没有一种方法,能够让计算机表示的数据短一点,好记一点呢?

Hex就是最简单的方法了。人类习惯于使用十进制,毕竟人类有是个手指,十个一进位,挺好的!计算机本质上是二进制,就0和1两种数字的表示方法,所有其他可以直接转换的表示方法中,进制只能有2这个数,不能有其他的数字。比如4,8,16就没问题。其他的数字,不管怎么折腾,转换后也得是2^n形式。

想让人类和计算机都能接受表示形式,8进制和16进制都是可以接受的。8进制的话,只使用0-7折8个数字就好了。16进制,光用数字是不够了,还得用用其他的字符。然而,计算机毕竟是美国人发明的,他们觉得,干脆,就16进制:用0-9表示前10个数,后面的用A、B、C、D、E、F表示,不区分大小写。这就是最简单的Hex编码了。

Hex的编码原理是:把一长串二进制数每4个分一组,如果位数不够就在高位补0。4位数字一共只有16种情况,分别用0-9,A-F表示这16种情况。编码表类似这样:
image

==============================
2 要让可读性更强:ASCII
Hex编码虽然好,但有个问题:从计算机上打开个文件,满眼的十六进制数,很头大啊… 十六进制还是不太好表示文本。能不能创建一种方法,能表示键盘打出来的全部英文字符、符号呢?键盘打不出来的字符,比如什么回车啦,占位啦,用特殊的符号表示。这样一来,打开一个文件,满眼英文,岂不是很爽快…美国作为计算机的始祖国家,自然要推出一个这样的标准代码表。这就是美国信息交换标准代码,简称ASCII码表。这个码表包括了数字、英文大小写、符号、以及各种各样的转义字符,可以包含英文所用的全部功能。很快地,ASCII码称为了国际标准,现在大家知道的编码形式,都是与ASCII码兼容的。(图片来自:美国信息交换标准代码

image

==============================
3 别的语言怎么办?UTF-8等其他编码方法这个码表一出来,英语国家开心了…其他国家的脑袋疼了… 带注音的符号怎么办?日语韩语怎么办?最为博大精深的中文怎么办… 于是,各个国家也推出了本国语言的编码表。但是,为了能在计算机系统中通用,这些编码表基本都与ASCII码兼容。

最为知名的就是UTF-8了。这个编码又称为万国码,顾名思义,就是支持包括中文简体、中文繁体、日语、韩语等各种语言的编码。这玩意太复杂了… 我就不细说了。

==============================
4 用一种编码形式打开另一种编码形式 会怎样?

既然每个国家都有自己的编码表了,问题也就来了。现在都国际化了,我要用一个支持本国语言的编码系统,打开另一个编码系统编码的文本,会出现什么情况呢?这就是乱码了… 更为严重的是,随着互联网的出现,各个国家的电脑都需要通信,而通信的一种方式就是使用URL地址。每个国家都希望把这个地址写成自己国家的语言。但这会导致其他国家根本没法访问地址,因为打不出这个字符嘛。所以,人类迫切需要一种中间编码形式,既能够兼容ASCII码,又能够把任意一种编码形式转换成只使用可读字符就能表示的编码。其中一种编码形式,就是Base64编码。

Base64编码,顾名思义,用64个可读字符进行编码。与Hex的16个字符相比多了很多,但是比ASCII码又少了一倍,去除了不可读字符。标准Base64编码中,这些字符是:

  • 数字:0,1,2,3,4,5,6,7,8,9,共10个

  • 小写字母:a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,共26个

  • 大写字母:A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,共26个

  • 加好+以及斜杠/

有的时候,根据不同的需要,Base64还有很多变种。比如,如果浏览器地址中用“+”和“/”的话,浏览器会将其转换为%XX的形式,又多了一步。因此可以将“+”和“/”换成“-”和“_”。

这种编码形式长度也短,效率也高。这样一来,数据通信的时候,不管来的是什么语言,都转化成Base64后再发送和接收。要是别国地址什么的打不出来,就直接打Base64编码形式就好了。如果细心的话,会发现百度云盘共享的时候,用的就是Base64。举个例子,前几天有个朋友给我发送一个视频,给的链接是这样的(后面四位略去):

http://pan.baidu.com/s/1gdH**** 

前面都是标准的网页形式,最后那个子文件,就是用Base64编码的,而且可以在任何通信工具中传递,方便快捷啊。

==============================
5 误区:Base64不是加密算法

很多博客什么的都把Base64当做加密算法,这是不对的。Base64不具有可读性,但不代表这个编码是加密的。加密需要保证,没有密钥的人无法解密信息,无法从密文中获得任何明文信息。Base64编码显然没有密钥什么事… 所以,这个误区大家要纠正过来。

举例来说,一段引用自托马斯·霍布斯利维坦》的文句:

Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
经过Base64编码之后变成:
TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=

  • 编码“Man”
文本 ASCII编码 二进制位 索引 Base64编码
M a n 77 97
110 0 1 0 0
1 1 0 1 0
1 1 0 0 0
0 1 0 1 1
0 1 1 1 0
19 22 5 46 T
W F u

在此例中,Base64算法将3个字节编码为4个字符。

Base64索引表:

数值 字符 数值 字符 数值 字符 数值 字符
0 A 16 Q 32
g 48 w 1 B 17 R 33
h 49 x 2 C 18 S 34
i 50 y 3 D 19 T 35
j 51 z 4 E 20 U 36
k 52 0 5 F 21 V 37
l 53 1 6 G 22 W 38
m 54 2 7 H 23 X 39
n 55 3 8 I 24 Y 40
o 56 4 9 J 25 Z 41
p 57 5 10 K 26 a 42
q 58 6 11 L 27 b 43
r 59 7 12 M 28 c 44
s 60 8 13 N 29 d 45
t 61 9 14 O 30 e 46
u 62 + 15 P 31 f 47
v 63 /

如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行Base64的编码。在编码后的Base64文本后加上一个或两个 = 号,代表补足的字节数。也就是说,当最后剩余两个八位字节(2个byte)时,最后一个6位的Base64字节块有四位是0值,最后附加上两个等号;如果最后剩余一个八位字节(1个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。 参考下表:

文本(1 Byte) 二进制位 二进制位(补0) Base64编码 文本(2 Byte) 二进制位 二进制位(补0) Base64编码
A 0 1 0 0 0
0 0 1 0** 0** 0** 0** 0**
0** 0** 0** 0** 0** 0** 0** 0**
0** 0** 0** 0 1 0 0 0
0 0 1 0 0 0 0 0**
0** 0** 0** 0** 0** 0** 0** 0**
0** 0** 0** Q Q =** =** B
C 0 1 0 0 0 0
1 0 0 1 0 0 0 0
1 1 0** 0** 0 0 0 0
0 0 0 1 0 0 0 0
1 0 0 1 0 0 0 0
1 1 0 0 0 0 0 0
0 0 Q k M =

原地址:http://zpycloud.com/archives/686

标签:编码,Base64,计算机,字符,base64,16,ASCII
来源: https://www.cnblogs.com/duyuanshang/p/16440973.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有