原文地址:http://www.iamstudy.cn/index.php/2015/05/02/505.html
1、base64:
它是用包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符来表示所有的ascii字符。
原理: 3个字符为一组(三组),将字符ascii编码以二进制表示出来(就有24比特),由于2的6次方等于64,所以每6个比特又重新为一个组(这时候为四组),然后将每一组又转化为10进制,然后根据索引表,实现了编码。
具体详情可见:http://zh.wikipedia.org/wiki/Base64
copy维基百科上面的一个例子:
举例来说,一段引用自托马斯·霍布斯《利维坦》的文句:
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”
文本 | M | a | n | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII编码 | 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 | ||||||||||||||||||||
Base64编码 | T | W | F | u |
在此例中,Base64算法将三个字符编码为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整除的字符个数,当个数不能被3整除又该如何。
多出1个或2个字节,先在二进制那使用0字节值在末尾补足,使其能够被3整除,然后再进行base64的编码。在编码后的base64文本后加上一个或两个’=’号,代表补足的字节数。
文本(1 Byte) | A | |||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
二进制位 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | ||||||||||||||||
二进制位(补0) | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | ||||||||||||
Base64编码 | Q | Q | ||||||||||||||||||||||
文本(2 Byte) | B | C | ||||||||||||||||||||||
二进制位 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | x | x | x | x | x | x | ||
二进制位(补0) | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | x | x | x | x | x | x |
Base64编码 | Q | k | M |
所以大写的A的base64密文是 QQ==
2、base32/base16
当密文编码包含了很多混淆的字符,例如“1”、“I”和“l”,“0”和“O”或者“2”和“Z”,这样的…然后就出来了base32(这段是在 http://blog.csdn.net/mittermeyer/article/details/96950 看到的…)
base32
在base64中,64个字符用6个bit位就可以全部表示,一个字节有8个bit 位,剩下两个bit就浪费掉了,这样就不得不牺牲一部分空间了。这里需要弄明白的就是一个Base64字符是8个bit,但是有效部分只有右边的6个 bit,左边两个永远是0(引用于:http://www.cnblogs.com/chengxiaohui/articles/3951129.html)
因此可以理解到,base32中就是用5个bit位表示8bit位的256个ascii字符。取其中的最小公约数,则8个base32字符表示出5个ascii字符
前面的base64是4个base64字符可以表示出3个ascii字符
下面为base32的表(from:http://en.wikipedia.org/wiki/Base32 )
Value | Symbol | Value | Symbol | Value | Symbol | Value | Symbol | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | A | 9 | J | 18 | S | 27 | 3 | |||
1 | B | 10 | K | 19 | T | 28 | 4 | |||
2 | C | 11 | L | 20 | U | 29 | 5 | |||
3 | D | 12 | M | 21 | V | 30 | 6 | |||
4 | E | 13 | N | 22 | W | 31 | 7 | |||
5 | F | 14 | O | 23 | X | |||||
6 | G | 15 | P | 24 | Y | |||||
7 | H | 16 | Q | 25 | Z | |||||
8 | I | 17 | R | 26 | 2 | pad | = |
base16也差不多, 4个base16字符表示出1个ascii字符。
3、base36
找资料搜到的,没认真看,应该原理差不多….
http://en.wikipedia.org/wiki/Base36
4、base解码
base64也可以加密一张图片,将图片的二进制转化为base64就ok。
在线base64转图片工具: http://www.iamstudy.cn/tools/base64Toimage.php
python标准模块里面base64,详情见
https://docs.python.org/2/library/base64.html