CTF中常見的編碼,代碼混淆及加、解密

其實剛開始我對編碼與加密的概念區(qū)分的不是非常清楚,一度以為加密就是對信息進行編碼,這是一種錯誤的觀點。編碼是將數(shù)據(jù)信息轉(zhuǎn)化成一種固定格式的編碼信息,而加密是為了保證信息傳輸?shù)陌踩?,兩者還是有區(qū)別的。接下來就給大家講講編碼與加密、解密。

一,編碼

編碼是為了方便不同系統(tǒng)間的信息傳輸,將數(shù)據(jù)轉(zhuǎn)化成固定格式的信息,通過編碼可以得到原始信息。常見的編碼我們都已經(jīng)很熟悉了,比如ASCII編碼、URL編碼、HTML實體編碼以及Base編碼等。

1,ASCII編碼

ASCII編碼大致可以分作三部分組成:

第一部分是:ASCII非打印控制字符(參詳ASCII碼表中0-31);

第二部分是:ASCII打印字符,也就是CTF中常用到的轉(zhuǎn)換;

第三部分是:擴展ASCII打印字符(詳見 ASCII碼表 二)。

例:easy—101 97 115 121

(ASCII表——來自百度百科)

(ASCII碼表 二)

2,URL編碼

又叫百分號編碼,是統(tǒng)一資源定位編碼方式。URL 地址(常說網(wǎng)址) 規(guī)定了常用地數(shù)字,字母可以直接使用,另外一批作為特殊用戶字符也可以直接用(/,:@等),剩下的其它所有字符必須通過%xx 編碼處理。編碼方法很簡單,在該字節(jié) ascii 碼的的 16 進制字符前面加%. 如空格字符,ascii 碼是 32,對應16 進制是’20′,那么 urlencode 編碼結果是:%20。

例:https://baike.baidu.com/item/ABC

URL轉(zhuǎn)碼: %68%74%74%70%73%3A%2F%2F%62%61%69%6B%65%2E%62%61%69%64%75%2E%63%6F%6D%2F%69%74%65%6D%2F%41%42%43

3,HTML實體編碼

一些字符在 HTML 中是預留的,擁有特殊的含義,比如小于號‘<’用于定義 HTML 標簽的開始。如果我們希望瀏覽器正確地顯示這些字符,我們必須在 HTML 源碼中插入字符實體。用一個編號寫入HTML代碼中來代替一個字符,在使用瀏覽器訪問網(wǎng)頁時會將這個編號解析還原為字符以供閱讀。

