共计 19897 个字符,预计需要花费 50 分钟才能阅读完成。
关注微信公众号:K 哥爬虫,继续分享爬虫进阶、JS/ 安卓逆向等技术干货!
前言
爬虫工程师在做加密参数逆向的时候,常常会遇到各种各样的加密算法、编码、混同,每个算法都有其对应的特色,对于一些较小的网站,往往间接援用这些官网算法,没有进行魔改等其余操作,这种状况下,如果咱们能相熟常见算法的特色,通过密文就能猜测出应用的哪种算法、编码、混同,将会大大提高工作效率!在 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 位。
HMAC 和 SHA、MD5 的密文都很像,当无奈确定是否为 HMAC 时,能够通过其名称搜寻到加密办法,如果传入了密钥 key,阐明就是 HMAC,当然你也能够间接当做是 SHA 或 MD5 来解,解密失败时就得思考是否有密钥,是否为 HMAC 了,在 JS 中,通常一个 HMAC 加密办法是这样写的:
function HmacSHA1Encrypt(word, key) {return CryptoJS.HmacSHA1(word, key).toString();}
示例(密钥 123456abcde):
编码类型 | 示例 |
---|---|
明文 | 123456 |
HMAC-MD5 | 432bb95bb00005ddce4a1c757488ed95 |
HMAC-SHA-1 | 37a04076b7736c44460d330ee0d00014428b175e |
HMAC-SHA-256 | 50cb1345366df11140fb91b43caaf69627e3f5529705ddf6b0d0cae67986e585 |
HMAC-SHA3-256 | b808ed9f66436e89fba527a01d1d6044318fea8599d9f39bfb6bec4843964bf3 |
RSA
RSA 加密算法是一种非对称加密算法,通过公钥加密后果,必须私钥解密。同样私钥加密后果,公钥能够解密,利用十分宽泛,在网站中通常应用 JSEncrypt 库来实现,其最大的特色就是有一个设置公钥的过程,咱们能够通过以下办法来疾速初步判断是否为 RSA 算法:
- 搜寻关键词
new JSEncrypt()
,JSEncrypt
等,个别会应用 JSEncrypt 库,会有 new 一个实例对象的操作; - 搜寻关键词
setPublicKey
、setKey
、setPrivateKey
、getPublicKey
等,个别实现的代码里都含有设置密钥的过程; -
RSA 的私钥、公钥、明文、密文长度也有肯定对应关系,也能够从这方面初步判断:
私钥长度(Base64) 公钥长度(Base64) 明文长度 密文长度 428 128 1~53 88 812 216 1~117 172 1588 392 1~245 344
AES、DES、3DES、RC4、Rabbit 等
AES、DES、3DES、RC4、Rabbit 等加密算法的密文通常没有固定的长度,他们通常应用 crypto-js 来实现,比方 AES 加解密示例如下:
CryptoJS = require("crypto-js")
var key = CryptoJS.enc.Utf8.parse("0123456789abcdef");
var iv = CryptoJS.enc.Utf8.parse("0123456789abcdef");
function AESEncrypt(word) {var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();}
function AESDecrypt(word) {
var srcs = word;
var decrypt = CryptoJS.AES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypt.toString(CryptoJS.enc.Utf8);
}
console.log(AESEncrypt("K 哥爬虫"))
console.log(AESDecrypt("nSk3wCd92s08sQ9N+VHNvA=="))
在 crypto-js 中,也有一些特定的关键字,咱们能够通过搜寻这些关键字来疾速定位到 crypto-js:
CryptoJS
、crypto-js
、iv
、mode
、padding
、createEncryptor
、createDecryptor
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
、0xffffffff
、0xffff
定位到 CryptoJS 后,察看加密办法,比方 AES 就是 CryptoJS.AES.encrypt
,DES 就是 CryptoJS.DES.encrypt
,3DES 就是 CryptoJS.TripleDES.encrypt
,留神他的 iv、mode、padding,拿下来就能够本地复现了。
SM 系列
SM 代表商密,即商业明码,是我国公布的一系列国产加密算法,SM 系列包含:SM1、SM2、SM3、SM4、SM7、SM9,其中 SM1 和 SM7 的算法不公开,SM 系列算法在我国一些 gov 网站上有利用,无关国产加密算法 K 哥后期文章有介绍:《爬虫逆向根底,意识 SM1-SM9、ZUC 国密算法》,本文不再赘述。
在 SM 的 JavaScript 代码中个别会存在以下关键字,能够通过搜寻关键字定位:
SM2
、SM3
、SM4
FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
getPublicKeyFromPrivateKey
、doEncrypt
、doDecrypt
、doSignature
混同系列
Obfuscator
Obfuscator 就是混同的意思,简称 OB 混同,实战可参考 K 哥以前的文章:【JS 逆向百例】W 店 UA,OB 反混同,抓包替换 CORS 跨域谬误剖析,OB 混同具备以下特色:
- 个别由一个大数组或者含有大数组的函数、一个自执行函数、解密函数和加密后的函数四局部组成;
- 函数名和变量名通常以
_0x
或者0x
结尾,后接 1~6 位数字或字母组合; - 自执行函数,进行移位操作,有显著的 push、shift 关键字;
一段失常的代码如下:
function hi() {console.log("Hello World!");
}
hi();
通过 OB 混同后的后果:
function _0x3f26() {var _0x2dad75 = ['5881925kTCKCP', 'Hello\x20World!', '600mDvfGa', '699564jYNxbu', '1083271cEvuvT', 'log', '18sKjcFY', '214857eMgFSU', '77856FUKcuE', '736425OzpdFI', '737172JqcGMg'];
_0x3f26 = function () {return _0x2dad75;};
return _0x3f26();}
(function (_0x307c88, _0x4f8223) {var _0x32807d = _0x1fe9, _0x330c58 = _0x307c88();
while (!![]) {
try {var _0x5d6354 = parseInt(_0x32807d(0x6f)) / 0x1 + parseInt(_0x32807d(0x6e)) / 0x2 + parseInt(_0x32807d(0x70)) / 0x3 + -parseInt(_0x32807d(0x69)) / 0x4 + parseInt(_0x32807d(0x71)) / 0x5 + parseInt(_0x32807d(0x6c)) / 0x6 * (parseInt(_0x32807d(0x6a)) / 0x7) + -parseInt(_0x32807d(0x73)) / 0x8 * (parseInt(_0x32807d(0x6d)) / 0x9);
if (_0x5d6354 === _0x4f8223) break; else _0x330c58['push'](_0x330c58['shift']());
} catch (_0x3f18e4) {_0x330c58['push'](_0x330c58['shift']());
}
}
}(_0x3f26, 0xaa023));
function _0x1fe9(_0xa907e7, _0x410a46) {var _0x3f261f = _0x3f26();
return _0x1fe9 = function (_0x1fe950, _0x5a08da) {
_0x1fe950 = _0x1fe950 - 0x69;
var _0x82a06 = _0x3f261f[_0x1fe950];
return _0x82a06;
}, _0x1fe9(_0xa907e7, _0x410a46);
}
function hi() {
var _0x12a222 = _0x1fe9;
console[_0x12a222(0x6b)](_0x12a222(0x72));
}
hi();
JJEncode
JJEncode、AAEncode、JSFuck 都是同一个作者,实战可参考 K 哥以前的文章:【JS 逆向百例】网洛者反爬练习平台第二题:JJEncode 加密,JJEncode 具备以下特色:
- 大量
$
、_
符号,大量反复的自定义变量; - 仅由 18 个符号组成:
[]()!+,\"$.:;_{}~=
失常的一段 JS 代码:
alert("Hello, JavaScript")
通过 JJEncode 混同(自定义变量名为 $)之后的代码:
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();
AAEncode
JJEncode、AAEncode、JSFuck 都是同一个作者,实战可参考 K 哥以前的文章:【JS 逆向百例】网洛者反爬练习平台第三题:AAEncode 加密,AAEncode 具备以下特色:
- 仅由日式表情符号组成
失常的一段 JS 代码:
alert("Hello, JavaScript")
通过 AAEncode 混同之后的代码:
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ((゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
JSFuck
JJEncode、AAEncode、JSFuck 都是同一个作者,实战可参考 K 哥以前的文章:【JS 逆向百例】网洛者反爬练习平台第四题:JSFuck 加密,JSFuck 具备以下特色:
- 仅由 6 个符号组成:
[]()!+
失常的一段 JS 代码:
alert(1)
通过 JSFuck 混同之后的代码相似于:
[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]])+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[+!+[]+[!+[]+!+[]+!+[]]]+[+!+[]]+([+[]]+![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[!+[]+!+[]+[+[]]])
Jother
Jother 混同和 JSFuck 有点儿相似,惟一的区别就是密文比 JSFuck 多了 {}
,其解密形式和 JSFuck 是一样的,Jother 混同当初不太常见了,也很难找到在线混同之类的工具了,原作者有个在线页面也敞开了,不过依然能够理解一下,Jother 混同具备以下特色:
- 仅由 8 个符号组成:
[]()!+{}
失常的一段代码:
function anonymous(
) {return location}
通过 Jother 混同之后的代码相似于:
[][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+({}[[]]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+({}+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]]+(!![]+[])[+[]]+({}[[]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]])()
Brainfuck
Brainfuck 实际上是一种极小化的计算机语言,又称为 BF 语言,该语言以其极简主义着称,仅蕴含八个简略的命令、一个数据指针和一个指令指针,这种语言在爬虫畛域也能够是一种反爬伎俩,能够视为一种混同形式,尽管不常见🤔,这里给一个在线体验的网址:https://copy.sh/brainfuck/tex…,感兴趣的同志能够深入研究一下,Brainfuck 具备以下特色:
- 仅由
<>+-.[]
组成; - 大量的
+-
符号。
失常的一段代码:
alert("Hello, Brainfuck")
通过 Brainfuck 混同之后的代码相似于:
--[----->+<]>-----.+++++++++++.-------.+++++++++++++.++.+[--->+<]>+.------.++[->++<]>.-[->+++++<]>++.+++++++..+++.[->+++++<]>+.------------.+[->++<]>.---[----->+<]>-.+++[->+++<]>++.++++++++.+++++.--------.-[--->+<]>--.+[->+++<]>+.++++++++.+[++>---<]>.+++++++.
Ook!
Ook! 和 Brainfuck 的原理都是相似的,只不过符号有差别,同样的,这种语言在爬虫畛域也能够是一种反爬伎俩,能够视为一种混同形式,尽管不常见🤔,在线体验的网址:https://www.splitbrain.org/se…,Ook! 具备以下特色:
- 残缺 Ook!:仅由 3 种符号组成
Ook.
、Ook?
、Ook!
- Short Ook!:仅由 3 种符号组成
.!?
失常的一段代码:
alert("Hello, Ook!")
通过 Ook! 混同之后的代码相似于:
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook.
Trivial brainfuck substitution
Trivial brainfuck substitution 不是一种繁多的编程语言,而是一大类编程语言,成员超过 20 个,后面提到的 Brainfuck、Ook! 都是其中的一员,在爬虫畛域中,说实话这种稀奇古怪的混同其实并不常见,然而在一些 CTF 中有可能会呈现,作为爬虫工程师也能够理解理解😎,具体能够参考:https://esolangs.org/wiki/Tri…
其余
恺撒明码
恺撒明码(Caesar cipher)又称为恺撒加密、恺撒变换、变换加密,它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)依照一个固定数目进行偏移后被替换成密文。例如,当偏移量是 3 的时候,所有的字母 A 将被替换成 D,B 变成 E,以此类推。这个加密办法是以罗马共和期间恺撒的名字命名的,当年恺撒曾用此办法与其将军们进行分割。
依据偏移量的不同,还存在若干特定的恺撒明码名称:偏移量为 10:Avocat(A→K);偏移量为 13:ROT13;偏移量为 -5:Cassis (K 6);偏移量为 -6:Cassette (K 7)
示例(偏移量 3):
- 明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
- 密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC
栅栏明码
栅栏明码就是把要加密的明文分成 N 个一组,而后把每组的第 1 个字连起来,造成一段无规律的话。栅栏明码自身有一个潜规则,就是组成栅栏的字母个别不会太多,个别不超过 30 个。
示例:明文为 THE LONGEST DAY MUST HAVE AN END。加密时,把将要传递的信息中的字母交替排成高低两行:
T E O G S D Y U T A E N N
H L N E T A M S H V A E D
将上面一行字母排在下面一行的后边组合成密文:
TEOGSDYUTAENN HLNETAMSHVAED
栅栏明码还有一种变种,称为栅栏明码 W 型,它会先把明文相似 W 形态进行排列,而后再按栏目程序 1-N,取每一栏的所有字符值,组成加密后密文,比方字符串 123456789,采纳栏目数为 3 时,明文将采纳如下排列:
1—5—9
-2-4-6-8-
–3—7–
取每一栏所有字符串,组成加密后密文:159246837
猪圈明码
猪圈明码也称为朱高明码、共济会暗号、共济会明码或共济会员明码,是一种以格子为根底的简略代替式明码。只能对字母加解密并且符号无奈复制,粘贴后会间接显示明文,即便应用符号,也不会影响明码剖析,亦可用在其它代替式的办法。已经是美国内战时盟军应用的明码,目前仅在明码教学、各种比赛中应用。
摩斯明码
摩斯明码(Morse code),又称为摩尔斯电码、摩斯电码,是一种时通时断的信号代码,这种信号代码通过不同的排列程序来表白不同的英文字母、数字和标点符号等。
26 个字母的摩斯密码表
字符 | 摩斯码 | 字符 | 摩斯码 | 字符 | 摩斯码 | 字符 | 摩斯码 |
---|---|---|---|---|---|---|---|
A | .━ |
B | ━ ... |
C | ━ .━ . |
D | ━ .. |
E | . |
F | ..━ . |
G | ━ ━ . |
H | .... |
I | .. |
J | .━ ━ ━ |
K | ━ .━ |
L | .━ .. |
M | ━ ━ |
N | ━ . |
O | ━ ━ ━ |
P | .━ ━ . |
Q | ━ ━ .━ |
R | .━ . |
S | ... |
T | ━ |
U | ..━ |
V | ...━ |
W | .━ ━ |
X | ━ ..━ |
Y | ━ .━ ━ |
Z | ━ ━ .. |
10 个数字的摩斯密码表
字符 | 摩斯码 | 字符 | 摩斯码 | 字符 | 摩斯码 | 字符 | 摩斯码 |
---|---|---|---|---|---|---|---|
0 | ━ ━ ━ ━ ━ |
1 | .━ ━ ━ ━ |
2 | ..━ ━ ━ |
3 | ...━ ━ |
4 | ....━ |
5 | ..... |
6 | ━ .... |
7 | ━ ━ ... |
8 | ━ ━ ━ .. |
9 | ━ ━ ━ ━ . |
标点符号的摩斯密码表
字符 | 摩斯码 | 字符 | 摩斯码 | 字符 | 摩斯码 | 字符 | 摩斯码 |
---|---|---|---|---|---|---|---|
. | .━ .━ .━ |
: | ━ ━ ━ ... |
, | ━ ━ ..━ ━ |
; | ━ .━ .━ . |
? | ..━ ━ .. |
= | ━ ...━ |
‘ | .━ ━ ━ ━ . |
/ | ━ ..━ . |
! | ━ .━ .━ ━ |
━ | ━ ....━ |
_ | ..━ ━ .━ |
“ | .━ ..━ . |
( | ━ .━ ━ . |
) | ━ .━ ━ .━ |
$ | ...━ ..━ |
& | . ... |
@ | .━ ━ .━ . |
培根明码
培根明码,又名倍康尼明码(Bacon’s cipher)是由法兰西斯·培根创造的一种隐写术,它是一种实质上用二进制数设计的,没有用通常的 0 和 1 来示意,而是采纳 a 和 b,看到一串的 a 和 b,并且五个一组,那么就是培根加密了。
第一种形式:
字符 | 培根明码 | 字符 | 培根明码 | 字符 | 培根明码 | 字符 | 培根明码 |
---|---|---|---|---|---|---|---|
A | aaaaa | H | aabbb | O | abbba | V | babab |
B | aaaab | I | abaaa | P | abbbb | W | babba |
C | aaaba | J | abaab | Q | baaaa | X | babbb |
D | aaabb | K | ababa | R | baaab | Y | bbaaa |
E | aabaa | L | ababb | S | baaba | Z | bbaab |
F | aabab | M | abbaa | T | baabb | ||
G | aabba | N | abbab | U | babaa |
第二种形式:
字符 | 培根明码 | 字符 | 培根明码 | 字符 | 培根明码 | 字符 | 培根明码 |
---|---|---|---|---|---|---|---|
a | AAAAA | h | AABBB | p | ABBBA | x | BABAB |
b | AAAAB | i-j | ABAAA | q | ABBBB | y | BABBA |
c | AAABA | k | ABAAB | r | BAAAA | z | BABBB |
d | AAABB | l | ABABA | s | BAAAB | ||
e | AABAA | m | ABABB | t | BAABA | ||
f | AABAB | n | ABBAA | u-v | BAABB | ||
g | AABBA | o | ABBAB | w | BABAA |
示例:
- 明文:kuaidaili
- 密文:ABABABABAAAAAAAABAAAAAABBAAAAAABAAAABABBABAAA
维吉尼亚明码
维吉尼亚明码是在凯撒明码根底上产生的一种加密办法,它将凯撒明码的全副 25 种位移排序为一张表,与原字母序列独特组成 26 行及 26 列的字母表。另外,维吉尼亚明码必须有一个密钥,这个密钥由字母组成,起码一个,最多可与明文字母数量相等。维吉尼亚密码表如下:
示例:
- 明文:I’ve got it.
- 密钥:ok
- 密文:W’fs qcd wd.
首先,密钥长度须要与明文长度雷同,如果少于明文长度,则反复拼接直到雷同。示例的明文长度为 8 个字母(非字母均被疏忽),密钥会被程序补全为 okokokok
,而后依据维吉尼亚密码表进行加密:明文第一个字母是 I
,密钥第一个字母是 o
,在表格中找到 I
列与 o
行相交点,字母 W
就是密文第一个字母,同理,v
列与 k
行交点字母是 F
,e
列与 o
行交点字母是 S
,以此类推。留神:维吉尼亚明码只对字母进行加密,不辨别大小写,若文本中呈现非字母字符会原样保留,如果输出多行文本,每行是独自加密的。
与佛论禅
字符串转换后,是一些佛语,在线体验:https://keyfc.net/bbs/tools/t…
示例:
- 明文:K 哥爬虫
- 密文:佛曰:哆室梵阿俱顛哆礙孕奢大皤帝罰藝哆伽密謹爍舍呐栗皤夷密
当铺明码
当铺明码在 CTF 较量题目中呈现过。该加密算法是依据以后汉字有多少笔画出头,对应的明文就是数字几。
示例:
- 明文:王夫 井工 夫口 由中人 井中 夫夫 由中大
- 密文:67 84 70 123 82 77 125