爬虫常见的加密解密算法特征收集

常见加密算法逆向特征分析

Base 系列编码

Base 系列主要特征如下:

Base16:结尾没有等号,数字要多于字母;

Base16编码的方式
1.将数据(根据ASCII编码,UTF-8编码等)转成对应的二进制数,不足8比特位高位补0。然后将所有的二进制全部串起来,4个二进制位为一组,转化成对应十进制数。

2.根据十进制数值找到Base16编码表里面对应的字符。Base16是4个比特位表示一个字符,所以原始是1个字节(8个比特位)刚好可以分成两组,也就是说原先如果使用ASCII编码后的一个字符,现在转化成两个字符。数据量是原先的2倍。

Base32:字母要多于数字,明文数量超过 10 个,结尾可能会有很多等号;

Base32使用了ASCII编码中可打印的32个字符(大写字母AZ和数字27)对任意字节数据进行编码.Base32将串起来的二进制数据按照5个二进制位分为一组,由于传输数据的单位是字节(即8个二进制位).所以分割之前的二进制位数是40的倍数(40是5和8的最小公倍数).如果不足40位,则在编码后数据补充"=",一个"="相当于一个组(5个二进制位),编码后的数据是原先的8/5倍.

Base58: 结尾 没有等号, 字母要多于数字

相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+“和”/"符号。简单的说:Base58一种编码方式,跟十进制,十六进制一样,不过更短更省空间。

Base64:一般情况下结尾都会有 1 个或者 2 个等号,明文很少的时候可能没有;

Base64编码要求把3个8位字节(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形式。如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现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 🐧🐨🐩🐪🐫🐬🐭🐮🐯🐰🐧 👘👛👤👠👥👠👪👫👩👘👫👦👩👪

常用解密网站:

Base64:

Base58:www.metools.info

Base32、16:www.qqxiuzi.cn

Base100:www.atoolbox.net

Unicode 编码

Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。其主要特征如下:

  • 以 \u、&# 或 &#x 开头,后面是数字加字母组合

\u 开头和 &#x 开头是一样的,都是 16 进制 Unicode 字符的不同写法,&# 则是 Unicode 字符 10 进制的写法,此外,&# 和 &#x 开头的,也称为 HTML 字符实体转换,字符实体是用一个编号写入 HTML 代码中来代替一个字符,在 HTML 中,某些字符是预留的,如果希望正确地显示预留字符,就必须在 HTML 源代码中使用字符实体。

明文 12345 admin
Unicode \u0031\u0032\u0033\u0034\u0035 \u0061\u0064\u006d\u0069\u006e

常用解密网站:

Unicode:www.sojson.com

16进制Unicode:www.msxindl.com

HTML字符实体:www.qqxiuzi.cn

Escape 编码

Escape 编码又叫 %u 编码,Escape 编码就是字符对应 UTF-16BE 表示方式前面加 %u,Escape 不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / ,其他所有的字符都会被转义序列替换。其主要特征如下:

以 %u 开头,后面是数字加字母组合

明文 爬虫12345 爬虫admin
Escape %u722c%u866b12345 %u722c%u866badmin

URL / Hex 编码

URL 和 Hex 编码的结果是一样的,不同的是当你用 URL 编码网址时是不会把 http、https 关键字和 /、?、&、= 等连接符进行编码的,而 Hex 编码则全部转化了,其主要特征如下:

以 % 开头,后面是数字加字母组合

常用解密网站:

Hex编码:https://www.107000.com/T-Hex

URL 编码:https://www.sojson.com/encodeurl.html

加密算法

MD5

MD5 实质是一种消息摘要算法,一个数据的 MD5 值是唯一的,同一个数据不可能计算出多个不同的 MD5 值,但是,不同数据计算出来的 MD5 值是有可能一样的,知道一个 MD5 值,理论上是无法还原出它的原始数据的,MD5 是最容易辨别的,主要特征如下:

  • 密文一般为16位或者 32位 其中 16 位是取的 32 位第 9~25 位的值

  • 组成方式为字母 (a-f) 和 数字(0-9) 混合 字母可以全部是大写 或者小写

除了通过密文特征来判断以外 , 我们还可以搜索源代码, 标准MD5的源码里是包含了一些特定值 的,没有这些特定值,就无法实现MD5:

SHA

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 位。

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 位。

HMAC 和 SHA、MD5 的密文都很像,当无法确定是否为 HMAC 时,可以通过其名称搜索到加密方法,如果传入了密钥 key,说明就是 HMAC,当然你也可以直接当做是 SHA 或 MD5 来解,解密失败时就得考虑是否有密钥,是否为 HMAC 了,在 JS 中,通常一个 HMAC 加密方法是这样写的:

1
2
3
4
function HmacSHA1Encrypt(word, key) {
return CryptoJS.HmacSHA1(word, key).toString();
}

RSA

RSA 加密算法是一种非对称加密算法,通过公钥加密结果,必须私钥解密。同样私钥加密结果,公钥可以解密,应用非常广泛,在网站中通常使用 JSEncrypt 库来实现,其最大的特征就是有一个设置公钥的过程,我们可以通过以下方法来快速初步判断是否为 RSA 算法:

  • 搜索关键词 new JSEncrypt(),JSEncrypt 等,一般会使用 JSEncrypt 库,会有 new 一个实例对象的操作;
  • 搜索关键词 setPublicKey、setKey、setPrivateKey、getPublicKey 等,一般实现的代码里都含有设置密钥的过程。

RSA 的私钥、公钥、明文、密文长度也有一定对应关系,也可以从这方面初步判断

混淆系列

Obfuscator

Obfuscator 就是混淆的意思,简称 OB 混淆,

  • 一般由一个大数组或者含有大数组的函数、一个自执行函数、解密函数和加密后的函数四部分组成;

  • 函数名和变量名通常以 _0x 或者 0x 开头,后接 1~6 位数字或字母组合;

  • 自执行函数,进行移位操作,有明显的 push、shift 关键字;

JJEncode

JJEncode 具有以下特征:

  • 大量 $、_ 符号、大量重复的自定义变量;
  • 仅由 18 个符号组成:!+,"$.:;_{}~=

AAEncode

AAEncode 具有以下特征:

  • 仅由日式表情符号组成

JSFuck

JSFuck 具有以下特征

  • 仅由 6 个符号组成:!+

Jother

Jother 混淆具有以下特征:

  • 仅由 8 个符号组成:!+{}

Brainfuck

Brainfuck 具有以下特征:

  • 仅由<>+-.[] 组成,大量的 +- 符号。

Ook!

Ook! 具有以下特征:

  • 完整 Ook!:仅由 3 种符号组成 Ook.、Ook?、Ook!

  • Short Ook!:仅由 3 种符号组成 .!?

工具网址:

http://www.hiencode.com/ 常用解混淆
http://www.jsfuck.com/ JSFack加密