Base64 其实不能算是真正加密解密的安全算法,因为这个东西大家都知道怎么解密,就没有意思了。不过登陆邮件服务器的时候,登陆密码要使用BASE64 加密,因此我将算法描述如下:
在这个表中0x1a,对应的是:'a'。
Base64 核心算法:
明文: hello
对应的Ascii: 0x68, 0x65, 0x6c, 0x6c, 0x6f
二进制: 01101000 01100101 011001101 011001101 01101111
将明文按照每三个字节,变成4个字节的原则进行变化,首先将二进制中每次拿出6个bit 形成一个密码表索引,通过这个索引转到密文。
例如上面的:
二进制: 01101000 01100101 011001101 011001101 01101111
6bit 变化: 011010 000110 010101 1001101 0110011 010110 111100(后面不足的上两个0)
十六进制: 0x1a, 0x06, 0x15, 0x4d, 0x33, 0x16, 0x3c
那么在这个十六进制作为索引在下面的加密表中查处对应的密文,
- const unsigned char C_Base64::CodeTable[] =
- {
- 'A', 'B', 'C',
- 'D', 'E', 'F',
- 'G', 'H', 'I',
- 'J', 'K', 'L',
- 'M', 'N', 'O',
- 'P', 'Q', 'R',
- 'S', 'T', 'U',
- 'V', 'W', 'X',
- 'Y', 'Z', 'a',
- 'b', 'c', 'd',
- 'e', 'f', 'g',
- 'h', 'i', 'j',
- 'k', 'l', 'm',
- 'n', 'o', 'p',
- 'q', 'r', 's',
- 't', 'u', 'v',
- 'w', 'x', 'y',
- 'z', '0', '1',
- '2', '3', '4',
- '5', '6', '7',
- '8', '9', '+',
- '/'
- };
一次查出为aGVsbG8,很明显不够4的整数倍,那么再补一个特殊字符"=",因此密文:
aGVsbG8=
就是说在不够的情况下,可能要补一个或者二个特殊的字符"=",凑够4的整数倍。
因此C++的实现源码如下: