base编码
BASE
一.Base64编码
主要内容:将三字节变成四字节 ( 3 * 8=4 * 6)
实现原理:
e.g.
加密前:s 1 3
转成ascii码:115 49 51
二进制码:1110011 110001 110011
在内存中一个字节占8位,不够8位补0
对应二进制码:01110011 00110001 00110011
以六个为一组:011100 / 110011 / 000100 / 110011
8个一组,高位补0
就有:00011100 00110011 00000100 00110011
转成十进制:28 51 4 51
对应常规索引表为:c z E z
但要是遇到转换字节数不是24的倍数怎么办?
在八位转六位时,可能会有余两位或者余四位的情况,此时继续补0凑够八位时,在解码时会出现多余的位。所以为了解决这个问题,base64引入了 ' = ',一个' = '表示六个二进制位。当补两个0时,补一个=凑够8位;补4个0时时,补两个=,凑够16位变成8的倍数。而在解码的时候,并不解析' = '。
之所以凑成8的倍数,是因为base64主要用于加密后的数据传送,而传送中认为最小的传送单位是字节,所以总位数都是8的倍数。
余四位的情况:,补两个0,补一个=
余两位的情况:补四个0,补两个=
二.Base32编码
编码方式与base64大同小异,在对二进制位进行分割时,以5个为一组,2^5=32,共有32个可显示字符。
八位转五位时,可能会余{0、1、2、3、4}位,但这时可以补0,不过依旧需要' = '来凑够40的倍数,=表示五个二进制位
此例在最后余四位时补0,但此时只有25位二进制位,需要三个=(15位),凑成40的倍数,能够以8字节发送,所以结果是"JFGFK==="
三.Base16编码
4个二进制位表示一个字符,正好可以分成两组,不涉及到余数。每组不够8位便补0,字符数量正好是原来的两倍。
加密特征:
1.Base编码后一定会有一个索引表,可以是自定义的索引表,也可以是常规索引表
在IDA里面查看字符串可以很快找到。
例如:是非常规(自定义)索引表
是常规索引表
2.
对base64加密时的编程方法