(來自http://www.w3school.com.cn/html/html_entities.asp

例:easy——easy

4,Base編碼

Base家族主要有Base16、Base32、Base64。Base64由大小寫字母和數(shù)字,+/組成(=號用作填充字符),Base32則是只有大寫字母和234567。其中Base64/32是網(wǎng)絡上最常見的用于傳輸8Bit字節(jié)代碼的編碼方式之一。Base64編碼是從二進制到字符的過程,可用于在HTTP環(huán)境下傳遞較長的標識信息。例如,在Java Persistence系統(tǒng)Hibernate中,就采用了Base64來將一個較長的唯一標識符(一般為128-bit的UUID)編碼為一個字符串,用作HTTP表單和HTTP GET URL中的參數(shù)。Base64編碼保證了二進制數(shù)據(jù)的安全。

例:Base64:easy—ZWFzeQ==

(Base64的代碼實現(xiàn):https://baike.baidu.com/item/base64/8545775)

5、Unicode編碼

Unicode編碼有以下四種編碼方式:

源文本:The

&#x [Hex]:The

&# [Decimal]:The

\U [Hex]:\U0054\U0068\U0065

\U+ [Hex]:\U+0054\U+0068\U+0065

6、莫爾斯電碼(Morse Code)

摩爾斯電碼(又譯為摩斯密碼,Morse code)是一種時通時斷的信號代碼,通過不同的排列順序來表達不同的英文字母、數(shù)字和標點符號。是早期的數(shù)字化通信形式,但是它不同于現(xiàn)代只使用零和一兩種狀態(tài)的二進制代碼,它的代碼包括五種:點、劃、點和劃之間的停頓、每個字符之間短的停頓、每個詞之間中等的停頓以及句子之間長的停頓。

除此之外,常用的編碼方式還有敲擊碼(Tap code)等。編碼在電子計算機、電視、遙控和通訊等方面廣泛使用。編碼是信息從一種形式或格式轉(zhuǎn)換為另一種形式的過程;解碼,是編碼的逆過程。

二、常見的代碼混淆

代碼混淆(Obfuscated code)亦稱花指令,是將計算機程序的代碼,轉(zhuǎn)換成一種功能上等價,但是難于閱讀和理解的形式的行為。代碼混淆可以用于程序源代碼,也可以用于程序編譯而成的中間代碼。執(zhí)行代碼混淆的程序被稱作代碼混淆器。目前已經(jīng)存在許多種功能各異的代碼混淆器。常用的代碼混淆有jsfuck、brainfuck,Vbscript.encode加密等

1、Jsfuck

jsfuck源于一門編程語言brainfuck,其主要的思想就是只使用8種特定的符號來編寫代碼。而jsfuck也是沿用了這個思想,它可以讓你只用 6 個字符`[ ]( ) ! + `來編寫 JavaScript 程序。此外,JSFuck可用于繞過惡意代碼檢測,且可以被用于跨站腳本攻擊。因為缺乏原生JavaScript應有的特征,類似JSFuck的JavaScript混淆技術可幫助惡意代碼繞過入侵防御系統(tǒng)或內(nèi)容過濾器?,F(xiàn)實中,因為JSFuck中缺少字母數(shù)字字符,且eBay中的內(nèi)容過濾器曾存在缺陷,使得賣家曾經(jīng)可以在他們的eBay拍賣頁面中嵌入任意JSFuck腳本

例:http://utf-8.jp/public/jsfuck.html

2、Brainfuck

Brainfuck是一種極小化的計算機語言,目標是建立一種簡單的、可以用最小的編譯器來實現(xiàn)的、符合圖靈完全思想的編程語言。BrainFuck 語言只有八種符號,所有的操作都由這八種符號(` > < + – . , [ ] `)的組合來完成。

例:hello world

+++++ +++++ [->++ +++++ +++<] >++++ .—. +++++ ++..+ ++.

<+ +++++ ++[->----- ---<] >—- —– —– -.<++ +++++ ++[-> ++

+++ ++++< ]>+++ +++.—— –.++ +.— —.- —– –.<

在線解密工具:?https://www.splitbrain.org/services/ook

3、Vbscript.encode加密

VBScript.encode是針對asp代碼進行的一種加密混淆操作。

樣題:?http://ctf5.shiyanbar.com:8080/aspencode/

在線工具:http://adophper.com/encode.html

4、Jjencode

jjencode 將 JS 代碼轉(zhuǎn)換成只有符號的字符串,類似于 rrencode,介紹的,aaencode 可以將 JS 代碼轉(zhuǎn)換成常用的網(wǎng)絡表情,也就是我們說的顏文字 js 加密。

例:?http://utf-8.jp/public/aaencode.html

三、加密

密碼學是研究編制密碼和破譯密碼的技術科學。研究密碼變化的客觀規(guī)律,應用于編制密碼以保守通信秘密的,稱為編碼學;應用于破譯密碼以獲取通信情報的,稱為破譯學,總稱密碼學。主要分為古典加密算法和現(xiàn)代密碼學。

1,古典加密算法

古典密碼算法曾經(jīng)被廣泛應用,大都比較簡單,使用手工和機械操作來實現(xiàn)加密和解密。它的主要對象是文字信息,利用密碼算法實現(xiàn)文字信息的加密和解密。古典密碼編碼方法歸根結底主要有兩種,即置換和代換。比較經(jīng)典的有凱撒密碼、柵欄密碼、培根密碼、仿射密碼和維吉尼亞密碼等。

(1)凱撒密碼

是一種最簡單且最廣為人知的加密技術。它是一種替換加密的技術,明文中的所有字母按照按順序進行 n 個字符錯位轉(zhuǎn)換后被替換成密文。

例:ABCDE(偏移量為3)—DEFGH

(2)柵欄密碼

把要加密的明文分成N個一組,然后把每組的第1個字連起來,形成一段無規(guī)律的話即為柵欄密碼。

例:明 文:The quick brown fox jumps over the lazy dog

去空格:Thequickbrownfoxjumpsoverthelazydog

分 組:Th eq ui ck br ow nf ox ju mp so ve rt he la zy do g

密 文:Teucbonojmsvrhlzdghqikrwfxupoeteayo

(3)培根密碼

又名倍康尼密碼(英語:Bacon’s cipher)是由法蘭西斯·培根發(fā)明的一種隱寫術。是一種替換密碼,每個明文字母被一個由5字符組成的序列替換。最初的加密方式就是由‘A’和’B'組成序列替換明文

例:明文:THE DOG

密文:baabb aabbb aabaa aaabb abbba aabba

(4)仿射密碼

仿射密碼(Affine Cipher)是一種單表代換密碼,字母表中的每個字母相應的值使用一個簡單的數(shù)學函數(shù)映射到對應的數(shù)值,再把對應數(shù)值轉(zhuǎn)換成字母。每一個字母都是通過函數(shù)(ax + b)mod m加密,其中B是位移量,為了保證仿射密碼的可逆性,a和m需要滿足gcd(a , m)=1,一般m為設置為26。

(5)維吉尼亞密碼

維吉尼亞密碼(又譯維熱納爾密碼)是使用一系列凱撒密碼組成密碼字母表的加密算法,屬于多表密碼的一種簡單形式。以其簡單易用而著稱,同時初學者通常難以破解,因而又被稱為“不可破譯的密碼”。這也讓很多人使用維吉尼亞密碼來加密的目的就是為了將其破解。

例:明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG

密鑰(循環(huán)使用,密鑰越長相對破解難度越大):CULTURE

加密過程:如果第一行為明文字母,第一列為密鑰字母,那么明文字母’T'列和密鑰字母’C'行的交點就是密文字母’V',以此類推。

密文:VBP JOZGM VCHQE JQR UNGGW QPPK NYI NUKR XFK

解密網(wǎng)站:https://www.qqxiuzi.cn/bianma/weijiniyamima.php

2,現(xiàn)代密碼學

現(xiàn)代密碼學研究信息從發(fā)端到收端的安全傳輸和安全存儲,核心是密碼編碼學和密碼分析學。1949年香農(nóng)發(fā)表《保密系統(tǒng)的通信理論》標志著現(xiàn)代密碼學的真正開始(第一次質(zhì)的飛躍)。1976年,Diffie和Hellman發(fā)表《密碼學的新方向》,標志著公鑰密碼體制的誕生(第二次質(zhì)的飛躍)。

現(xiàn)代密碼學根據(jù)功能分為三類:

①、對稱加密算法:DES,AES,RC4等。

②、公鑰密碼算法:RSA等

③、HASH函數(shù):md5,sha1

(1),對稱加密算法

在對稱加密算法中,數(shù)據(jù)發(fā)信方將原始數(shù)據(jù)和加密密鑰一起經(jīng)過特殊加密算法處理后,使其變成復雜的加密密文發(fā)送出去,收信方需要使用加密用過的密鑰及相同算法的逆算法對密文進行解密,才能使其恢復成可讀明文。在大多數(shù)的對稱算法中,加密密鑰和解密密鑰是相同的,所以也稱這種加密算法為秘密密鑰算法或單密鑰算法。它要求發(fā)送方和接收方在安全通信之前,商定一個密鑰。對稱算法的安全性依賴于密鑰,泄漏密鑰就意味著任何人都可以對他們發(fā)送或接收的消息解密,所以密鑰的保密性對通信的安全性至關重要。特點是算法公開、計算量小、加密速度快、加密效率高。

對稱加密的分類:流加密與分組加密

* 流加密每次加密數(shù)據(jù)流的一位(bit)或者一個字節(jié)(byte)。如RC4。

* 分組加密(通常也成為塊加密)是將明文進行分組,加密算法對每個分組分別加密,通常明文分組和加密后得到的密文分組等長。典型的分組大小是64bit或128bit。如DES,3DES,AES。

(2),HASH算法

可直接音譯為“哈?!?,一般翻譯為“散列”把任意長度的輸入(又叫做預映射, pre-image),通過散列算法變換成固定長度的輸出,該輸出就是散列值。它是基于快速存取的角度設計的,也是一種典型的“空間換時間”的做法。顧名思義,該數(shù)據(jù)結構可以理解為一個線性表,但是其中的元素不是緊密排列的,而是可能存在空隙。

常見HASH算法主要有MD5、SHA-1等。主要用于文件校驗,數(shù)字簽名,鑒權協(xié)議。另外這里還有一篇利用Hash碰撞而產(chǎn)生DOS攻擊的案例,有興趣的可以閱讀一下:http://www.cnblogs.com/rush/archive/2012/02/05/2339037.html

(其實把hash算法當成是一種加密算法,這是不準確的,我們知道加密總是相對于解密而言的,沒有解密何談加密呢,HASH的設計以無法解為目的的。并且如果我們不附加一個隨機的salt值,HASH口令是很容易被字典攻擊入侵的)

(3),RSA算法

RSA加密算法是一種非對稱加密算法。在公開密鑰加密和電子商業(yè)中RSA被廣泛使用,是現(xiàn)今使用最廣泛的公鑰密碼算法。和其它加密過程一樣,對RSA來說分配公鑰的過程是非常重要的。分配公鑰的過程必須能夠抵擋中間人攻擊。假設Eve交給Bob一個公鑰,并使Bob相信這是Alice的公鑰,并且她可以截下Alice和Bob之間的信息傳遞,那么她可以將她自己的公鑰傳給Bob,Bob以為這是Alice的公鑰。Eve可以將所有Bob傳遞給Alice的消息截下來,將這個消息用她自己的密鑰解密,讀這個消息,然后將這個消息再用Alice的公鑰加密后傳給Alice。理論上Alice和Bob都不會發(fā)現(xiàn)Eve在偷聽他們的消息。今天人們一般用可靠的第三方機構簽發(fā)證書來防止這樣的攻擊。根據(jù)密鑰的使用方法,可以將密碼分為對稱密碼和公鑰密碼。

對稱密碼:加密和解密使用同一種密鑰的方式

公鑰密碼:加密和解密使用不同的密碼的方式,因此公鑰密碼通常也稱為非對稱密碼。

RSA的加密過程可以使用一個通式來表達

密文=明文^E mod N

也就是說RSA加密是對明文的E次方后除以N后求余數(shù)的過程。

從通式可知,只要知道E和N任何人都可以進行RSA加密了,所以說E、N是RSA加密的密鑰,即E和N的組合就是公鑰,用(E,N)來表示公鑰。

RSA的解密同樣可以使用一個通式來表達

明文=密文^D mod N

即對密文進行D次方后除以N的余數(shù)就是明文,所以D和N的組合就是私鑰,私鑰=(D,N)

RSA常見攻擊方式

①、利用rsa加密流程求參數(shù)

②、分解N求私鑰

? 如果n的大小小于256bit,那么我們通過本地工具即可爆破成功。

? 如果n在768bit或者更高,可以嘗試使用一些在線的n分解網(wǎng)站,這些網(wǎng)站會存儲一些已經(jīng)分解成功的n,比如:http://factordb.com

? 如果有多個n,可以嘗試用求公約數(shù)的方式來求解兩個N共同的素因子p,進而求解q

? 在p,q的取值差異過大,或者p,q的取值過于相近的時候,F(xiàn)ormat方法與Pollard rho方法都可以很快將n分解成功。此類分解方法有一個開源項目yafu將其自動化實現(xiàn)了,不論n的大小,只要p和q存在相差過大或者過近時,都可以通過yafu很快地分解成功。

③、共模攻擊

如果在RSA的使用中使用了相同的模n對相同的明文m進行了加密,那么就可以在不分解n的情況下還原出明文m的值。

http://www.bystudent.com/?p=236?

密碼學在信息技術高速發(fā)展的當代具有很重要的意義,發(fā)展范圍廣且深。本文在寫作過程中參考了許多資料,在此一并表示感謝。同時對于文章中涉及的知識只是粗略地簡要介紹,如有不當之處還請指正。網(wǎng)上對密碼學還有很多的資料,大家有興趣的可以看一下。此外,文章中提到的各種解碼及解密方式都可在這個網(wǎng)站中找到相應的工具(http://ctf.ssleye.com/

**** 以下列出對于密碼學學習很有幫助的參考資料 ****

密碼學 – 維基百科,自由的百科全書

https://zh.wikipedia.org/zh-my/%E5%AF%86%E7%A0%81%E5%AD%A6

CTF中那些腦洞大開的編碼和加密 – DaBan – 博客園

https://www.cnblogs.com/daban/p/5680451.html

代碼混淆的重要性

https://www.jdon.com/50072

密碼學起源——由「凱撒加密」到「一次一密」

https://baijiahao.baidu.com/s?id=1621013260155177917&wfr=spider&for=pc

《現(xiàn)代密碼學》 – WittPeng – 博客園

https://www.cnblogs.com/WittPeng/p/8978737.html

http://archive.keyllo.com/L-編程/Code-現(xiàn)代密碼學—原理與協(xié)議.pdf

http://archive.keyllo.com/L-%E7%BC%96%E7%A8%8B/Code-%E7%8E%B0%E4%BB%A3%E5%AF%86%E7%A0%81%E5%AD%A6%E2%

80%94%E5%8E%9F%E7%90%86%E4%B8%8E%E5%8D%8F%E8%AE%AE.pdf

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容