按照二进制学习的路线,了解二进制程序常用的加密方式以及对应的汇编、伪代码特征是很必要的。我在CSDN上看了很多篇方法都不一样,而且很冗长,于是打算自己用C实现一下。
0x00 base64的原理
编码方式
计算机储存数据以字节为单位,一个位有八个字节,比如“abc”字符串,这是底层的数据结构
a b c
01100001 01100010 01100011
三个字符对应3×8=24个位,同时24可以看成6×4的积,故把三个字节组合后,以六个字节为一组分割可以分割出4组,但是为了符合计算机的储存结构,每组空出来的两个高位要补上0。
00011000 00010110 00001001 00100011
同时,新的四个字节每个可以表示一个整数,如果将这些整数映射到一张特定的码表上,便会得到一个新的字符串。例如这是标准base64的码表:
由于base64有效位只有6位,意味着最大可以表示64个元素,故码表为0至63
那么刚刚新的四个字节就被表示成了:
Y(24) W(22) J(9) Z(25)
于是一串base64码就出来了:abc->YWJj
假如加密内容长度不是3的倍数怎么办?
我们可以通过补全字节的方法用0补全字节数到3的倍数,然后在base64码后用‘=’表明补全字节的数量。例如“abcd”字符串:
a b c d
01100001 01100010 01100011 01100100
00011000(Y) 00010110(W) 00001001(J) 00100011(j) 00011001(Z) 00000000(A) 00000000(A) 00000000(A)
//最后两个A要替换为=,因为转换后具有有效信息的只是前6个字节
得到base64码YWJjZA==
代码实现
利用3变4,不够3补为3的逻辑,我们可以利用C语言以三个字节为一组利用位运算符进行base64转换(个人认为三个字节一组循环处理是最高效的)
这是编码部分的C程序,标明了一些细节:
void base64_encode(char *src,char *result){