前言
爬虫工程师在做加密参数逆向的时候,经常会遇到各种各样的加密算法、编码、混淆,每个算法都有其对应的特征,对于一些较小的网站,往往直接引用这些官方算法,没有进行魔改等其他操作,这种情况下,如果我们能熟悉常见算法的特征,通过密文就能猜测出使用的哪种算法、编码、混淆,将会大大提高工作效率!在 CTF 中通常也会有密码类的题目,掌握一些常见密文特征也是 CTFer 们必备的技能!
本文将介绍以下编码和加密算法的特征:
-
编码:Base 系列、Unicode、Escape、URL、Hex;
-
算法:MD5、SHA 系列、HMAC 系列、RSA、AES、DES、3DES、RC4、Rabbit、SM 系列;
-
混淆:Obfuscator、JJEncode、AAEncode、JSFuck、Jother、Brainfuck、Ook!、Trivial brainfuck substitution;
-
其他:恺撒密码、栅栏密码、猪圈密码、摩斯密码、培根密码、维吉尼亚密码、与佛论禅、当铺密码。
PS:常见加密算法原理以及在 Python 和 JavaScript 中的实现方法可参见 K 哥以前的文章:【爬虫知识】爬虫常见加密解密算法
编码系列
Base 系列编码
Base64 是我们最常见的编码,除此之外,其实还有 Base16、Base32、Base58、Base85、Base100 等,他们之间最明显的区别就是使用了不同数量的可打印字符对任意字节数据进行编码,比如 Base64 使用了 64 个可打印字符(A-Z、a-z、0-9、+、/),Base16 使用了 16 个可打印字符(A-F、0-9),这里主要讲怎么快速识别,其具体原理可自行百度,Base 系列主要特征如下:
-
Base16:结尾没有等号,数字要多于字母;
-
Base32:字母要多于数字,明文数量超过 10 个,结尾可能会有很多等号;
-
Base58:结尾没有等号,字母要多于数字;
-
Base64:一般情况下结尾都会有 1 个或者 2 个等号,明文很少的时候可能没有;
-
Base85:等号一般出现在字符串中间,含有一些奇怪的字符;
-
Base100:密文由 Emoji 表情组成。
示例:
编码类型 | 示例一 | 示例二 |
明文 | 01234567890 | administrators |
Base16 | 3031323334353637383930 |
61646D696E6973747261746F7273 |
Base32 | GAYTEMZUGU3DOOBZGA====== |
MFSG22LONFZXI4TBORXXE4Y= |
Base58 | cX8j8pvGzppMKVb |
BNF5dFLUTN5XwM1yLoF |
Base64 | MDEyMzQ1Njc4OTA= |
YWRtaW5pc3RyYXRvcnM= |
Base85 | 0JP==1c70M3&rY |
@:X4hDJ=06Eaa'.EcV |
Base100 | 🐧🐨🐩🐪🐫🐬🐭🐮🐯🐰🐧 |
👘👛👤👠👥👠👪👫👩👘👫👦👩👪 |
Unicode 编码
Unicode 又称为统一码、万国码、单一码,是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。其主要特征如下:
-
以
\u
、&#
或&#x
开头,后面是数字加字母组合
PS:\u
开头和 &#x
开头是一样的,都是 16 进制 Unicode 字符的不同写法,&#
则是 Unicode 字符 10 进制的写法,此外,&#
和 &#x
开头的,也称为 HTML 字符实体转换,字符实体是用一个编号写入 HTML 代码中来代替一个字符,在 HTML 中,某些字符是预留的,如果希望正确地显示预留字符,就必须在 HTML 源代码中使用字符实体。
示例:
编码类型 | 示例一 | 示例二 |
明文 | 12345 | admin |
Unicode | \u0031\u0032\u0033\u0034\u0035 |
\u0061\u0064\u006d\u0069\u006e |
Escape 编码
Escape 编码又叫 %u 编码,Escape 编码就是字符对应 UTF-16BE 表示方式前面加 %u,Escape 不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . /
,其他所有的字符都会被转义序列替换。其主要特征如下:
-
以
%u
开头,后面是数字加字母组合
示例:
编码类型 | 示例一 | 示例二 |
明文 | K 哥爬虫 | 我爱 Python |
Escape | K%u54E5%u722C%u866B |
%u6211%u7231Python |
URL / Hex 编码
URL 和 Hex 编码的结果是一样的,不同的是当你用 URL 编码网址时是不会把 http
、https
关键字和 /
、?
、&
、=
等连接符进行编码的,而 Hex 编码则全部转化了,其主要特征如下:
-
以
%
开头,后面是数字加字母组合
编码类型 | 示例 |
明文 | https://www.kuaidaili.com/ |
Unicode | https://%77%77%77%2E%6B%75%61%69%64%61%69%6C%69%2E%63%6F%6D/ |
Hex | %68%74%74%70%73%3a%2f%2f%77%77%77%2e%6b%75%61%69%64%61%69%6c%69%2e%63%6f%6d%2f |
加密算法
MD5
MD5 实质是一种消息摘要算法,一个数据的 MD5 值是唯一的,同一个数据不可能计算出多个不同的 MD5 值,但是,不同数据计算出来的 MD5 值是有可能一样的,知道一个 MD5 值,理论上是无法还原出它的原始数据的,MD5 是最容易辨别的,主要特征如下:
-
密文一般为 16 位或者 32 位,其中 16 位是取的 32 位第 9~25 位的值;
-
组成方式为字母(a-f)和数字(0-9)混合,字母可以全部是大写或者小写。
除了通过密文特征来判断以外,我们还可以搜索源代码,标准 MD5 的源码里是包含了一些特定的值的,没有这些特定值,就无法实现 MD5:
-
0123456789ABCDEF
、0123456789abcdef
-
1732584193
、-271733879
、-1732584194
、271733878
PS:某些特殊情况下,密文的长度也有可能不止 16 位或者 32 位,有可能是在官方算法上有一些魔改,通常也是在 16 位的基础上,左右填充了一些随机字符串。
示例:
编码类型 | 示例一 | 示例二 |
明文 | 123456 | admin |
MD5 (16 位小写) |
49ba59abbe56e057 |
7a57a5a743894a0e |
MD5 (16 位大写) |
49BA59ABBE56E057 |
7A57A5A743894A0E |
MD5 (32 位小写) |
e10adc3949ba59abbe56e057f20f883e |
21232f297a57a5a743894a0e4a801fc3 |
MD5 (32 位大写) |
E10ADC3949BA59ABBE56E057F20F883E |
21232F297A57A5A743894A0E4A801FC3 |
SHA 系列
SHA 是比 MD5 更安全一点的摘要算法,SHA 通常指 SHA 家族算法,分别是 SHA-1、SHA-2、SHA-3,其中 SHA-2 是 SHA-224、SHA-256、SHA-384、SHA-512 的并称,SHA-3 是 SHA3-224、SHA3-256、SHA3-384、SHA3-512、SHAKE128、SHAKE256 的并称,其名字的后缀的数字就代表了结果的大小(bit),注意,SHAKE 算法结果的大小并不是固定的,其他算法特征如下:
-
SHA-1:字母(a-f)和数字(0-9)混合,固定位数 40 位;
-
SHA-224/SHA3-224:字母(a-f)和数字(0-9)混合,固定位数 56 位;
-
SHA-256/SHA3-256:字母(a-f)和数字(0-9)混合,固定位数 64 位;
-
SHA-384/SHA3-384:字母(a-f)和数字(0-9)混合,固定位数 96 位;
-
SHA-512/SHA3-512:字母(a-f)和数字(0-9)混合,固定位数 128 位。
示例:
编码类型 | 示例 |
明文 | 123456 |
SHA-1 | 7c4a8d09ca3762af61e59520943dc26494f8941b |
SHA-256 | 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 |
SHA3-256 | c888c9ce9e098d5864d3ded6ebcc140a12142263bace3a23a36f9905f12bd64a |
HMAC 系列
HMAC 这种算法就是在 MD5、SHA 两种加密的基础上引入了秘钥,其密文也和 MD5、SHA 类似,密文的长度和使用的 MD5、SHA 算法对应密文的长度是一样的。特征如下:
-
HMAC-MD5:字母(a-f)和数字(0-9)混合,位数一般为 32 位;
-
HMAC-SHA-1:字母(a-f)和数字(0-9)混合,固定位数 40 位;
-
HMAC-SHA-224 / HMAC-SHA3-224:字母(a-f)和数字(0-9)混合,固定位数 56 位;
-
HMAC-SHA-256 / HMAC-SHA3-256:字母(a-f)和数字(0-9)混合,固定位数 64 位;
-
HMAC-SHA-384 / HMAC-SHA3-384:字母(a-f)和数字(0-9)混合,固定位数 96 位;
-
HMAC-SHA-512 / HMAC-SHA3-512:字母(a-f)和数字(0-9)混合,固定位数 128 位。
HM