其實(shí)剛開始我對(duì)編碼與加密的概念區(qū)分的不是非常清楚,一度以為加密就是對(duì)信息進(jìn)行編碼,這是一種錯(cuò)誤的觀點(diǎn)。編碼是將數(shù)據(jù)信息轉(zhuǎn)化成一種固定格式的編碼信息,而加密是為了保證信息傳輸?shù)陌踩裕瑑烧哌€是有區(qū)別的。接下來就給大家講講編碼與加密、解密。
一,編碼
編碼是為了方便不同系統(tǒng)間的信息傳輸,將數(shù)據(jù)轉(zhuǎn)化成固定格式的信息,通過編碼可以得到原始信息。常見的編碼我們都已經(jīng)很熟悉了,比如ASCII編碼、URL編碼、HTML實(shí)體編碼以及Base編碼等。
1,ASCII編碼
ASCII編碼大致可以分作三部分組成:
第一部分是:ASCII非打印控制字符(參詳ASCII碼表中0-31);
第二部分是:ASCII打印字符,也就是CTF中常用到的轉(zhuǎn)換;
第三部分是:擴(kuò)展ASCII打印字符(詳見 ASCII碼表 二)。
例:easy—101 97 115 121
(ASCII表——來自百度百科)
(ASCII碼表 二)
2,URL編碼
又叫百分號(hào)編碼,是統(tǒng)一資源定位編碼方式。URL 地址(常說網(wǎng)址) 規(guī)定了常用地?cái)?shù)字,字母可以直接使用,另外一批作為特殊用戶字符也可以直接用(/,:@等),剩下的其它所有字符必須通過%xx 編碼處理。編碼方法很簡(jiǎn)單,在該字節(jié) ascii 碼的的 16 進(jìn)制字符前面加%. 如空格字符,ascii 碼是 32,對(duì)應(yīng)16 進(jìn)制是’20′,那么 urlencode 編碼結(jié)果是:%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實(shí)體編碼
一些字符在 HTML 中是預(yù)留的,擁有特殊的含義,比如小于號(hào)‘<’用于定義 HTML 標(biāo)簽的開始。如果我們希望瀏覽器正確地顯示這些字符,我們必須在 HTML 源碼中插入字符實(shí)體。用一個(gè)編號(hào)寫入HTML代碼中來代替一個(gè)字符,在使用瀏覽器訪問網(wǎng)頁時(shí)會(huì)將這個(gè)編號(hào)解析還原為字符以供閱讀。
(來自http://www.w3school.com.cn/html/html_entities.asp)
例:easy——easy
4,Base編碼
Base家族主要有Base16、Base32、Base64。Base64由大小寫字母和數(shù)字,+/組成(=號(hào)用作填充字符),Base32則是只有大寫字母和234567。其中Base64/32是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)代碼的編碼方式之一。Base64編碼是從二進(jìn)制到字符的過程,可用于在HTTP環(huán)境下傳遞較長(zhǎng)的標(biāo)識(shí)信息。例如,在Java Persistence系統(tǒng)Hibernate中,就采用了Base64來將一個(gè)較長(zhǎng)的唯一標(biāo)識(shí)符(一般為128-bit的UUID)編碼為一個(gè)字符串,用作HTTP表單和HTTP GET URL中的參數(shù)。Base64編碼保證了二進(jìn)制數(shù)據(jù)的安全。
例:Base64:easy—ZWFzeQ==
(Base64的代碼實(shí)現(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í)斷的信號(hào)代碼,通過不同的排列順序來表達(dá)不同的英文字母、數(shù)字和標(biāo)點(diǎn)符號(hào)。是早期的數(shù)字化通信形式,但是它不同于現(xiàn)代只使用零和一兩種狀態(tài)的二進(jìn)制代碼,它的代碼包括五種:點(diǎn)、劃、點(diǎn)和劃之間的停頓、每個(gè)字符之間短的停頓、每個(gè)詞之間中等的停頓以及句子之間長(zhǎng)的停頓。
除此之外,常用的編碼方式還有敲擊碼(Tap code)等。編碼在電子計(jì)算機(jī)、電視、遙控和通訊等方面廣泛使用。編碼是信息從一種形式或格式轉(zhuǎn)換為另一種形式的過程;解碼,是編碼的逆過程。
二、常見的代碼混淆
代碼混淆(Obfuscated code)亦稱花指令,是將計(jì)算機(jī)程序的代碼,轉(zhuǎn)換成一種功能上等價(jià),但是難于閱讀和理解的形式的行為。代碼混淆可以用于程序源代碼,也可以用于程序編譯而成的中間代碼。執(zhí)行代碼混淆的程序被稱作代碼混淆器。目前已經(jīng)存在許多種功能各異的代碼混淆器。常用的代碼混淆有jsfuck、brainfuck,Vbscript.encode加密等
1、Jsfuck
jsfuck源于一門編程語言brainfuck,其主要的思想就是只使用8種特定的符號(hào)來編寫代碼。而jsfuck也是沿用了這個(gè)思想,它可以讓你只用 6 個(gè)字符`[ ]( ) ! + `來編寫 JavaScript 程序。此外,JSFuck可用于繞過惡意代碼檢測(cè),且可以被用于跨站腳本攻擊。因?yàn)槿狈υ鶭avaScript應(yīng)有的特征,類似JSFuck的JavaScript混淆技術(shù)可幫助惡意代碼繞過入侵防御系統(tǒng)或內(nèi)容過濾器。現(xiàn)實(shí)中,因?yàn)镴SFuck中缺少字母數(shù)字字符,且eBay中的內(nèi)容過濾器曾存在缺陷,使得賣家曾經(jīng)可以在他們的eBay拍賣頁面中嵌入任意JSFuck腳本
例:http://utf-8.jp/public/jsfuck.html
2、Brainfuck
Brainfuck是一種極小化的計(jì)算機(jī)語言,目標(biāo)是建立一種簡(jiǎn)單的、可以用最小的編譯器來實(shí)現(xiàn)的、符合圖靈完全思想的編程語言。BrainFuck 語言只有八種符號(hào),所有的操作都由這八種符號(hào)(` > < + – . , [ ] `)的組合來完成。
例:hello world
+++++ +++++ [->++ +++++ +++<] >++++ .—. +++++ ++..+ ++.
<+ +++++ ++[->----- ---<] >—- —– —– -.<++ +++++ ++[-> ++
+++ ++++< ]>+++ +++.—— –.++ +.— —.- —– –.<
在線解密工具:?https://www.splitbrain.org/services/ook
3、Vbscript.encode加密
VBScript.encode是針對(duì)asp代碼進(jìn)行的一種加密混淆操作。
樣題:?http://ctf5.shiyanbar.com:8080/aspencode/
在線工具:http://adophper.com/encode.html
4、Jjencode
jjencode 將 JS 代碼轉(zhuǎn)換成只有符號(hào)的字符串,類似于 rrencode,介紹的,aaencode 可以將 JS 代碼轉(zhuǎn)換成常用的網(wǎng)絡(luò)表情,也就是我們說的顏文字 js 加密。
例:?http://utf-8.jp/public/aaencode.html
三、加密
密碼學(xué)是研究編制密碼和破譯密碼的技術(shù)科學(xué)。研究密碼變化的客觀規(guī)律,應(yīng)用于編制密碼以保守通信秘密的,稱為編碼學(xué);應(yīng)用于破譯密碼以獲取通信情報(bào)的,稱為破譯學(xué),總稱密碼學(xué)。主要分為古典加密算法和現(xiàn)代密碼學(xué)。
1,古典加密算法
古典密碼算法曾經(jīng)被廣泛應(yīng)用,大都比較簡(jiǎn)單,使用手工和機(jī)械操作來實(shí)現(xiàn)加密和解密。它的主要對(duì)象是文字信息,利用密碼算法實(shí)現(xiàn)文字信息的加密和解密。古典密碼編碼方法歸根結(jié)底主要有兩種,即置換和代換。比較經(jīng)典的有凱撒密碼、柵欄密碼、培根密碼、仿射密碼和維吉尼亞密碼等。
(1)凱撒密碼
是一種最簡(jiǎn)單且最廣為人知的加密技術(shù)。它是一種替換加密的技術(shù),明文中的所有字母按照按順序進(jìn)行 n 個(gè)字符錯(cuò)位轉(zhuǎn)換后被替換成密文。
例:ABCDE(偏移量為3)—DEFGH
(2)柵欄密碼
把要加密的明文分成N個(gè)一組,然后把每組的第1個(gè)字連起來,形成一段無規(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ā)明的一種隱寫術(shù)。是一種替換密碼,每個(gè)明文字母被一個(gè)由5字符組成的序列替換。最初的加密方式就是由‘A’和’B'組成序列替換明文
例:明文:THE DOG
密文:baabb aabbb aabaa aaabb abbba aabba
(4)仿射密碼
仿射密碼(Affine Cipher)是一種單表代換密碼,字母表中的每個(gè)字母相應(yīng)的值使用一個(gè)簡(jiǎn)單的數(shù)學(xué)函數(shù)映射到對(duì)應(yīng)的數(shù)值,再把對(duì)應(yīng)數(shù)值轉(zhuǎn)換成字母。每一個(gè)字母都是通過函數(shù)(ax + b)mod m加密,其中B是位移量,為了保證仿射密碼的可逆性,a和m需要滿足gcd(a , m)=1,一般m為設(shè)置為26。
(5)維吉尼亞密碼
維吉尼亞密碼(又譯維熱納爾密碼)是使用一系列凱撒密碼組成密碼字母表的加密算法,屬于多表密碼的一種簡(jiǎn)單形式。以其簡(jiǎn)單易用而著稱,同時(shí)初學(xué)者通常難以破解,因而又被稱為“不可破譯的密碼”。這也讓很多人使用維吉尼亞密碼來加密的目的就是為了將其破解。
例:明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
密鑰(循環(huán)使用,密鑰越長(zhǎng)相對(duì)破解難度越大):CULTURE
加密過程:如果第一行為明文字母,第一列為密鑰字母,那么明文字母’T'列和密鑰字母’C'行的交點(diǎn)就是密文字母’V',以此類推。
密文:VBP JOZGM VCHQE JQR UNGGW QPPK NYI NUKR XFK
解密網(wǎng)站:https://www.qqxiuzi.cn/bianma/weijiniyamima.php
2,現(xiàn)代密碼學(xué)
現(xiàn)代密碼學(xué)研究信息從發(fā)端到收端的安全傳輸和安全存儲(chǔ),核心是密碼編碼學(xué)和密碼分析學(xué)。1949年香農(nóng)發(fā)表《保密系統(tǒng)的通信理論》標(biāo)志著現(xiàn)代密碼學(xué)的真正開始(第一次質(zhì)的飛躍)。1976年,Diffie和Hellman發(fā)表《密碼學(xué)的新方向》,標(biāo)志著公鑰密碼體制的誕生(第二次質(zhì)的飛躍)。
現(xiàn)代密碼學(xué)根據(jù)功能分為三類:
①、對(duì)稱加密算法:DES,AES,RC4等。
②、公鑰密碼算法:RSA等
③、HASH函數(shù):md5,sha1
(1),對(duì)稱加密算法
在對(duì)稱加密算法中,數(shù)據(jù)發(fā)信方將原始數(shù)據(jù)和加密密鑰一起經(jīng)過特殊加密算法處理后,使其變成復(fù)雜的加密密文發(fā)送出去,收信方需要使用加密用過的密鑰及相同算法的逆算法對(duì)密文進(jìn)行解密,才能使其恢復(fù)成可讀明文。在大多數(shù)的對(duì)稱算法中,加密密鑰和解密密鑰是相同的,所以也稱這種加密算法為秘密密鑰算法或單密鑰算法。它要求發(fā)送方和接收方在安全通信之前,商定一個(gè)密鑰。對(duì)稱算法的安全性依賴于密鑰,泄漏密鑰就意味著任何人都可以對(duì)他們發(fā)送或接收的消息解密,所以密鑰的保密性對(duì)通信的安全性至關(guān)重要。特點(diǎn)是算法公開、計(jì)算量小、加密速度快、加密效率高。
對(duì)稱加密的分類:流加密與分組加密
* 流加密每次加密數(shù)據(jù)流的一位(bit)或者一個(gè)字節(jié)(byte)。如RC4。
* 分組加密(通常也成為塊加密)是將明文進(jìn)行分組,加密算法對(duì)每個(gè)分組分別加密,通常明文分組和加密后得到的密文分組等長(zhǎng)。典型的分組大小是64bit或128bit。如DES,3DES,AES。
(2),HASH算法
可直接音譯為“哈希”,一般翻譯為“散列”把任意長(zhǎng)度的輸入(又叫做預(yù)映射, pre-image),通過散列算法變換成固定長(zhǎng)度的輸出,該輸出就是散列值。它是基于快速存取的角度設(shè)計(jì)的,也是一種典型的“空間換時(shí)間”的做法。顧名思義,該數(shù)據(jù)結(jié)構(gòu)可以理解為一個(gè)線性表,但是其中的元素不是緊密排列的,而是可能存在空隙。
常見HASH算法主要有MD5、SHA-1等。主要用于文件校驗(yàn),數(shù)字簽名,鑒權(quán)協(xié)議。另外這里還有一篇利用Hash碰撞而產(chǎn)生DOS攻擊的案例,有興趣的可以閱讀一下:http://www.cnblogs.com/rush/archive/2012/02/05/2339037.html
(其實(shí)把hash算法當(dāng)成是一種加密算法,這是不準(zhǔn)確的,我們知道加密總是相對(duì)于解密而言的,沒有解密何談加密呢,HASH的設(shè)計(jì)以無法解為目的的。并且如果我們不附加一個(gè)隨機(jī)的salt值,HASH口令是很容易被字典攻擊入侵的)
(3),RSA算法
RSA加密算法是一種非對(duì)稱加密算法。在公開密鑰加密和電子商業(yè)中RSA被廣泛使用,是現(xiàn)今使用最廣泛的公鑰密碼算法。和其它加密過程一樣,對(duì)RSA來說分配公鑰的過程是非常重要的。分配公鑰的過程必須能夠抵擋中間人攻擊。假設(shè)Eve交給Bob一個(gè)公鑰,并使Bob相信這是Alice的公鑰,并且她可以截下Alice和Bob之間的信息傳遞,那么她可以將她自己的公鑰傳給Bob,Bob以為這是Alice的公鑰。Eve可以將所有Bob傳遞給Alice的消息截下來,將這個(gè)消息用她自己的密鑰解密,讀這個(gè)消息,然后將這個(gè)消息再用Alice的公鑰加密后傳給Alice。理論上Alice和Bob都不會(huì)發(fā)現(xiàn)Eve在偷聽他們的消息。今天人們一般用可靠的第三方機(jī)構(gòu)簽發(fā)證書來防止這樣的攻擊。根據(jù)密鑰的使用方法,可以將密碼分為對(duì)稱密碼和公鑰密碼。
對(duì)稱密碼:加密和解密使用同一種密鑰的方式
公鑰密碼:加密和解密使用不同的密碼的方式,因此公鑰密碼通常也稱為非對(duì)稱密碼。
RSA的加密過程可以使用一個(gè)通式來表達(dá)
密文=明文^E mod N
也就是說RSA加密是對(duì)明文的E次方后除以N后求余數(shù)的過程。
從通式可知,只要知道E和N任何人都可以進(jìn)行RSA加密了,所以說E、N是RSA加密的密鑰,即E和N的組合就是公鑰,用(E,N)來表示公鑰。
RSA的解密同樣可以使用一個(gè)通式來表達(dá)
明文=密文^D mod N
即對(duì)密文進(jìn)行D次方后除以N的余數(shù)就是明文,所以D和N的組合就是私鑰,私鑰=(D,N)
RSA常見攻擊方式
①、利用rsa加密流程求參數(shù)
②、分解N求私鑰
? 如果n的大小小于256bit,那么我們通過本地工具即可爆破成功。
? 如果n在768bit或者更高,可以嘗試使用一些在線的n分解網(wǎng)站,這些網(wǎng)站會(huì)存儲(chǔ)一些已經(jīng)分解成功的n,比如:http://factordb.com
? 如果有多個(gè)n,可以嘗試用求公約數(shù)的方式來求解兩個(gè)N共同的素因子p,進(jìn)而求解q
? 在p,q的取值差異過大,或者p,q的取值過于相近的時(shí)候,F(xiàn)ormat方法與Pollard rho方法都可以很快將n分解成功。此類分解方法有一個(gè)開源項(xiàng)目yafu將其自動(dòng)化實(shí)現(xiàn)了,不論n的大小,只要p和q存在相差過大或者過近時(shí),都可以通過yafu很快地分解成功。
③、共模攻擊
如果在RSA的使用中使用了相同的模n對(duì)相同的明文m進(jìn)行了加密,那么就可以在不分解n的情況下還原出明文m的值。
http://www.bystudent.com/?p=236?
密碼學(xué)在信息技術(shù)高速發(fā)展的當(dāng)代具有很重要的意義,發(fā)展范圍廣且深。本文在寫作過程中參考了許多資料,在此一并表示感謝。同時(shí)對(duì)于文章中涉及的知識(shí)只是粗略地簡(jiǎn)要介紹,如有不當(dāng)之處還請(qǐng)指正。網(wǎng)上對(duì)密碼學(xué)還有很多的資料,大家有興趣的可以看一下。此外,文章中提到的各種解碼及解密方式都可在這個(gè)網(wǎng)站中找到相應(yīng)的工具(http://ctf.ssleye.com/)
**** 以下列出對(duì)于密碼學(xué)學(xué)習(xí)很有幫助的參考資料 ****
密碼學(xué) – 維基百科,自由的百科全書
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
代碼混淆的重要性
密碼學(xué)起源——由「凱撒加密」到「一次一密」
https://baijiahao.baidu.com/s?id=1621013260155177917&wfr=spider&for=pc
《現(xiàn)代密碼學(xué)》 – WittPeng – 博客園
https://www.cnblogs.com/WittPeng/p/8978737.html
http://archive.keyllo.com/L-編程/Code-現(xiàn)代密碼學(xué)—原理與協(xié)議.pdf
80%94%E5%8E%9F%E7%90%86%E4%B8%8E%E5%8D%8F%E8%AE%AE.pdf