Base64编码原理及做用

Base64编码的做用:因为某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。它使用下面表中所使用的字符与编码。

并且base64特别适合在http,mime协议下快速传输数据。

base64其实不是安全领域下的加密解密算法。虽然有时候常常看到所谓的base64加密解密。其实base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码事后原文也变成不能看到的字符格式,可是这种方式很初级,很简单。

 Base64编码方法要求把每三个8Bit的字节转换为四个6Bit的字节,其中,转换以后的这四个字节中每6个有效bit为是有效数据,空余的那两个 bit用0补上成为一个字节。所以Base64所形成数据冗余不是很严重,Base64是当今比较流行的编码方法,由于它编起来速度快并且简单

 举个例子,有三个字节的原始数据:aaaaaabb bbbbccccc ccdddddd(这里每一个字母表示一个bit位)算法

  那么编码以后会变成:      00aaaaaa 00bbbbbb 00cccccc 00dddddd

因此能够看出base64编码简单,虽然编码后不是明文,看不出原文,可是解码也很简单
 

各位看官应该都是资深的网虫了,小弟斗胆在此问问你们,平时上网时,除了泡MM、到论坛灌水、扔版砖……以外,进行的最多的是什么活动?对了,你必定会说:是收发电子邮件!(谁敢说本身没收/发过电子邮件的?拉出去枪毙了!!) 
收 /发E-mail的时候有一个安全性的问题--假想一下,你花了一成天时间给系花写的情书,在发送的过程当中被隔壁宿舍张三那小子截获了(难道他是黑 客??),更糟的是他是你的情敌啊……天,后果不堪设想!!所以,咱们必须有一种比较可靠的加密方法,可以对电子邮件的明文进行转换,至少要得出一个没法 被别人一眼就看出内容来的东西,并且编码/解码的速度还要足够快。(这时你能够再假想一下啦,张三那家伙截获了你的肉麻情书,但是他一看:“咦?怎么乱七 八糟的?垃圾邮件!!”--这样一来你不就逃过大难了?!)编程

Base64就是在这种背景下产生的加密方法。它的特色是:一、速度很是快。二、可以将字符串A转换成字符串B,并且若是你光看字符串B,是绝对猜不出字符串A的内容来的。不信吗?让咱们来看看下面这串东西:安全

xOO6w6Osu7bTrbniwdnAz8LetcTnzbfXzOy12KOh网络

呵呵,是什么啊?猜出来了吗?其实它就是下面这段文字通过Base64编码产生的东东:编码

你好,欢迎光临老罗的缤纷天地!加密

介绍说完啦,让咱们开始探讨实质性的东西。spa

Base64是网络上最多见的用于传输8Bit字节代码的编码方式之一,你们能够查看RFC2045~RFC2049,上面有MIME的详细规范。字符串

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),而后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。it

这样说会不会太抽象了?不怕,咱们来看一个例子:base64

转换前 aaaaaabb ccccdddd eeffffff 
转换后 00aaaaaa 00bbcccc 00ddddee 00ffffff

应该很清楚了吧?上面的三个字节是原文,下面的四个字节是转换后的Base64编码,其前两位均为0。

转换后,咱们用一个码表来获得咱们想要的字符串(也就是最终的Base64编码),这个表是这样的:(摘自RFC2045)


Table 1: The Base64 Alphabet

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


让咱们再来看一个实际的例子,加深印象!

转换前 10101101 10111010 01110110 
转换后 00101011 00011011 00101001 00110110 
十进制 43 27 42 54 
对应码表中的值 r b q 2


因此上面的24位编码,编码后的Base64值为 rbq2 
解码同理,把 rbq2 的二进制位链接上再重组获得三个8位值,得出原码。 
(解码只是编码的逆过程,在此我就很少说了,另外有关MIME的RFC仍是有不少的,若是须要详细状况请自行查找。)

用更接近于编程的思惟来讲,编码的过程是这样的:

第一个字符经过右移2位得到第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符。 
而后将第一个字符左移6位加上第二个字符右移4位,即得到第二个目标字符。 
再将第二个字符左移4位加上第三个字符右移6位,得到第三个目标字符。 
最后取第三个字符的右6位即得到第四个目标字符.

So easy! That’s all!!!

但是等等……聪明的你可能会问到,原文的字节数量应该是3的倍数啊,若是这个条件不能知足的话,那该怎么办呢?

咱们的解决办法是这样的:原文的字节不够的地方能够用全0来补足,转换时Base64编码用=号来代替。这就是为何有些Base64编码会以一个或两个等号结束的缘由,但等号最多只有两个。由于:

余数 = 原文字节数 MOD 3

因此余数任何状况下都只多是0,1,2这三个数中的一个。若是余数是0的话,就表示原文字节数正好是3的倍数(最理想的状况啦)。若是是1的话,为了让Base64编码是4的倍数,就要补2个等号;同理,若是是2的话,就要补1个等号。

讲到这里,大伙儿应该全明白了吧?若是还有不清楚的话就返回去再仔细看看,其实不难理解的。

相关文章
相关标签/搜索