本期首页 | 过往期刊 | 公司主页
BASE64编码
作者:林海波
    Base64编码是电子邮件中常用的一种加密算法,设计Base64编码的目的是把任意序列的8位字节描述为一种不易直接被人识别的形式(RFC2045:The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.) 。

    Base64算法最大特点是处理速度快,并且只看加密后的数据绝对猜不出加密前是什么。比如下面这串字符aXQncyBhIG5pY2UgZGF5,能看出加密前是什么东西吗?他的实际内容是it's a nice day

    Base64的基本算法是把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成一个8位字节的形式,也就是说转换后的字符串大约比原来长了1/3。 具体转化形式如下:

    字符串“abc”,其二进制形式为01100001 01100010 01100011,转换为4个8位字节后是00011000 00010110 00001001 00100011,四个字节对应的十进制分别是24 22 9 35,根据下面的码表可以得到编码后的字符串是“YWJj”。
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 (pad) =
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y
这样字符串“abc”经过编码后就变成了“YWJj”。

    前面说编码后的字符串大约比编码前长了1/3,之所以说“大约”,是因为如果代码量正好是3的整数倍,那么自然是多了1/3。但如果不是呢? 可能有人已经注意到,Base64码表的最后有一个(pad)=字符,这个字符就是用来处理这个问题的。

    比如字符串“ab”,二进制是01100001 01100010,转换后得到三个字节00011000 00010110 00001000,分别对应十进制的24 22 8,根据码表得到的字符串是“YWI”,字符串只有三个字节,而根据编码规则编码后的字符串长度必须是4的整数倍,为了符合编码规格就要在字符串后加上一个(pad)从而变成四个字节,因此最终得到的编码字符串应该是“YWI=”。大家可能经常看到Base64编码最后有一到两个=,正是这个原因造成的。
Copyright 1997-2017 北京春笛信息技术有限公司 地址:北京海淀区知春路23号863软件园量子银座九层