CTF&爬蟲:掌握這些特徵,一秒識別密文加密方式
關注微信公眾號: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 |
:penguin::koala::poodle::dromedary_camel::camel::dolphin::mouse::cow::tiger::rabbit::penguin:
|
:kimono::purse::bust_in_silhouette::high_heel::busts_in_silhouette::high_heel::family::couple::woman::kimono::couple::boy::woman::family:
|
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 編碼則全部轉化了,其主要特徵如下:
-
以
%
開頭,後面是數字加字母組合
編碼類型 | 示例 |
---|---|
明文 | http://www.kuaidaili.com/ |
Unicode |
http://%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 語言,該語言以其極簡主義着稱,僅包含八個簡單的命令、一個數據指針和一個指令指針,這種語言在爬蟲領域也可以是一種反爬手段,可以視為一種混淆方式,雖然不常見 ,這裏給一個在線體驗的網址: http://copy.sh/brainfuck/tex... ,感興趣的同志可以深入研究一下,Brainfuck 具有以下特徵:
<>+-.[] +-
正常的一段代碼:
alert("Hello, Brainfuck")
經過 Brainfuck 混淆之後的代碼類似於:
--[----->+<]>-----.+++++++++++.-------.+++++++++++++.++.+[--->+<]>+.------.++[->++<]>.-[->+++++<]>++.+++++++..+++.[->+++++<]>+.------------.+[->++<]>.---[----->+<]>-.+++[->+++<]>++.++++++++.+++++.--------.-[--->+<]>--.+[->+++<]>+.++++++++.+[++>---<]>.+++++++.
Ook!
Ook! 和 Brainfuck 的原理都是類似的,只不過符號有差異,同樣的,這種語言在爬蟲領域也可以是一種反爬手段,可以視為一種混淆方式,雖然不常見 ,在線體驗的網址: http://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 中有可能會出現,作為爬蟲工程師也可以瞭解瞭解:sunglasses:,具體可以參考: http://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
,以此類推。注意:維吉尼亞密碼只對字母進行加密,不區分大小寫,若文本中出現非字母字符會原樣保留,如果輸入多行文本,每行是單獨加密的。
與佛論禪
字符串轉換後,是一些佛語,在線體驗: http://keyfc.net/bbs/tools/t...
示例:
- 明文:K哥爬蟲
- 密文:佛曰:哆室梵阿俱顛哆礙孕奢大皤帝罰藝哆伽密謹爍舍吶慄皤夷密
當鋪密碼
當鋪密碼在 CTF 比賽題目中出現過。該加密算法是根據當前漢字有多少筆畫出頭,對應的明文就是數字幾。
示例:
- 明文:王夫 井工 夫口 由中人 井中 夫夫 由中大
- 密文:67 84 70 123 82 77 125
- 天才製造者:獨行俠、科技巨頭和AI|深度學習崛起十年
- Go內存管理一文足矣
- React如何原生實現防抖?
- 分佈式日誌存儲架構設計方案
- Chrome插件:雲音樂聽歌識曲
- 全場景AI推理引擎MindSpore Lite, 助力HMS Core視頻編輯服務打造更智能的剪輯體驗
- 頁面搭建系統的那些事兒
- 張文驍:遊戲開發的“零件人”夢碎之後|OneFlow U
- App 出海 —— Google 結算系統面面觀
- Curve 基於 Raft 的寫時延優化
- Pandas 中最常用的 7 個時間戳處理函數
- 實現Nest中參數的聯合類型校驗
- JDK內置鎖深入探究
- Docker 實戰教程之從入門到提高 (八)
- 騰訊三面:Cookie的SameSite瞭解吧,那SameParty呢?
- 實錄 | MegEngine 大 Kernel 卷積工程優化實踐
- 虛幻引擎 5 來了!不止 Lumen、Nanite 新技術,性能及 UI 均迎來大升級
- 前端新手快速上手APICloud App開發
- 高效使用Java構建工具|Maven篇|雲效工程師指北
- 雲音樂隱性關係鏈的探索與實踐