一段明文经过Base64加密后变得面目全非,又经过解密后恢复明文本来的面目,很有加密与解密算法的特征。Base64不过并不是加密算法,仅仅是比较靠近加密算法。
Base64算法的由来
Base64算法主要最早用于解决电子邮件传输问题。在早期,由于历史问题,电子邮件只允许传输ASCII码字符。当传输非ASCII码时,网关很可能将非ASCII码的二进制位调整,即将非ASCII码的8位二进制的最高位置0。当用户收到邮件时,可想而知,收到的就是 一份乱码的邮件。基于这个原因产生了Base64算法。
Base64算法的定义
Base64是一种基于64个字符的编码算法,按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)。Base64编码的思想是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个"="。
从以上编码规则可以得知,通过Base64编码,原来的3个字节编码后将成为4个字节,即字节增加了33.3%。编码后数据会比原来的数据略长,为原来的4/3倍。
在RFC2045文件中给出的字符映射表:
在这张映射表中,索引值为十进制,对应字符一共64个,这就是Base64名字的由来。映射表最后一个“=”等号字符是用来补位。
Base64算法实现原理
Base64算法主要是对给定的字符以与字符编码(如ASCII字符,UTF-8码)对应的十进制数为基准,做编码操作:
将给定的字符串以字符为单位转换为对应的字符编码(如ASCII码)。将获得的字符编码转换为二进制码。对获得的二进制码做分组转换操作,每3个8位二进制码为一组,转换为每4个6位二进制码为一组(不足6位时低位补0)。这是一个分组变化的过程,3个8位二进制码和4个6位二进制码的长度都是24位(3*8=4*6)。对获得的4个6位二进制码补位,向6位二进制码添加2位高位0,组成4个8位二进制码。将获得的4个8位二进制转换为十进制码。将获得的十进制码转换为Base64字符表中对应的字符。
ASCII码字符编码
字符串“A”进行Base64编码,如下所示:
字符 AASCll 65 二进制码 01000001 4-6二进制码 010000 010000
4-8二进制码 00010000 00010000
十进制码 16 16
字符表映射码 Q Q = =
字符串“A”经过Base64编码后得到了“QQ==”这样一个字符串。经过Base64编码后的字符串未尾带着2个等号。原因是原文的二进制码长度不足24位,最终转换为十进制时也不足4项,这时就需要用等号补位。经过Base64编码后的字符串最多只会有2个等号:余数 = 原文字节数 % 3