【辅助工具】动手制作base64加密解密全自动py脚本
1. 首先是为了学习base64才写的这个脚本,另外也为了以后使用方便,不当之处还望批评指正。
首先说一下base64的原理(以T34f*和我是HuMa→年龄是24@为例):
① 先将原始数据按8位转为二进制数并合并为一行(注意,这里要先转UTF-8,因为要考虑到中文):
T34f*:0101010000110011001101000110011000101010
我是HuMa→年龄是24@:11100110100010001001000111100110100110001010111101001000011101010100110101100001111000101000011010010010111001011011100110110100111010011011111010000100111001101001100010101111001100100011010001000000
② 然后将原始数据按3个字节一组切片,余1则在二进制数的后面补齐4个0,余2则补齐2个0。
T34f*(余2):010101000011001100110100011001100010101000
我是HuMa→年龄是24@(余1):111001101000100010010001111001101001100010101111010010000111010101001101011000011110001010000110100100101110010110111001101101001110100110111110100001001110011010011000101011110011001000110100010000000000
加密过程
③ base64字符集:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
④ 将上面的二进制数按6位一组转换成十进制,不足6位的后面用0补齐,对照base64的索引取出对应元素。
T34f*:010101 000011 001100 110100 011001 100010 101000 --> 'V', 'D', 'M', '0', 'Z', 'i', 'o'
我是HuMa→年龄是24@(余1):111001 101000 100010 010001 111001 101001 100010 101111 010010 000111 010101 001101 011000 011110 001010 000110 100100 101110 010110 111001 101101 001110 100110 111110 100001 001110 011010 011000 101011 110011 001000 110100 010000 000000 --> '5', 'o', 'i', 'R', '5', 'p', 'i', 'v', 'S', 'H', 'V', 'N', 'Y', 'e', 'K', 'G', 'k', 'u', 'W', '5', 't', 'O', 'm', '+', 'h', 'O', 'a', 'Y', 'r', 'z', 'I', '0', 'Q', 'A'
⑤ 将上面元素个数除以4取余数,如果不能整除,余1则补齐一个"=",余2则补齐两个"=",得到密文。
T34f*:VDM0Zio=
我是HuMa→年龄是24@:5oiR5pivSHVNYeKGkuW5tOm+hOaYrzI0QA==
解密过程
⑥ 先将"="删除,然后对照base64取出相应的索引值,并转换为二进制数。
T34f*:010101000011001100110100011001100010101000
我是HuMa→年龄是24@:111001101000100010010001111001101001100010101111010010000111010101001101011000011110001010000110100100101110010110111001101101001110100110111110100001001110011010011000101011110011001000110100010000000000
⑦ 然后将二进制数的字符数除以8得到整数部分,再用整数部分除以3取余,余1则删除4个0,余2则删除2个0。
T34f*:42 // 8 == 5,5 % 3 == 2 --> 0101010000110011001101000110011000101010
我是HuMa→年龄是24@:204 // 8 == 25,25 % 3 = 1 --> 11100110100010001001000111100110100110001010111101001000011101010100110101100001111000101000011010010010111001011011100110110100111010011011111010000100111001101001100010101111001100100011010001000000
⑧ 最后,按8位一组转换成UTF-8即可得到原文(这里的我,是,→,年,龄,是均由3个字节组成)。
T34f*:01010100 00110011 00110100 01100110 00101010 --> T34f*
我是HuMa→年龄是24@:11100110 10001000 10010001 11100110 10011000 10101111 01001000 01110101 01001101 01100001 11100010 10000110 10010010 11100101 10111001 10110100 11101001 10111110 10000100 11100110 10011000 10101111 00110010 00110100 01000000 --> 我是HuMa→年龄是24@
2. 接下来看具体的代码实现,这一块主要是将用户输入转换成二进制,并将所有字符合并成一个元素。

3. 之所以要合并成一个元素,主要还是考虑到后面的切片需要,下面这部分是base64的加密过程。

4. 最后就是重头戏的解密过程了,这里并不是简单的逆向操作即可,重点是要先取出索引值才行。


5. 下面我们运行一下看看,以原文T34f*和我是HuMa→年龄是24@为例,程序先加密再解密,全自动完成。


虽然已经有base64的第三方库更加方便快捷,但是手搓代码的过程也是深入学习base64的过程,乐在其中!
另外,base32和base16算法上也是一样的,区别主要有两点:
一、字符集不同
① base32字符集:ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
② base16字符集:0123456789ABCDEF
二、切片长度不同
③ base64:每3个字节(24bit)分为4个6bit(因为2的6次方等于64),然后映射到字符集。
④ base32:每5个字节(40bit)分为8个5bit(因为2的5次方等于32),然后映射到字符集。
⑤ base16:每1个字节(8bit)分为2个4bit(因为2的4次方等于16),然后映射到字符集。
注意:base16因为刚好是4的倍数,所以无需用"="补足!

浙公网安备 33010602011771号