全面分析base64
Base64
Base64加密运用非常广泛,在基础密码学题目中会遇到,在pe逆向会遇到、在android逆向中会遇到,在杂项中也会涉及,因此掌握着种加密方式就显得尤为重要。
- base64加密与解密图解过程
首先base64会有一个密码本,而base64的灵活运用就体现在密码本的变换,我们还是以基础的密码本来解析base64密码。
我们先以一个字符串来解释一下加密的过程(每次取三个字符,加密后会变成四个字符)
ONE
ASCII字符 |
O |
N |
E |
十进制 |
79 |
78 |
69 |
二进制 |
01001111 |
01001110 |
01000101 |
每6bit为一组 |
010011 110100 111001 000101 |
||
高位补0 |
00010011 00110100 00111001 00000101 |
||
对应的base64索引 |
19 52 57 5 |
||
对应的base64字符 |
T 0 5 F |
加密后的字符串就是T05F
但是,如果最后不足三位,又是怎样加密的呢?
FIRST
ASCII字符 |
S |
T |
|
十进制 |
83 |
84 |
|
二进制 |
01010011 |
01010100 |
|
每6bit为一组 |
010100 110101 0100 |
||
高位补0 |
00010100 00110101 0010000 |
||
对应的base64索引 |
20 53 4 |
||
对应的base64字符 |
U 1 Q = |
所以加密后的字符串是:RklSU1Q=
Base64加密规则:
3个ASCII字符刚好转换成对应的4个Base64字符。但是,当需要转换的字符数不是3的倍数的情况下该怎么办呢?Base64规定,当需要转换的字符不是3的倍数时,一律采用补0的方式凑足3的倍数。
Base64解密过程
我们以上文加密后的字符串来进行解密:RklSU1Q=
ASCII字符 |
R |
k |
l |
S |
对应的索引值 |
17 |
36 |
37 |
18 |
索引值二进制 |
00010001 |
00100100 |
00100101 |
00010010 |
去掉前两位 |
010001 |
100100 |
100101 |
010010 |
每8bit一组 |
01000110 01001001 01010010 |
|||
对应ASCII |
70(F) 73(I) 82(R) |
ASCII字符 |
U |
1 |
Q |
= |
对应的索引值 |
20 |
53 |
16 |
|
索引值二进制 |
00010100 |
00110101 |
00010000 |
|
去掉前两位 |
010100 |
110101 |
010000 |
|
每8bit一组 |
01010011 01010100 00(这个是我们加密补全的) |
|||
对应的ASCII |
83(S) 84(T) |
加密与解密就是这样的,base64的变换无非就是更换密码本而已。
接下来我们看看代码是怎么实现的吧!
- base64加密与解密实现过程
在很多加密中,都会采用base64加密,在逆向分析中,能够读懂代码,对解出答案是有很大帮助的。因为在逆向中,我们大部分看的都是C语言代码,因此我们就先分析C语言代码怎样实现base64加密。
Base64加密C语言实现:
上面这个是我在做ISCC所遇到的标准base64加密的伪代码算法
我们来直接分析一下这个代码的关键部分
- 、开辟一个空间是原来的4/3,用来存放base64加密后的字符串
- 、每一次取出三个字符用来加密
- 、然后加密成四个字符
其中“>>”、“<<”是代表移位符号,而“&0x3f”的作用就是将6位便成为8位,在高两位补上0的作用。
针对这样常规的base64解密:
- 、直接用网上的在线解密工具
- 、用python脚本来解密
这种标准的base64不会在逆向中单独出现,出现也会是base64的变异,所以解密内容放在第三点中去讲。
Base64代码实现推荐:https://baike.baidu.com/item/base64/8545775?fr=aladdin
-
base64的灵活运用
- 、base64对图片的加密
在图片隐写中,出题人会将图片用base64 加密,在线有图片转换成base64的工具
-
- 、Base64的变异
这个代码就是更换了密码本
这个加密变换是更换了密码本的开始的ascll,标准是从65开始的,但是里是从32开始,也就是索引上加上32就是加密后的字符
但是解密我们只需要解出索引值,直接用标准的代替就好。