这篇文章上次修改于 381 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

前两天在一个ctf的writeup里看到了一串特别像Base64编码后的字符串,

然而直接进行Base64解码的结果是乱码,writeup的作者则是直接在cmd5解出来的。

于是我想知道它到底是如何加密的......

文章目录:
<!-- index-menu -->

Md5(Base64)加密方式探究

0x01 前言

在网上查阅资料后发现,这是一种混合加密,有些地方将其写为Md5(Base64)。

但是并不能从字面上将其理解为两种加密做了加法。

因为它既不是将明文进行base64编码,然后进行md5计算。也不是先对明文进行md5计算,后进行base64编码。

这种混合加密算法,是将md5加密后的密文分为16个2位16进制的数据,然后分别转为8位2进制,接着重新连接为128位二进制数,最后重新进行分组,然后对每个分组进行base64编码。

这里我们以'The'为例,演示一遍加密的过程。

0x02 加密

1.计算md5

首先,我们计算The的md5值

a4704fd35f0308287f2937ba3eccf5fe

2.分组

将其分为16个2位16进制

a4 70 4f d3 5f 03 08 28 7f 29 37 ba 3e cc f5 fe

3.转换

将16个2位16进制转换为8位2进制

10100100

01110000
01001111
11010011
01011111
00000011
00001000
00101000
01111111
00101001
00110111
10111010
00111110
11001100
11110101
11111110

4.连接并重新分组

将其连接为128位2进制数,接着进行截取,每次截取6位,并补全为8位二进制数。

我们这里共有22组数,然而base64编码以4个base64字符为一组(4 * 6 =24),所以我们需要在编码末尾加上两个=

00101001 p

00000111 H
00000001
00001111
00110100
00110101
00111100
00000011
00000010
00000010
00100001
00111111
00001010
00010011
00011110
00111010
00001111
00101100 s
00110011 z
00110101 1
00111111 /
00100000 g

中间就省略不写了.......

通过这样的方法,我们可以得到最终的加密结果:

pHBP018DCCh/KTe6Psz1/g==

0x03 加密特征

通过这种混合方式加密得到的结果有2个比较明显的特征,可以以此对其进行识别:
1.算上符号=,这种加密结果长度为24位
2.每个加密结果的结尾有且只有2个=