爬虫常见的加密解密算法特征收集
常见加密算法逆向特征分析
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:
- tool.oschina.net
- www.sojson.com
- base64.us
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 | function HmacSHA1Encrypt(word, key) { |
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 具有以下特征:
AAEncode
AAEncode 具有以下特征:
- 仅由日式表情符号组成
JSFuck
JSFuck 具有以下特征
Jother
Jother 混淆具有以下特征:
Brainfuck
Brainfuck 具有以下特征:
- 仅由<>+-.[] 组成,大量的 +- 符号。
Ook!
Ook! 具有以下特征:
完整 Ook!:仅由 3 种符号组成 Ook.、Ook?、Ook!
Short Ook!:仅由 3 种符号组成 .!?
工具网址:
http://www.hiencode.com/ 常用解混淆
http://www.jsfuck.com/ JSFack加密