Short introduction to BASE64
BASE64算法是一个常见的加密算法,可以实现对文本的加密,据说还可以将二进制的文件转换成文本文件,通常电脑中的所有的文件都是以二进制流的形式存 储在硬盘上的,这样一来,也许所有的文件都可以转换为文本了吧:)!不管怎么说,其转换的算法都是想同的,下面以简单的ASCII文本为例,介绍一下 BASE64算法的转换过程!
我们知道通常的计算机系统当中,一个字节是由8个二进制位组成的,例如“A”的ASCII编码值是十进制数的65,转换成二进制数就是 “01000001”,而BASE64算法就是在这样的二进制的基础上进行编码的。算法首先取3个字节的数据,转换成二进制,我们就用可爱的企鹅举个例子 吧:
“TUX”
转换成二进制:
“01010100 01010101 01011000”
注意:这里每个字节间的空格实际上是不存在的
这样我们就得到了8*3=24个二进制位组成的序列,然后再将这24个位每6个分一组,分成24/6=4组:
“010101 000101 010101 011000”
将这四个分组高位补零,形成可以转换为一个字节的8位:
“00010101 00000101 00010101 00011000”
再将这四个字节转换成十进制数:
“21 5 21 24”
接下来我们要构建一个编码表:
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
用刚才我们得到的四个十进制数在表中查到相应的字符值:
“VFVY”
这样就完成了编码过程,得到了加密后的文本!
因为在编码过程中把3个8位的二进制数实际上转换成了4个6位的二进制数,而6位的二进制数只能表示0~(2^6-1)这个区间内的64个数,所以该算法被命名位BASE64算法!
可是这里就有一个问题了,如果待加密的数据的长度不是3的整数倍怎么办,我们怎么做到每次取3个数进行加密呢?
例:加密“Linux”
=>“01001100 01101001 01101110 01110101 01111000 (pad)”
用(pad)来暂时补齐3的整数倍个字节;
=>“010011 000110 100101 101110 011101 010111 1000(00) (pad)”
注意:最后两个“0”是补上的,保证每个分组6位数;
=>“00010011 00000110 00100101 00101110 00011101 00010111 00100000 (pad)”
=>“19 6 37 46 29 23 32 (pad)”
=>“TGludXg=”
这样就完成了编码!
其实“(pad)”就是个记号,用了几个“(pad)”,就在末尾补几个“=”!因此很多编码后得到的字符串都是以一个或两个“=”结尾的,这也是可以识别BASE64编码的一个重要的特点!
我们知道通常的计算机系统当中,一个字节是由8个二进制位组成的,例如“A”的ASCII编码值是十进制数的65,转换成二进制数就是 “01000001”,而BASE64算法就是在这样的二进制的基础上进行编码的。算法首先取3个字节的数据,转换成二进制,我们就用可爱的企鹅举个例子 吧:
“TUX”
转换成二进制:
“01010100 01010101 01011000”
注意:这里每个字节间的空格实际上是不存在的
这样我们就得到了8*3=24个二进制位组成的序列,然后再将这24个位每6个分一组,分成24/6=4组:
“010101 000101 010101 011000”
将这四个分组高位补零,形成可以转换为一个字节的8位:
“00010101 00000101 00010101 00011000”
再将这四个字节转换成十进制数:
“21 5 21 24”
接下来我们要构建一个编码表:
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
用刚才我们得到的四个十进制数在表中查到相应的字符值:
“VFVY”
这样就完成了编码过程,得到了加密后的文本!
因为在编码过程中把3个8位的二进制数实际上转换成了4个6位的二进制数,而6位的二进制数只能表示0~(2^6-1)这个区间内的64个数,所以该算法被命名位BASE64算法!
可是这里就有一个问题了,如果待加密的数据的长度不是3的整数倍怎么办,我们怎么做到每次取3个数进行加密呢?
例:加密“Linux”
=>“01001100 01101001 01101110 01110101 01111000 (pad)”
用(pad)来暂时补齐3的整数倍个字节;
=>“010011 000110 100101 101110 011101 010111 1000(00) (pad)”
注意:最后两个“0”是补上的,保证每个分组6位数;
=>“00010011 00000110 00100101 00101110 00011101 00010111 00100000 (pad)”
=>“19 6 37 46 29 23 32 (pad)”
=>“TGludXg=”
这样就完成了编码!
其实“(pad)”就是个记号,用了几个“(pad)”,就在末尾补几个“=”!因此很多编码后得到的字符串都是以一个或两个“=”结尾的,这也是可以识别BASE64编码的一个重要的特点!
评论
发表评论