CTF中那些腦洞大開的編碼和加密
0x00 前言
正文開始之前先閑扯幾句吧摩疑,玩CTF的小伙伴也許會(huì)遇到類似這樣的問題:表哥笑窜,你知道這是什么加密嗎尔当?其實(shí)CTF中腦洞密碼題(非現(xiàn)代加密方式)一般都是各種古典密碼的變形配喳,一般出題者會(huì)對(duì)密文進(jìn)行一些處理,但是會(huì)給留一些線索族淮,所以寫此文的目的是想給小伙伴做題時(shí)給一些參考辫红,當(dāng)然常在CTF里出現(xiàn)的編碼也可以了解一下凭涂。本來是想盡快寫出參考的文章,無奈期間被各種事情耽擱導(dǎo)致文章斷斷續(xù)續(xù)寫了2個(gè)月厉熟,文章肯定有許多沒有提及到,歡迎小伙伴補(bǔ)充较幌,總之揍瑟,希望對(duì)小伙伴們有幫助吧!最后歡迎小伙伴來博客玩耍:P
0x01 目錄
常見編碼:
ASCII編碼
Base64/32/16編碼
shellcode編碼
Quoted-printable編碼
XXencode編碼
UUencode編碼
URL編碼
Unicode編碼
Escape/Unescape編碼
HTML實(shí)體編碼
敲擊碼(Tap code)
莫爾斯電碼(Morse Code)
編碼的故事
各種文本加密
換位加密:
柵欄密碼(Rail-fence Cipher)
曲路密碼(Curve Cipher)
列移位密碼(Columnar Transposition Cipher)
替換加密:
埃特巴什碼(Atbash Cipher)
凱撒密碼(Caesar Cipher)
ROT5/13/18/47
簡(jiǎn)單換位密碼(Simple Substitution Cipher)
希爾密碼(Hill Cipher)
豬圈密碼(Pigpen Cipher)
波利比奧斯方陣密碼(Polybius Square Cipher)
夏多密碼(曲折加密)
普萊菲爾密碼(Playfair Cipher)
維吉尼亞密碼(Vigenère Cipher)
自動(dòng)密鑰密碼(Autokey Cipher)
博福特密碼(Beaufort Cipher)
滾動(dòng)密鑰密碼(Running Key Cipher)
Porta密碼(Porta Cipher)
同音替換密碼(Homophonic Substitution Cipher)
仿射密碼(Affine Cipher)
培根密碼(Baconian Cipher)
ADFGX和ADFGVX密碼(ADFG/VX Cipher)
雙密碼(Bifid Cipher)
三分密碼(Trifid Cipher)
四方密碼(Four-Square Cipher)
棋盤密碼(Checkerboard Cipher)
跨棋盤密碼(Straddle Checkerboard Cipher)
分組摩爾斯替換密碼(Fractionated Morse Cipher)
Bazeries密碼(Bazeries Cipher)
Digrafid密碼(Digrafid Cipher)
格朗普雷密碼(Grandpré Cipher)
比爾密碼(Beale ciphers)
鍵盤密碼(Keyboard Cipher)
其他有趣的機(jī)械密碼:
恩尼格瑪密碼
代碼混淆加密:
asp混淆加密
php混淆加密
css/js混淆加密
VBScript.Encode混淆加密
ppencode
rrencode
jjencode/aaencode
JSfuck
jother
brainfuck編程語言
相關(guān)工具
參考網(wǎng)站
0x02 正文
常見編碼
1.ASCII編碼
ASCII編碼大致可以分作三部分組成:
第一部分是:ASCII非打印控制字符(參詳ASCII碼表中0-31);
第二部分是:ASCII打印字符乍炉,也就是CTF中常用到的轉(zhuǎn)換;
第三部分是:擴(kuò)展ASCII打印字符(第一第三部分詳見ASCII碼表解釋)绢片。
編碼轉(zhuǎn)換示例
源文本:The quick brown fox jumps over the lazy dog
ASCII編碼對(duì)應(yīng)十進(jìn)制:
#!shell
84 104 101 32 113 117 105 99 107 32 98 114 111 119 110 32 102 111 120 32 106 117 109 112 115 32 111 118 101 114 32 116 104 101 32 108 97 122 121 32 100 111 103
對(duì)應(yīng)可以轉(zhuǎn)換成二進(jìn)制,八進(jìn)制岛琼,十六進(jìn)制等底循。
2.Base64/32/16編碼
base64、base32槐瑞、base16可以分別編碼轉(zhuǎn)化8位字節(jié)為6位熙涤、5位、4位困檩。16,32,64分別表示用多少個(gè)字符來編碼祠挫,這里我注重介紹base64。Base64常用于在通常處理文本數(shù)據(jù)的場(chǎng)合悼沿,表示等舔、傳輸、存儲(chǔ)一些二進(jìn)制數(shù)據(jù)糟趾。包括MIME的email慌植,email via MIME,在XML中存儲(chǔ)復(fù)雜數(shù)據(jù)。
編碼原理:Base64編碼要求把3個(gè)8位字節(jié)轉(zhuǎn)化為4個(gè)6位的字節(jié)义郑,之后在6位的前面補(bǔ)兩個(gè)0蝶柿,形成8位一個(gè)字節(jié)的形式,6位2進(jìn)制能表示的最大數(shù)是2的6次方是64非驮,這也是為什么是64個(gè)字符(A-Z,a-z只锭,0-9,+院尔,/這64個(gè)編碼字符蜻展,=號(hào)不屬于編碼字符,而是填充字符)的原因邀摆,這樣就需要一張映射表纵顾,如下:
舉個(gè)例子(base64):
源文本:T h e
對(duì)應(yīng)ascii碼:84 104 101
8位binary:01010100 01101000 01100101
6位binary:010101 000110 100001 100101
高位補(bǔ)0:000010101 00000110 00100001 00100101
對(duì)應(yīng)ascii碼:21 6 33 37
查表:V G h l
利用Python base64模塊,我們分別可以這樣加密解密base64 32 16:
3.shellcode編碼
源文本:The quick brown fox jumps over the lazy dog
編碼后:
#!shell
\x54\x68\x65\x7f\x71\x75\x69\x63\x6b\x7f\x62\x72\x6f\x77\x6e\x7f\x66\x6f\x78\x7f\x6a\x75\x6d\x70\x73\x7f\x6f\x76\x65\x72\x7f\x74\x68\x65\x7f\x6c\x61\x7a\x79\x7f\x64\x6f\x67
4.Quoted-printable 編碼
它是多用途互聯(lián)網(wǎng)郵件擴(kuò)展(MIME) 一種實(shí)現(xiàn)方式栋盹。有時(shí)候我們可以郵件頭里面能夠看到這樣的編碼施逾,編碼原理參考。
源文本:敏捷的棕色狐貍跳過了懶惰的狗
編碼后:
#!shell
=E6=95=8F=E6=8D=B7=E7=9A=84=E6=A3=95=E8=89=B2=E7=8B=90=E7=8B=B8=E8=B7=B3=E8
=BF=87=E4=BA=86=E6=87=92=E6=83=B0=E7=9A=84=E7=8B=97
編碼解碼鏈接
5.XXencode編碼
XXencode將輸入文本以每三個(gè)字節(jié)為單位進(jìn)行編碼。如果最后剩下的資料少于三個(gè)字節(jié)汉额,不夠的部份用零補(bǔ)齊曹仗。這三個(gè)字節(jié)共有24個(gè)Bit,以6bit為單位分為4個(gè)組蠕搜,每個(gè)組以十進(jìn)制來表示所出現(xiàn)的數(shù)值只會(huì)落在0到63之間怎茫。以所對(duì)應(yīng)值的位置字符代替。它所選擇的可打印字符是:+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz妓灌,一共64個(gè)字符轨蛤。跟base64打印字符相比,就是UUencode多一個(gè)“-” 字符虫埂,少一個(gè)”/” 字符祥山。
源文本:The quick brown fox jumps over the lazy dog
編碼后:hJ4VZ653pOKBf647mPrRi64NjS0-eRKpkQm-jRaJm65FcNG-gMLdt64FjNkc+
編碼解碼鏈接
6.UUencode編碼
UUencode是一種二進(jìn)制到文字的編碼,最早在unix 郵件系統(tǒng)中使用掉伏,全稱:Unix-to-Unix encoding缝呕,UUencode將輸入文本以每三個(gè)字節(jié)為單位進(jìn)行編碼,如果最后剩下的資料少于三個(gè)字節(jié)斧散,不夠的部份用零補(bǔ)齊岳颇。三個(gè)字節(jié)共有24個(gè)Bit,以6-bit為單位分為4個(gè)組颅湘,每個(gè)組以十進(jìn)制來表示所出現(xiàn)的字節(jié)的數(shù)值话侧。這個(gè)數(shù)值只會(huì)落在0到63之間。然后將每個(gè)數(shù)加上32闯参,所產(chǎn)生的結(jié)果剛好落在ASCII字符集中可打印字符(32-空白…95-底線)的范圍之中瞻鹏。
源文本:The quick brown fox jumps over the lazy dog
編碼后:M5&AE('%U:6-K(&)R;W=N(&9O>"!J=6UP
編碼解碼鏈接
7.URL編碼
url編碼又叫百分號(hào)編碼,是統(tǒng)一資源定位(URL)編碼方式鹿寨。URL地址(常說網(wǎng)址)規(guī)定了常用地?cái)?shù)字新博,字母可以直接使用,另外一批作為特殊用戶字符也可以直接用(/,:@等)脚草,剩下的其它所有字符必須通過%xx編碼處理赫悄。 現(xiàn)在已經(jīng)成為一種規(guī)范了,基本所有程序語言都有這種編碼馏慨,如js:有encodeURI埂淮、encodeURIComponent,PHP有 urlencode写隶、urldecode等倔撞。編碼方法很簡(jiǎn)單,在該字節(jié)ascii碼的的16進(jìn)制字符前面加%. 如 空格字符慕趴,ascii碼是32痪蝇,對(duì)應(yīng)16進(jìn)制是'20'鄙陡,那么urlencode編碼結(jié)果是:%20。
源文本:The quick brown fox jumps over the lazy dog
編碼后:
#!shell
%54%68%65%20%71%75%69%63%6b%20%62%72%6f%77%6e%20%66%6f%78%20%6a%75%6d%70%73%20%6f%76%65%72%20%74%68%65%20%6c%61%7a%79%20%64%6f%67
編碼解碼鏈接
8.Unicode編碼
Unicode編碼有以下四種編碼方式:
源文本:The
&#x [Hex]:The
&# [Decimal]:The
\U [Hex]:\U0054\U0068\U0065
\U+ [Hex]:\U+0054\U+0068\U+0065
編碼解碼鏈接
9.Escape/Unescape編碼
Escape/Unescape加密解碼/編碼解碼,又叫%u編碼躏啰,采用UTF-16BE模式趁矾, Escape編碼/加密,就是字符對(duì)應(yīng)UTF-16 16進(jìn)制表示方式前面加%u。Unescape解碼/解密给僵,就是去掉"%u"后毫捣,將16進(jìn)制字符還原后,由utf-16轉(zhuǎn)碼到自己目標(biāo)字符想际。如:字符“中”培漏,UTF-16BE是:“6d93”溪厘,因此Escape是“%u6d93”胡本。
源文本:The
編碼后:%u0054%u0068%u0065
10.HTML實(shí)體編碼
完整編碼手冊(cè)參考
11.敲擊碼
敲擊碼(Tap code)是一種以非常簡(jiǎn)單的方式對(duì)文本信息進(jìn)行編碼的方法。因該編碼對(duì)信息通過使用一系列的點(diǎn)擊聲音來編碼而命名畸悬,敲擊碼是基于5×5方格波利比奧斯方陣來實(shí)現(xiàn)的侧甫,不同點(diǎn)是是用K字母被整合到C中。
敲擊碼表:
#!shell
1? 2? 3? 4? 5
1 A? B C/K D? E
2 F? G? H? I? J
3 L? M? N? O? P
4 Q? R? S? T? U
5 V? W? X? Y? Z
12.莫爾斯電碼
摩爾斯電碼(Morse Code)是由美國(guó)人薩繆爾·摩爾斯在1836年發(fā)明的一種時(shí)通時(shí)斷的且通過不同的排列順序來表達(dá)不同英文字母蹋宦、數(shù)字和標(biāo)點(diǎn)符號(hào)的信號(hào)代碼披粟,摩爾斯電碼主要由以下5種它的代碼組成:
點(diǎn)(.)
劃(-)
每個(gè)字符間短的停頓(通常用空格表示停頓)
每個(gè)詞之間中等的停頓(通常用/劃分)
以及句子之間長(zhǎng)的停頓
摩爾斯電碼字母和數(shù)字對(duì)應(yīng)表:
#!shell
A? .-? ? N? -.? ? .? .-.-.-? +? .-.-.? ? 1? .----
B? -...? O? ---? ,? --..--? _? ..--.-? 2? ..---
C? -.-.? P? .--.? :? ---...? $? ...-..-? 3? ...--
D? -..? Q? --.-? "? .-..-.? &? .-...? ? 4? ....-
E? .? ? R? .-.? '? .----.? /? -..-.? ? 5? .....
F? ..-.? S? ...? !? -.-.--? ? ? ? ? ? ? 6? -....
G? --.? T? -? ? ?? ..--..? ? ? ? ? ? ? 7? --...
H? ....? U? ..-? @? .--.-.? ? ? ? ? ? ? 8? ---..
I? ..? ? V? ...-? -? -....-? ? ? ? ? ? ? 9? ----.
J? .---? W? .--? ;? -.-.-.? ? ? ? ? ? ? 0? -----
K? -.-? X? -..-? (? -.--.
L? .-..? Y? -.--? )? -.--.-
M? --? ? Z? --..? =? -...-
源文本:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
編碼后:
#!shell
- .... . / --.- ..- .. -.-. -.- / -... .-. --- .-- -. / ..-. --- -..- / .--- ..- -- .--. ... / --- ...- . .-. / - .... . / .-.. .- --.. -.-- / -.. --- --.
在線編碼解碼傳送門
摩爾斯電碼除了能對(duì)字母數(shù)字編碼以外還對(duì)一些標(biāo)點(diǎn)符號(hào),非英語字符進(jìn)行了編碼冷冗,而且還有一些特定意義的組合稱為特殊符號(hào)守屉,比如·-·-·-·-·-表達(dá)的意思是調(diào)用信號(hào),表示“我有消息發(fā)送”蒿辙。如果你感興趣可以參考WiKi拇泛。
13.編碼的故事
推薦大家去看編碼的故事一文。
各種文本加密
文本加密可以將正常文本內(nèi)容打亂為不可連讀的文字或符號(hào)(漢字 數(shù)字 字母 音樂符號(hào) 國(guó)際音標(biāo) 盲文 韓文 日文 傣文 彝文 箭頭符號(hào) 花朵符號(hào) 俄文)思灌,換行等格式信息也會(huì)被清除俺叭,達(dá)到加密的作用。在進(jìn)行文本加密時(shí)可以設(shè)定一個(gè)密碼泰偿,這樣只有知道密碼的人才能解密文本熄守。密碼可以是數(shù)字、字母和下劃線耗跛,最多九位裕照。
加密示例:
源文本:敏捷的棕色狐貍跳過了懶惰的狗
編碼解碼鏈接
換位加密
1.柵欄密碼
(1)介紹
柵欄密碼(Rail-fence Cipher)就是把要加密的明文分成N個(gè)一組,然后把每組的第1個(gè)字符組合调塌,每組第2個(gè)字符組合...每組的第N(最后一個(gè)分組可能不足N個(gè))個(gè)字符組合牍氛,最后把他們?nèi)窟B接起來就是密文,這里以2欄柵欄加密為例烟阐。
明文: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
第一組:Teucbonojmsvrhlzdg
第二組:hqikrwfxupoeteayo
密文:Teucbonojmsvrhlzdghqikrwfxupoeteayo
加解密傳送門
2.曲路密碼
曲路密碼(Curve Cipher)是一種換位密碼搬俊,需要事先雙方約定密鑰(也就是曲路路徑)紊扬。
明文:The quick brown fox jumps over the lazy dog
填入5行7列表(事先約定填充的行列數(shù))
加密的回路線(事先約定填充的行列數(shù))
密文:gesfc inpho dtmwu qoury zejre hbxva lookT
3.列移位密碼
(1)介紹
列移位密碼(Columnar Transposition Cipher)是一種比較簡(jiǎn)單,易于實(shí)現(xiàn)的換位密碼唉擂,通過一個(gè)簡(jiǎn)單的規(guī)則將明文打亂混合成密文餐屎。下面我們以明文 The quick brown fox jumps over the lazy dog,密鑰 how are u為例:
填入5行7列表(事先約定填充的行列數(shù)玩祟,如果明文不能填充完表格可以約定使用某個(gè)字母進(jìn)行填充)
密鑰:how are u
按how are u在字母表中的出現(xiàn)的先后順序進(jìn)行編號(hào)腹缩,我們就有a為1,e為2,h為3空扎,o為4藏鹊,r為5,u為6转锈,w為7盘寡,所以先寫出a列,其次e列撮慨,以此類推寫出的結(jié)果便是密文:
密文:qoury inpho Tkool hbxva uwmtd cfseg erjez
這里提供一個(gè)行列數(shù)相等的填充規(guī)則列移位密碼加解密鏈接
另外由列移位密碼變化來的密碼也有其他的竿痰,比如Amsco密碼(Amsco Cipher)和Cadenus密碼(Cadenus Cipher)。
替換加密
1.埃特巴什碼
(1)介紹
埃特巴什碼(Atbash Cipher)是一種以字母倒序排列作為特殊密鑰的替換加密砌溺,也就是下面的對(duì)應(yīng)關(guān)系:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ZYXWVUTSRQPONMLKJIHGFEDCBA
明文:the quick brown fox jumps over the lazy dog
密文:gsv jfrxp yildm ulc qfnkh levi gsv ozab wlt
加解密傳送門
2.凱撒密碼
(1)介紹
凱撒密碼(Caesar Cipher或稱愷撒加密影涉、愷撒變換、變換加密规伐、位移加密)是一種替換加密蟹倾,明文中的所有字母都在字母表上向后(或向前)按照一個(gè)固定數(shù)目進(jìn)行偏移后被替換成密文。例猖闪,當(dāng)偏移量是3的時(shí)候鲜棠,所有的字母A將被替換成D,B變成E萧朝,以此類推岔留,更多參考。
加密實(shí)例:
明文:The quick brown fox jumps over the lazy dog
偏移量:1
密文:Uif rvjdl cspxo gpy kvnqt pwfs uif mbaz eph
你也可以使用Python的pycipher模塊來加解密检柬,如果提示沒有這個(gè)模塊可以通過pip install pycipher或者其他方式來安裝pycipher模塊献联。
#!python
>>> from pycipher import Caesar
>>> Caesar(key=1).encipher('The quick brown fox jumps over the lazy dog')
'UIFRVJDLCSPXOGPYKVNQTPWFSUIFMBAZEPH'
>>> Caesar(key=1).decipher('UIFRVJDLCSPXOGPYKVNQTPWFSUIFMBAZEPH')
'THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG'
參考表(這里是向后移位加密,向前移位解密):
加密解密鏈接(這個(gè)網(wǎng)站可以將26種情況一次性列舉出來何址,比較方便)
3.ROT5/13/18/47
(1)介紹
ROT5/13/18/47是一種簡(jiǎn)單的碼元位置順序替換暗碼里逆。此類編碼具有可逆性,可以自我解密用爪,主要用于應(yīng)對(duì)快速瀏覽原押,或者是機(jī)器的讀取。
ROT5 是 rotate by 5 places 的簡(jiǎn)寫偎血,意思是旋轉(zhuǎn)5個(gè)位置诸衔,其它皆同盯漂。下面分別說說它們的編碼方式:
ROT5:只對(duì)數(shù)字進(jìn)行編碼,用當(dāng)前數(shù)字往前數(shù)的第5個(gè)數(shù)字替換當(dāng)前數(shù)字笨农,例如當(dāng)前為0就缆,編碼后變成5,當(dāng)前為1谒亦,編碼后變成6竭宰,以此類推順序循環(huán)。
ROT13:只對(duì)字母進(jìn)行編碼份招,用當(dāng)前字母往前數(shù)的第13個(gè)字母替換當(dāng)前字母切揭,例如當(dāng)前為A,編碼后變成N锁摔,當(dāng)前為B廓旬,編碼后變成O,以此類推順序循環(huán)鄙漏。
ROT18:這是一個(gè)異類嗤谚,本來沒有棺蛛,它是將ROT5和ROT13組合在一起怔蚌,為了好稱呼,將其命名為ROT18旁赊。
ROT47:對(duì)數(shù)字桦踊、字母、常用符號(hào)進(jìn)行編碼终畅,按照它們的ASCII值進(jìn)行位置替換籍胯,用當(dāng)前字符ASCII值往前數(shù)的第47位對(duì)應(yīng)字符替換當(dāng)前字符,例如當(dāng)前為小寫字母z离福,編碼后變成大寫字母K杖狼,當(dāng)前為數(shù)字0,編碼后變成符號(hào)_妖爷。用于ROT47編碼的字符其ASCII值范圍是33-126蝶涩,具體可參考ASCII編碼,下面以rot13以例絮识。
明文:the quick brown fox jumps over the lazy dog
密文:gur dhvpx oebja sbk whzcf bire gur ynml qbt
4.簡(jiǎn)單替換密碼
(1)介紹
簡(jiǎn)單換位密碼(Simple Substitution Cipher)加密方式是以每個(gè)明文字母被與之唯一對(duì)應(yīng)且不同的字母替換的方式實(shí)現(xiàn)的绿聘,它不同于愷撒密碼,因?yàn)槊艽a字母表的字母不是簡(jiǎn)單的移位次舌,而是完全是混亂的熄攘。 比如:
#!shell
明文字母 : abcdefghijklmnopqrstuvwxyz
明文字母 : phqgiumeaylnofdxjkrcvstzwb
明文:the quick brown fox jumps over the lazy dog
密文:cei jvaql hkdtf udz yvoxr dsik cei npbw gdm
(2)破解
當(dāng)密文數(shù)據(jù)足夠多時(shí)這種密碼我們可以通過字頻分析方法破解或其他方法破解娃惯,比較好的在線詞頻分析網(wǎng)站http://quipqiup.com/index.php(翻= =墻)屿储,這里推薦一篇通過"爬山算法"來破解簡(jiǎn)單替換密碼文章,基于文中的算法實(shí)現(xiàn)的工具來破解示例。
密文:
#!shell
pmpafxaikkitprdsikcplifhwceigixkirradfeirdgkipgigudkcekiigpwrpucikceiginasikwduearrxiiqepcceindgmieinpwdfprduppcedoikiqiasafmfddfipfgmdafmfdteiki
解密:
(ps:score值越小越準(zhǔn)確)
密鑰:PHQGIUMEAVLNOFDXBKRCZSTJWY
明文:
#!shell
AGAINPIERREWASOVERTAKENBYTHEDEPRESSIONHESODREADEDFORTHREEDAYSAFTERTHEDELIVERYOFHISSPEECHATTHELODGEHELAYONASOFAATHOMERECEIVINGNOONEANDGOINGNOWHERE
將明文轉(zhuǎn)換成可讀句子:
again pierre was over taken by the depression he so dreaded for three day safter the delivery of his speech at the lodge he lay on a sofa at home receiving no one and going no where
5.希爾密碼
(1)介紹
希爾密碼(Hill Cipher)是基于線性代數(shù)多重代換密碼如输,由Lester S. Hill在1929年發(fā)明。每個(gè)字母轉(zhuǎn)換成26進(jìn)制數(shù)字:A=0, B=1, C=2...Z=25一串字母當(dāng)成n維向量秘豹,跟一個(gè)n×n的矩陣相乘骤肛,再將得出的結(jié)果MOD26。更多參考
(2)加密
明文:ACT
明文對(duì)應(yīng)矩陣:
加密密鑰:GYBNQKURP
加密矩陣:
計(jì)算過程:
密文:FIN
(3)解密
密文:FIN
計(jì)算加密矩陣的逆矩陣:
解密計(jì)算:
明文:ACT
至于證明和求逆可以參考線性代數(shù)知識(shí)也殖。
(4)破解
密碼分析一門破解編碼和密碼的藝術(shù)土思。當(dāng)我們嘗試去攻破希爾密碼你會(huì)發(fā)現(xiàn)頻率分析實(shí)際上沒有什么用處,特別在密鑰長(zhǎng)度增多的情況下忆嗜。對(duì)于較長(zhǎng)的二元矩陣(2×2的希爾密碼)頻率分析可能可能會(huì)有幫助己儒,但是對(duì)于較短的密文分析是沒有實(shí)際作用的。
這里推薦一篇關(guān)于用已知明文樣本攻擊的方式破解希爾密碼的文章捆毫,基礎(chǔ)的希爾密碼用已知明文攻擊的方式是可攻破的闪湾,由于加密完全是線性的,所以攻擊者在截取到部分明文/密文字符對(duì)可以輕松建立一個(gè)線性系統(tǒng)绩卤,輕松搞定希爾密碼途样,如果不能完全確定線性系統(tǒng),那么只需要添加部分明文/密文對(duì)即可濒憋。已知明文攻擊時(shí)最好的方式去破解寫入密碼何暇,如果明文一無所知,那就進(jìn)行推測(cè)猜出部分明文凛驮●烧荆基于已知明文樣本攻擊的方式破解希爾密碼的算法的實(shí)現(xiàn)工具破解示例:
密文:
#!shell
XUKEXWSLZJUAXUNKIGWFSOZRAWURORKXAOSLHROBXBTKCMUWDVPTFBLMKEFVWMUXTVTWUIDDJVZKBRMCWOIWYDXMLUFPVSHAGSVWUFWORCWUIDUJCNVTTBERTUNOJUZHVTWKORSVRZSVVFSQXOCMUWPYTRLGBMCYPOJCLRIYTVFCCMUWUFPOXCNMCIWMSKPXEDLYIQKDJWIWCJUMVRCJUMVRKXWURKPSEEIWZVXULEIOETOOFWKBIUXPXUGOWLFPWUSCH
解密:
在線加解密傳送門
6.豬圈密碼
(1)介紹
豬圈密碼(Pigpen Cipher或稱九宮格密碼、朱高密碼黔夭、共濟(jì)會(huì)密碼或共濟(jì)會(huì)員密碼)宏胯,是一種以格子為基礎(chǔ)的簡(jiǎn)單替代式密碼。更多參考
明文字母和對(duì)應(yīng)密文:
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
密文:
在線加密傳送門
(2)變種
圣堂武士密碼(Templar Cipher)是共濟(jì)會(huì)的“豬圈密碼”的一個(gè)變種本姥,一直被共濟(jì)會(huì)圣殿騎士用肩袍。
明文字母和對(duì)應(yīng)密文:
(3)其他變種
明文字母和對(duì)應(yīng)密文:
明文字母和對(duì)應(yīng)密文:
明文字母和對(duì)應(yīng)密文:
7.波利比奧斯方陣密碼
(1)介紹
波利比奧斯方陣密碼(Polybius Square Cipher或稱波利比奧斯棋盤)是棋盤密碼的一種,是利用波利比奧斯方陣進(jìn)行加密的密碼方式婚惫,簡(jiǎn)單的來說就是把字母排列好氛赐,用坐標(biāo)(行列)的形式表現(xiàn)出來。字母是密文辰妙,明文便是字母的坐標(biāo)鹰祸。更多參考
常見的排布方式:
加密實(shí)例:
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
密文:442315 4145241325 1242345233 213453 2445323543 442315 31115554 143422
8.夏多密碼(曲折加密)
(1)介紹
夏多密碼是作者麥克斯韋·格蘭特在中篇小說《死亡之鏈》塑造夏多這一英雄人物中所自創(chuàng)的密碼,如下圖所示:
注意密浑,在以上所示的字母表密鑰的底部蛙婴,列有四個(gè)附加符號(hào)1,2尔破,3街图,4.他們可以放在密文中的任何地方浇衬。每個(gè)附加符號(hào)指示,如何轉(zhuǎn)動(dòng)寫有密文的紙張餐济,再進(jìn)行后續(xù)的加密或解密操作耘擂,直到出現(xiàn)另一個(gè)附加符號(hào)⌒跄罚可以把每個(gè)附加符號(hào)中的那根線看作是指示針醉冤,它指示了紙張的上端朝上,朝右篙悯,朝下蚁阳,朝左。比如說:如果出現(xiàn)符號(hào)3鸽照,那么紙張就應(yīng)該轉(zhuǎn)動(dòng)180度螺捐,使其上端朝下; 符號(hào)2表示紙張上端朝右矮燎,依次類推定血。
源文本:I AM IN DANGER SEND HELP(我有危險(xiǎn),速來增援)
密文:
9.普萊菲爾密碼
普萊菲爾密碼(Playfair Cipher)是第一種用于實(shí)際的雙字替換密碼诞外,用雙字加密取代了簡(jiǎn)單代換密碼的單字加密澜沟,很明顯這樣使得密文更難破譯,因?yàn)槭褂煤?jiǎn)單替換密碼的頻率分析基本沒有什么作用浅乔,雖然頻率分析倔喂,通常仍然可以進(jìn)行铝条,但是有25×25=625種可能而不是25種可能靖苇,可以分為三個(gè)步驟,即編制密碼表班缰、整理明文贤壁、編寫譯文,下面我們以明文:
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG和密鑰CULTURE為例來講解埠忘。普萊菲爾密碼又稱為單方密碼(Single Cipher)之后又出現(xiàn)它的升級(jí)版Double Playfair脾拆,也就是二方密碼(Two-square Cipher),在之后又有四方密碼(Four-square Cipher)
(1)編制密碼表
1.整理密鑰字母C U L T U R E,去掉后面重復(fù)的字母得到:C U L T R E
2.用上一步得到的字母自上而下來填補(bǔ)5乘5方表的縱列(也可橫排)莹妒,之后的空白按照相同的順序用字母表中剩余的字母依次填補(bǔ)完整名船,得到如下的方格:
這一步需要注意的要點(diǎn):整理密鑰字母時(shí),如果出現(xiàn)"Z"旨怠,則需要去除渠驼,因?yàn)樵谟⑽睦?Z"的使用頻率最低,相應(yīng)的如果是德文鉴腻,則需將"I"與"J"當(dāng)作一個(gè)字母來看待迷扇,而法語則去掉"W"或"K"百揭。
(2)整理明文
我們要遵循的原則是“兩個(gè)一組”,得到是若干個(gè)兩兩成對(duì)的字母段蜓席,用到的是明文THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG與字母"X":
1.將明文兩兩一組按順序排開器一,得到:TH EQ UI CK BR OW NF OX JU MP SO VE RT HE LA ZY DO G
2.對(duì)于末尾的單個(gè)字母要加上一個(gè)"X"使之成對(duì):TH EQ UI CK BR OW NF OX JU MP SO VE RT HE LA ZY DO GX
這一步需要注意的要點(diǎn):對(duì)于相連字母相同者,每個(gè)后面都需要加"X"厨内,例如TOMORROW祈秕,需要寫成:TO MO RX RX OW。
(3)編寫密文
我們要得到的密文雏胃,當(dāng)然踢步,對(duì)于每個(gè)字母對(duì),要嚴(yán)格遵循如下的原則:
1.如果兩個(gè)字母在同一行則要用它右鄰的字母替換丑掺,如果已在最右邊获印,則用該行最左邊的替換,如明文為"CE"街州,依據(jù)上表兼丰,應(yīng)替換為"EG";
2.如果兩個(gè)字母在同一列則要用它下邊的字母替換唆缴,如果已在最下邊鳍征,則用該行最上邊的替換,如明文為"OQ"面徽,依據(jù)上表艳丛,應(yīng)替換為"PS";
3.如果兩個(gè)字母在不同的行或列趟紊,則應(yīng)在密碼表中找兩個(gè)字母使四個(gè)字母組成一個(gè)矩形氮双,明文占據(jù)兩個(gè)頂點(diǎn),需用另外兩個(gè)頂點(diǎn)的字母替換霎匈,如明文為"HX"戴差,可以替換為"WI/J"或"I/JW"(下面的例子將按照橫向替換原則即同行優(yōu)先)。
按照上述原則铛嘱,將明文TH EQ UI CK BR OW NF OX JU MP SO VE RT HE LA ZY DO GX加以轉(zhuǎn)換得到KU ND LH GT LF WU ES PW LH SI/J NP CG CR AG BU VZ QA I/JV(/表示或者暖释,不過一般用I不用J,所以分析密文時(shí)你看25個(gè)字母都有而只差一個(gè)字母沒有用到可以考慮一下這種加密方式)將得到的字母改為大寫并五個(gè)一組列好墨吓,得到密文KUNDL HGTLF WUESP WLHSI NPCGC RAGBU VZQAI V球匕。
加密解密傳送門(ps:這里加解密是橫向編制密碼表)
加密解密實(shí)例(ps:這里加解密也是橫向編制密碼表):
#!python
>>>from pycipher import Playfair
>>>Playfair('CULTREABDFGHIKMNOPQSVWXYZ').encipher('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG')
'UKDNLHTGFLWUSEPWHLISNPCGCRGAUBVZAQIV'
>>>Playfair('CULTREABDFGHIKMNOPQSVWXYZ').decipher('UKDNLHTGFLWUSEPWHLISNPCGCRGAUBVZAQIV')
'THEQUICKBROWNFOXIUMPSOVERTHELAZYDOGX'
10.維吉尼亞密碼
(1)介紹
維吉尼亞密碼(Vigenère Cipher)是在單一愷撒密碼的基礎(chǔ)上擴(kuò)展出多表代換密碼,根據(jù)密鑰(當(dāng)密鑰長(zhǎng)度小于明文長(zhǎng)度時(shí)可以循環(huán)使用)來決定用哪一行的密表來進(jìn)行替換帖烘,以此來對(duì)抗字頻統(tǒng)計(jì)亮曹,更多參考。
密表:
明文: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
(2)已知密鑰加解密
#!python
>>>from pycipher import Vigenere
>>>Vigenere('CULTURE').encipher('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG')
'VBPJOZGMVCHQEJQRUNGGWQPPKNYINUKRXFK'
>>>Vigenere('CULTURE').decipher('VBPJOZGMVCHQEJQRUNGGWQPPKNYINUKRXFK')
'THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG'
在線加密解密傳送門
(3)未知密鑰破解
可以參考維吉尼亞密碼分析這篇文章衷佃,破解維吉尼亞密碼第一步是確定密鑰長(zhǎng)度,維吉尼亞密碼分析這篇文章里介紹了使用重合指數(shù)算法來確定密鑰長(zhǎng)度蹄葱,在確定密鑰長(zhǎng)度后就可以嘗試確定密鑰氏义,通常我們可以使用卡方檢驗(yàn)來找到每個(gè)字母的偏移量,基于維吉尼亞密碼分析一文中的算法實(shí)現(xiàn)的工具破解示例图云。
密文:kiqpbkxspshwehospzqhoinlgapp
解密:
(ps:結(jié)合左邊的值惯悠,密鑰以及解出明文可以確定kien 5或者klen 10為準(zhǔn)確的結(jié)果)
明文:DEFEND THE EAST WALL OF THE CASTLE
(4)變種
有幾種密碼和維吉尼亞密碼相似,格羅斯費(fèi)爾德密碼(Gronsfeld cipher)實(shí)際上和維吉尼亞密碼相同竣况,除了使用了數(shù)字來代替字母以外沒有什么區(qū)別克婶。數(shù)字可以選擇一種數(shù)列,如斐波那契數(shù)列丹泉,或者一些其他的偽隨機(jī)序列情萤。格羅斯費(fèi)爾德密碼密碼分析過程和維吉尼亞密碼大同小異,不過摹恨,自動(dòng)密鑰密碼不能使用卡西斯基算法(kasiski)來破譯筋岛,因?yàn)樽詣?dòng)密鑰密碼的密鑰不重復(fù)循環(huán)使用,破譯自動(dòng)密鑰密碼最好的方法的就是從密文不斷嘗試和猜測(cè)其中明文或密鑰的一部分晒哄。
#!python
>>>from pycipher import Gronsfeld
>>>Gronsfeld([2,20,11,45,20,43,4]).encipher('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG')
'VBPJOZGMVCHQEJQRUNGGWQPPKNYINUKRXFK'
>>>Gronsfeld([2,20,11,45,20,43,4]).decipher('VBPJOZGMVCHQEJQRUNGGWQPPKNYINUKRXFK')
'THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG'
在線加解密傳送門
11.自動(dòng)密鑰密碼
(1)介紹
自動(dòng)密鑰密碼(Autokey Cipher)是多表替換密碼睁宰,與維吉尼亞密碼密切相關(guān),但使用不同的方法生成密鑰寝凌,通常來說要比維吉尼亞密碼更安全柒傻。自動(dòng)密鑰密碼主要有兩種,關(guān)鍵詞自動(dòng)密鑰密碼和原文自動(dòng)密鑰密碼.下面我們以關(guān)鍵詞自動(dòng)密鑰為例:
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
關(guān)鍵詞:CULTURE
自動(dòng)生成密鑰:CULTURE THE QUICK BROWN FOX JUMPS OVER THE
接下來的加密過程和維吉尼亞密碼類似硫兰,從密表可得:
密文:VBP JOZGD IVEQV HYY AIICX CSNL FWW ZVDP WVK
(2)已知關(guān)鍵詞加解密
#!python
>>>from pycipher import Autokey
>>>Autokey('CULTURE').encipher('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG')
'VBPJOZGDIVEQVHYYAIICXCSNLFWWZVDPWVK'
>>>Autokey('CULTURE').decipher('VBPJOZGDIVEQVHYYAIICXCSNLFWWZVDPWVK')
'THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG'
在線加解密傳送門
(3)未知關(guān)鍵詞破解
推薦去看這篇自動(dòng)密鑰密碼分析文章诅愚,基于文中的算法實(shí)現(xiàn)的工具來破解示例。
密文:
#!shell
isjiqymdebvuzrvwhmvysibugzhyinmiyeiklcvioimbninyksmmnjmgalvimlhspjxmgfiraqlhjcpvolqmnyynhpdetoxemgnoxl
解密
(ps:從klen 13可以看出使用的關(guān)鍵詞為'FORTIFICATION')
明文:
#!shell
DESPITEBEINGMORESECURETHANTHEVIGENERECIPHERTHEAUTOKEYCIPHERISSTILLVERYEASYTOBREAKUSINGAUTOMATEDMETHODS
將明文轉(zhuǎn)換成可讀句子:
despite being more secure than the vigenere cipher the autokey cipher is still very easy to break using automated methods
12.博福特密碼
(1)介紹
博福特密碼(Beaufort Cipher)劫映,是一種類似于維吉尼亞密碼的代換密碼,由弗朗西斯·蒲福(Francis Beaufort)發(fā)明刹前。它最知名的應(yīng)用是Hagelin M-209密碼機(jī)泳赋。博福特密碼屬于對(duì)等加密,即加密演算法與解密演算法相同喇喉。
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
密鑰(循環(huán)使用祖今,密鑰越長(zhǎng)相對(duì)破解難度越大):CULTURE
加密過程:如果第一行為明文字母,第一列為密文字母,那么沿明文字母'T'列出現(xiàn)密鑰字母'C'的行號(hào)就是密文字母'J'千诬,以此類推耍目。
密文:JNH DAJCS TUFYE ZOX CZICM OZHC BKA RUMV RDY
(2)已知密鑰加解密
#!python
>>>from pycipher import Beaufort
>>>Beaufort('CULTURE').encipher('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG')
'JNHDAJCSTUFYEZOXCZICMOZHCBKARUMVRDY'
>>>Beaufort('CULTURE').decipher('JNHDAJCSTUFYEZOXCZICMOZHCBKARUMVRDY')
'THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG'
在線加解密傳送門
13.滾動(dòng)密鑰密碼
(1)介紹
滾動(dòng)密鑰密碼(Running Key Cipher)和維吉尼亞密碼有著相同的加密機(jī)制,區(qū)別是密鑰的選取徐绑,維吉尼亞使用的密鑰簡(jiǎn)短邪驮,而且重復(fù)循環(huán)使用,與之相反傲茄,滾動(dòng)密鑰密碼使用很長(zhǎng)的密鑰毅访,比如引用一本書作為密鑰。這樣做的目的是不重復(fù)循環(huán)使用密鑰盘榨,使密文更難破譯喻粹,盡管如此,滾動(dòng)密鑰密碼還是可以被攻破草巡,因?yàn)橛嘘P(guān)于密鑰和明文的統(tǒng)計(jì)分析模式可供利用守呜,如果滾動(dòng)密鑰密碼使用統(tǒng)計(jì)上的隨機(jī)密鑰來源,那么理論上是不可破譯的山憨,因?yàn)槿魏慰赡芏伎梢猿蔀槊荑€弛饭,并且所有的可能性都是相等的。
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
密鑰:選取C語言編程(1978版)第63頁(yè)第1行"errors can occur in several places. A label has..."萍歉,去掉非字母部分作為密鑰(實(shí)際選取的密鑰很長(zhǎng)侣颂,長(zhǎng)度至少不小于明文長(zhǎng)度)。
加密過程:加密過程和維吉尼亞密碼加密過程相同
密文:XYV ELAEK OFQYH WWK BYHTJ OGTC TJI DAK YESR
已知密鑰在線加解密傳送門
14.Porta密碼
(1)介紹
Porta密碼(Porta Cipher)是一個(gè)由意大利那不勒斯的醫(yī)生Giovanni Battista della Porta發(fā)明的多表代換密碼枪孩,Porta密碼具有加密解密過程的是相同的特點(diǎn)憔晒。
密表:
#!shell
KEYS| 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
----|----------------------------------------------------
A,B | N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
C,D | O P Q R S T U V W X Y Z N M A B C D E F G H I J K L
E,F | P Q R S T U V W X Y Z N O L M A B C D E F G H I J K
G,H | Q R S T U V W X Y Z N O P K L M A B C D E F G H I J
I,J | R S T U V W X Y Z N O P Q J K L M A B C D E F G H I
K,L | S T U V W X Y Z N O P Q R I J K L M A B C D E F G H
M,N | T U V W X Y Z N O P Q R S H I J K L M A B C D E F G
O,P | U V W X Y Z N O P Q R S T G H I J K L M A B C D E F
Q,R | V W X Y Z N O P Q R S T U F G H I J K L M A B C D E
S,T | W X Y Z N O P Q R S T U V E F G H I J K L M A B C D
U,V | X Y Z N O P Q R S T U V W D E F G H I J K L M A B C
W,X | Y Z N O P Q R S T U V W X C D E F G H I J K L M A B
Y,Z | Z N O P Q R S T U V W X Y B C D E F G H I J K L M A
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
密鑰(循環(huán)使用,密鑰越長(zhǎng)相對(duì)破解難度越大):CULTURE
加密過程:明文字母'T'列與密鑰字母'C'行交點(diǎn)就是密文字母'F',以此類推蔑舞。
密文:FRW HKQRY YMFMF UAA OLWHD ALWI JPT ZXHC NGV
已知密鑰在線加解密傳送門
(2)破解
Porta密碼可以被以維吉尼亞密碼破解相類似方式進(jìn)行自動(dòng)攻破拒担,破解Porta密碼第一步是先確定密鑰長(zhǎng)度,這里推薦一篇關(guān)于使用重合指數(shù)算法確定為維吉尼亞密鑰長(zhǎng)度文章攻询。
15.同音替換密碼
(1)介紹
同音替換密碼(Homophonic Substitution Cipher)是單字母可以被其他幾種密文字母同時(shí)替換的密碼从撼,通常要比標(biāo)準(zhǔn)替換密碼破解更加困難,破解標(biāo)準(zhǔn)替換密碼最簡(jiǎn)單的方法就是分析字母出現(xiàn)頻率钧栖,通常在英語中字母'E'(或'T')出現(xiàn)的頻率是最高的低零,如果我們?cè)试S字母'E'可以同時(shí)被3種不同字符代替,那么就不能還是以普通字母的頻率來分析破解拯杠,如果允許可代替字符越多掏婶,那么密文就會(huì)更難破譯。
常見代換規(guī)則表:
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
密文(其中一種):6CZ KOVST XJ0MA EQY IOGL4 0W1J UC7 P9NB F0H
(2)破解
如果同音替換密碼的同音詞個(gè)數(shù)很多潭陪,那么破解它難度很大雄妥,通常的方法采取類似破解替換密碼的"爬山算法"最蕾,除了找到一個(gè)明文字母映射幾個(gè)字符之外,我們還需要確定映射了那些字符老厌,可以嘗試2層嵌套"爬山算法"來破解瘟则,外層確定映射的數(shù)量,內(nèi)層確定映射字符枝秤。
16.仿射密碼
(1)介紹
仿射密碼(Affine Cipher)是一種單表代換密碼醋拧,字母表中的每個(gè)字母相應(yīng)的值使用一個(gè)簡(jiǎn)單的數(shù)學(xué)函數(shù)映射到對(duì)應(yīng)的數(shù)值,再把對(duì)應(yīng)數(shù)值轉(zhuǎn)換成字母宿百。這個(gè)公式意味著每個(gè)字母加密都會(huì)返回一個(gè)相同的字母趁仙,意義著這種加密方式本質(zhì)上是一種標(biāo)準(zhǔn)替代密碼。因此垦页,它具有所有替代密碼的弱點(diǎn)雀费。每一個(gè)字母都是通過函數(shù)(ax + b)mod m加密,其中B是位移量痊焊,為了保證仿射密碼的可逆性盏袄,a和m需要滿足gcd(a , m)=1,一般m為設(shè)置為26薄啥。更多參考
常見的字母對(duì)應(yīng)關(guān)系:
下面我們以E(x) = (5x + 8) mod 26函數(shù)為例子
至于解密我們知道
即可得出解密結(jié)果
以E(x) = (5x + 8) mod 26加密辕羽,通過計(jì)算可得D(x)=21(x - 8) mod 26,這樣便可以得到明文垄惧。
可參考的Python腳本
加解密傳送門
17.培根密碼
(1)介紹
培根密碼(Baconian Cipher)是一種替換密碼刁愿,每個(gè)明文字母被一個(gè)由5字符組成的序列替換,最初的加密方式就是由'A'和'B'組成序列替換明文(所以你當(dāng)然也可以用別的字母)到逊,比如字母'D'替換成"aaabb"铣口,以下是全部的對(duì)應(yīng)關(guān)系(另一種對(duì)于關(guān)系是每個(gè)字母都有唯一對(duì)應(yīng)序列,I和J與U/V各自都有不同對(duì)應(yīng)序列):
#!shell
A = aaaaa? I/J = abaaa? R = baaaa
B = aaaab? K = abaab? ? S = baaab
C = aaaba? L = ababa? ? T = baaba
D = aaabb? M = ababb? ? U/V = baabb
E = aabaa? N = abbaa? ? W = babaa
F = aabab? O = abbab? ? X = babab
G = aabba? P = abbba? ? Y = babba
H = aabbb? Q = abbbb? ? Z = babbb
明文:T H E F O X
密文:baaba aabbb aabaa aabab abbab babab
加解密傳送門
18.ADFGX和ADFGVX密碼
(1)ADFGX密碼
ADFGX密碼(ADFGX Cipher)是結(jié)合了改良過的Polybius方格替代密碼與單行換位密碼的矩陣加密密碼觉壶,使用了5個(gè)合理的密文字母:A脑题,D,F(xiàn)铜靶,G叔遂,X,這些字母之所以這樣選擇是因?yàn)楫?dāng)轉(zhuǎn)譯成摩爾斯電碼(ADFGX密碼是德國(guó)軍隊(duì)在一戰(zhàn)發(fā)明使用的密碼)不易混淆争剿,目的是盡可能減少轉(zhuǎn)譯過程的操作錯(cuò)誤已艰。
加密矩陣示例:
#!shell
A? D? F? G? X
----------------
A | p? h? q? g? m
D | e? a? y? n? o
F | f? d? x? k? r
G | c? v? s? z? w
X | b? u? t? i/j l
明文:THE QUICK BROWN FOX
結(jié)果矩陣加密:
#!shell
XF AD DA? AF XD XG GA FG? XA FX DX GX DG? FA DX FF
列移位密鑰:how are u
密文:DXADF AGXF XFFXD FXGGX DGFG AADA ADXXF
已知密鑰加解密:
#!python
>>>from pycipher import ADFGX
>>>a = ADFGX('phqgmeaynofdxkrcvszwbutil','HOWAREU')
>>>a.encipher('THE QUICK BROWN FOX')
'DXADFAGXFXFFXDFXGGXDGFGAADAADXXF'
>>>a.decipher('DXADFAGXFXFFXDFXGGXDGFGAADAADXXF')
'THEQUICKBROWNFOX'
在線加解密傳送門
(2)ADFGVX密碼
ADFGVX密碼實(shí)際上就是ADFGX密碼的擴(kuò)充升級(jí)版,一樣具有ADFGX密碼相同的特點(diǎn)秒梅,加密過程也類似旗芬,不同的是密文字母增加了V,使得可以再使用10數(shù)字來替換明文捆蜀。
#!shell
A D F G V X
-------------
A | p h 0 q g 6
D | 4 m e a 1 y
F | l 2 n o f d
G | x k r 3 c v
V | s 5 z w 7 b
X | j 9 u t i 8
由于兩種加密過程完全類似這里就不再重復(fù)給出加密過程。
#!python
>>>from pycipher import ADFGVX
>>>a = ADFGVX('ph0qg64mea1yl2nofdxkr3cvs5zw7bj9uti8','HOWAREU')
>>>a.encipher('THE QUICK BROWN FOX')
'DXXFAFGFFXGGGFGXDVGDVGFAVFVAFVGG'
>>>a.decipher('DXXFAFGFFXGGGFGXDVGDVGFAVFVAFVGG')
'THEQUICKBROWNFOX'
19.雙密碼
(1)雙密碼
雙密碼(Bifid Cipher)結(jié)合了波利比奧斯方陣換位密碼,并采用分級(jí)實(shí)現(xiàn)擴(kuò)散辆它,這里的“雙”是指用2個(gè)密鑰進(jìn)行加密誊薄。雙密碼是由法國(guó)Felix Delastelle發(fā)明,除此之外Felix Delastelle還發(fā)明了三分密碼(Trifid Cipher)锰茉,四方密碼(Four-Square Cipher)呢蔫。還有一個(gè)兩方密碼(Two-Square)與四方密碼類似,共軛矩陣雙密碼(Conjugated Matrix Bifid Cipher)也是雙密碼的變種飒筑。
示例密陣:
#!shell
1 2 3 4 5
1| p h q g m
2| e a y l n
3| o f d x k
4| r c v s z
5| w b u t i/j
明文:THE QUICK BROWN FOX
經(jīng)過密陣轉(zhuǎn)換:
行:512 15543 54352 333
列:421 33525 21115 214
分組:
51215 54354 35233 3
42133 52521 11521 4
合并:
#!shell
5121542133 5435452521 3523311521 34
在經(jīng)過密陣轉(zhuǎn)換后密文:WETED TKZNE KYOME X
(2)已知密陣加解密
#!python
>>>from pycipher import
>>>Bifid('phqgmeaylnofdxkrcvszwbuti',5).encipher('THE QUICK BROWN FOX')
'WETEDTKZNEKYOMEX'
>>>Bifid('phqgmeaylnofdxkrcvszwbuti',5).decipher('WETEDTKZNEKYOMEX')
'THEQUICKBROWNFOX'
在線加解密傳送門
(3)未知密陣破解
手工分析破解雙密碼是有一定難度的片吊,每個(gè)字母都是同過3個(gè)數(shù)字進(jìn)行非線性代替轉(zhuǎn)換,而且之后還會(huì)對(duì)字母順序進(jìn)行打亂协屡,這樣使雙密碼比一些替換密碼和換位密碼更難破解俏脊。然而,現(xiàn)在是計(jì)算機(jī)時(shí)代肤晓,這張加密方式?jīng)]有安全性可言爷贫,通過模擬退火算法就能快速找到雙密碼的密陣。 這里推薦一篇詳細(xì)的雙密碼破解分析的文章补憾,基于模擬退火算法實(shí)現(xiàn)的工具破解示例:
密文:
#!shell
KWTAZQLAWWZCPONIVBTTBVQUZUGRNHAYIYGIAAYURCUQLDFTYVHTNQEENUPAIFCUNQTNGITEFUSHFDWHRIFSVTBISYDHHASQSROMUEVPQHHCCRBYTQBHWYRRHTEPEKHOBFSZUQBTSYRSQUDCSAOVUUGXOAUYWHPGAYHDNKEZPFKKWRIEHDWPEIOTBKESYETPBPOGTHQSPUMDOVUEQAUPCPFCQHRPHSOPQRSSLPEVWNIQDIOTSQESDHURIEREN
解密:
得到加密矩陣:
#!shell
G B C M K
D H U E T
L V Y W I
X O Z S P
N F A R Q
明文:
#!shell
CRYPTANALYS IS OF BIFID BY HAND IS ACTUALLY FAIRLY DIFFICULT THE FRACTIONATING NATURE OF THE CIPHER IE EACH LETTER IS SUBSTITUTED BY CHARACTERS THEN THESE CHARACTERS ARE IUM BLED WHICH WILL PULL THEM APART MAKES THE CIPHER MUCH STRONGER THAN SUBSTITUTION CIPHERS OR TRANSPOSITION CIPHER SON THEIR OWN
20.三分密碼
三分密碼(Trifid Cipher)結(jié)合換位和替換漫萄,三分密碼與雙密碼非常相似,差別之處就是用除了3×3×3的密陣代替5×5密陣盈匾。
示例密陣:
#!shell
密陣順序 = EPSDUCVWYM.ZLKXNBTFGORIJHAQ
方陣 1? ? ? 方陣 2? ? ? 方陣 3
1 2 3? ? ? 1 2 3? ? ? 1 2 3
1 E P S? ? 1 M . Z? ? 1 F G O
2 D U C? ? 2 L K X? ? 2 R I J
3 V W Y? ? 3 N B T? ? 3 H A Q
明文:THE QUICK BROWN FOX.
經(jīng)過密陣轉(zhuǎn)換:
#!shell
T H E Q U I C K B R O W N F O X .
2 3 1 3 1 3 1 2 2 3 3 1 2 3 3 2 2
3 3 1 3 2 2 2 2 3 2 1 3 3 1 1 2 1
3 1 1 3 2 2 3 2 2 1 3 2 1 1 3 3 2
T(233)表示T在第一個(gè)方陣第三行第三列的位置
分組(分組密鑰以5為例):
#!shell
THEQU ICKBR OWNFO X.
23131 31223 31233 22
33132 22232 13311 21
31132 23221 32113 32
合并:
#!shell
23131 33132 31132 31223 22232 23221 31233 13311 32113 22 21 32
在經(jīng)過密陣轉(zhuǎn)換后密文:
#!shell
231313313231132312232223223221312331331132113222132
N? O? O? N? W? G? B? X? X? L? G? H? H? W? S? K? W
想要深入了解三分密碼并破解三分密碼的小伙伴推薦去看LANIKI教授的一篇密碼課程章節(jié)的講義腾务。
21.四方密碼
(1)介紹
四方密碼(Four-Square Cipher)是類似普萊菲爾密碼雙字母加密密碼,這樣使加密效果強(qiáng)于其他替換密碼削饵,因?yàn)轭l率分析變得更加困難了岩瘦。
四方密碼使用4個(gè)預(yù)先設(shè)置的5×5字母矩陣,每個(gè)矩陣包括25個(gè)字母葵孤,通常字母'j'被融入到'i'中(維基百科上說'q'被忽略担钮,不過這不重要,因?yàn)?q'和'j'都是很少出現(xiàn)的字母)尤仍,通常左上和右下矩陣式是標(biāo)準(zhǔn)字母排序明文矩陣箫津,右上和左下矩陣是打亂順序的密鑰矩陣。
示例矩陣:
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
整理明文(分組不夠時(shí)用'X'填充):TH EQ UI CK BR OW NF OX JU MP SO VE RT HE LA ZY DO GX
加密過程:分別在明文矩陣中找到'TH'宰啦,分別找到他們?cè)谟疑暇仃囉凶笙戮仃嚨慕稽c(diǎn)字母'ES'就是密文苏遥,以此類推。
密文:ESZWQAFHGTDKWHRKUENYQOLMQTUNWMBPTGHQ
(2)已知密鑰矩陣加解密
#!python
>>>from pycipher import Foursquare
>>>fs = Foursquare('zgptfoihmuwdrcnykeqaxvsbl','mfnbdcrhsaxyogvituewlqzkp')
>>>fs.encipher('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG')
'ESZWQAFHGTDKWHRKUENYQOLMQTUNWMBPTGHQ'
>>>fs.decipher('ESZWQAFHGTDKWHRKUENYQOLMQTUNWMBPTGHQ')
'THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG'
在線加解密傳送門
(3)未知密鑰矩陣破解
推薦一篇關(guān)于采用模擬退火算法的四方密碼分析文章赡模,如果有足夠多的密文那么四方密碼可以輕易被破解田炭,如果知道了明文和密文推出密鑰是很容易的,猜測(cè)部分明文是一個(gè)有效的方法去破解四方密碼漓柑,如果一部分明文已知或者可以被猜測(cè)出 那么我們首先要確定盡可能多可利用的密鑰教硫,然后才可以進(jìn)行更多的推測(cè)或者用其他的方法破譯叨吮。基于四方密碼分析一文實(shí)現(xiàn)的C代碼破解示例:
密文(密文最好在200個(gè)字符以上):
HMMKEQESDTMDHLAWFWMNKSOSFOMRFNLWLKHNSQGGEKXEOLLVDXNRSQQGARTFKSAVNUDLFNDHESPZGQ TWESAGPGSQSQSTPKUSBBQLQHESAGPGSQSQGXLNAVHTPMHMKKNYGSUGDMTPDGFNKYAVHXLWGEKRILESLZ ZOFNAVIHRHRKAGHSMYUGEGNSRGAVMVOQPRLNKRXLMYLQPXILESQYBNRHRKAGKYQXDIHMPGPYOERZOLBEZ LURFWLWUOLDDPNSQYAGMUQPQWESBEZVEQESDTMDBQLWDIUSHB
用法:
#!shell
gcc -O3 -lm foursquarecrack2.c scoreText_2.c -o fsc
./fsc
輸出結(jié)果:
#!shell
Running foursquarecrack, this could take a few minutes...
best score so far: -1239.505249, on iteration 1
Key: 'KFMLUGWSQEPOZTNRBHDAVXCIY','UGSVKFIZMOYXPQRWTHLNCABED'
plaintext: 'THECIPHERTEXTSQUARESCANBEGENERATEDUSINGAKEYWORDDROPPINGDUPLICAT
ELETTERSTHENFILLTHEREMAININGSPACESWITHTHEREMAININGLETTERSOFTHEA
LPHABETINORDERALTERNATIVELYTHECIPHERTEXTSQUARESCANBEGENERATEDCO
MPLETELYRANDOMLYTHEFOURSQUAREALGORITHMALLOWSFORTWOSEPARATEKEYSO
NEFOREACHOFTHETWOCIPHERTEXTMATRICESX'
2.棋盤密碼
棋盤密碼(Checkerboard Cipher)是使用一個(gè)波利比奧斯方陣和兩個(gè)密鑰作為密陣的替換密碼瞬矩,通常在波利比奧斯方陣中J字母往往被包含在I字母中茶鉴。
示例密陣:
#!shell
Q? U? I? C? K
--------------
B |K? N I/J G? H
R |P? Q? R? S? T
O |O? Y? Z? U? A
W |M? X? W? V? B
N |L? F? E? D? C
經(jīng)過密陣替換:
#!shell
明文:T? H? E? Q? U? I? C? K? B? R? O? W? N? F? O? X
密文:RK BK RU OC OC BI NK BQ WK RI OQ WI BU NU OQ WU
23.跨棋盤密碼
跨棋盤密碼(Straddle Checkerboard Cipher)是一種替換密碼,當(dāng)這種密碼在結(jié)合其他加密方式景用,加密效果會(huì)更好涵叮。
棋盤示例(選擇3和7作為變換):
#!shell
0 1 2 3 4 5 6 7 8 9
f k m? c p d? y e
3: h b i g q r o s a z
7: l u t j n w v x
明文:T H E Q U I C K B R O W N F O X
經(jīng)過加密棋盤替換得到密文:72 30 9 34 71 32 4 1 31 35 36 75 74 0 36 77
當(dāng)然我們還可以繼續(xù)用其他的加密方式在對(duì)跨棋盤密碼加密出的結(jié)果再進(jìn)行加密:
示例變換密鑰:83729
#!shell
8372983729837298372983729837
+7230934713241313536757403677
-----------------------------
5502817432078501808630122404
在經(jīng)過棋盤轉(zhuǎn)換后:
#!shell
5502817432078501808630122404
ppfmyk n if? pfkyfyd hkmmcfc
最終得到密文: ppfmyk n if pfkyfyd hkmmcfc
在線加解密傳送門
24.分組摩爾斯替換密碼
分組摩爾斯替換密碼(Fractionated Morse Cipher)首先把明文轉(zhuǎn)換為莫爾斯電碼,不過每個(gè)字母之間用x分開伞插,每個(gè)單詞用xx分開割粮。然后使用密鑰生成一個(gè)替換密表,這個(gè)密表包含所有. - x組合的情況(因?yàn)椴粫?huì)出現(xiàn)xxx的情況媚污,所以一共26種組合)舀瓢。
密鑰:MORSECODE
密表:
#!shell
MORSECDABFGHIJKLNPQTUVWXYZ
.........---------XXXXXXXX
...---XXX...---XXX...---XX
.-X.-X.-X.-X.-X.-X.-X.-X.-
說明:密表下半部分是固定的,密表的安全性以及加密效果主要取決于使用的密鑰杠步。
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
(類似)摩爾斯電碼:
#!shell
-x....x.xx--.-x..-x..x-.-.x-.-xx-...x.-.x---x.--x-.xx..-.x---x-..-xx.---x..- --x.--.x...xx---x...-x.x.-.xx-x....x.xx.-..x.-x--..x-.--xx-..x---x--.
說明:明文在轉(zhuǎn)換為(類似)摩爾斯電碼后進(jìn)行每3個(gè)字符分組氢伟,再進(jìn)行密表的查表。
密文(經(jīng)過密表替換):LMUWC OQVHG ZMTAK EVYSW NOYJQ NLIQB JQCDH XMDYF TWRGP FWNH
已知密鑰在線加解密傳送門
25.Bazeries密碼
Bazeries密碼(Bazeries Cipher)是換位密碼和替換密碼的組合幽歼,使用兩個(gè)波利比奧斯方陣朵锣,一個(gè)明文字母方陣,使用一個(gè)隨機(jī)的數(shù)字(一般小于1000000)的生成一個(gè)密鑰矩陣同時(shí)作為第一輪明文劃分分組甸私,比如2333這個(gè)數(shù)字翻譯為英文便是TWO THOUSAND THREE HUNDRED THIRTY THREE,從第一個(gè)字母T開始選取不重復(fù)的字母诚些,之后再?gòu)淖帜副碇邪葱蜻x取沒有出現(xiàn)的字母組成密鑰矩陣。
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
隨機(jī)數(shù)字:2333
明文矩陣:
#!shell
A? F? L? Q? V
B? G? M? R? W
C? H? N? S? X
D I/J O? T? Y
E? K? P? U? Z
示例密鑰矩陣:
#!shell
T? W? O? H? U
S? A? N? D? R
E I/J Y? B? C
F? G? K? L? M
P? Q? V? X? Z
明文分組:
#!shell
2? 3? 3? 3? 2? 3? 3? 3? 2? 3? 3? 3
TH EQU ICK BRO WN FOX JUM PSO VE RTH ELA ZYD OG
分組明文反序:
#!shell
HT UQE KCI ORB WN XOF MUJ OSP EV EHT ALE DYZ GO
使用密鑰矩陣替換:
#!shell
IL XHP QEG KDS YR CKW NXG KBV PU ILD TOP FMZ AK
(比如'H'在明文矩陣對(duì)應(yīng)到密鑰矩陣的位置就是'I')
已知密鑰在線加解密傳送門
26.Digrafid密碼
Digrafid密碼(Digrafid Cipher)使用兩個(gè)密鑰生成分別生成類似波利比奧斯方陣的3x9方格的密表皇型。诬烹,主要有3分組和4分組兩類。
第一個(gè)方陣密鑰:digrafid
第二個(gè)方陣密鑰:cipher
密表:
#!shell
1 2 3 4 5 6 7 8 9
D I G R A F D B C 1 2 3
E H J L M N O P Q 4 5 6
S T U V W X Y Z # 7 8 9
c f s 1
i g t 2
p j u 3
h k v 4
e l w 5
r m x 6
a n y 7
b o z 8
d q # 9
明文:THE QUICK BROWN FOX
密表轉(zhuǎn)換(以4分組為例):
#!shell
Th Eq Ui Ck? Br Ow Nf Ox
2? 1? 3? 9? ? 8? 7? 6? 7
7? 5? 7? 2? ? 1? 6? 5? 6
4? 9? 2? 4? ? 6? 5? 1? 6
說明:T在第一矩陣第2列弃鸦,h在第二矩陣第4行绞吁,T所在的行與h所在的列相交的位置數(shù)字為7,所以Th表示為274唬格。
轉(zhuǎn)換密文:
#!shell
213 975 724 924? 876 716 566 516
Ip? #e? Dk? Ck? ? Zr? Dr? Mx? Ar
27.格朗普雷密碼
格朗普雷密碼(Grandpré Cipher)是替換密碼的一種家破,一般使用8個(gè)8字母的單詞橫向填充8x8方陣,且第一列為一個(gè)單詞购岗,并且在方陣中26個(gè)字母都必須出現(xiàn)一次以上汰聋。
示例密陣:
#!shell
明文:T? H? E? Q? U? I? C? K? B? R? O? W? N? F? O
密文:84 27 82 41 51 66 31 36 15 71 67 73 52 34 67
說明:明文中的字母在密陣位置可能不止一個(gè),所以加密結(jié)果可能有多種喊积,但是不影響解密烹困。密陣還有6x6,7x7乾吻,9x9,10x10幾種髓梅。顯然密陣越大每個(gè)字母被替換的情況就可能越多拟蜻,那么加密效果就更好。
28.比爾密碼
比爾密碼(Beale ciphers)有三份密碼女淑,當(dāng)然這里說的是已被破解第二份瞭郑,是一種類似書密碼的替換密碼辜御。
以第二密碼為例鸭你,每一個(gè)數(shù)字代表美國(guó)《獨(dú)立宣言》的文本中的第幾個(gè)詞的首字母,如1代表第1個(gè)詞的首字母“w”擒权,2代表第2個(gè)詞首字母“i”袱巨。解密后的文字如下:
I have deposited in the county of Bedford...
比爾密碼還有一段有趣的故事,感興趣可以看一下比爾密碼的詳細(xì)介紹碳抄。
29.鍵盤密碼
一般用到的鍵盤密碼就是手機(jī)鍵盤和電腦鍵盤兩種愉老,2014 0ctf比賽里Crypto類型中Classic一題就是電腦鍵盤密碼,詳細(xì)可以參考剖效,另外給出另外一些參考情況嫉入。
其他有趣的機(jī)械密碼
1.恩尼格瑪密碼
恩尼格瑪密碼機(jī)(德語:Enigma,又譯啞謎機(jī)璧尸,或“謎”式密碼機(jī))是一種用于加密與解密文件的密碼機(jī)咒林。確切地說,恩尼格瑪是對(duì)二戰(zhàn)時(shí)期納粹德國(guó)使用的一系列相似的轉(zhuǎn)子機(jī)械加解密機(jī)器的統(tǒng)稱爷光,它包括了許多不同的型號(hào)垫竞,為密碼學(xué)對(duì)稱加密算法的流加密。詳細(xì)工作原理參考維基百科蛀序。
在線模擬傳送門
感興趣可以觀看播單:計(jì)算機(jī)歷史文化課
代碼混淆加密
1.asp混淆加密
2.[php language="混淆加密"][/php]118
3.[css language="/js混淆加密"][/css]119
5.ppencode
ppencode-Perl把Perl代碼轉(zhuǎn)換成只有英文字母的字符串欢瞪。
ppencode傳送門
6.rrencode
rrencode可以把ruby代碼全部轉(zhuǎn)換成符號(hào)。
rrencode傳送門
7.jjencode/aaencode
jjencode將JS代碼轉(zhuǎn)換成只有符號(hào)的字符串徐裸,類似于rrencode遣鼓,介紹的PPT,aaencode可以將JS代碼轉(zhuǎn)換成常用的網(wǎng)絡(luò)表情重贺,也就是我們說的顏文字js加密骑祟。
aaencode傳送門
jjencode/aaencode的解密直接在瀏覽器的控制臺(tái)里輸入密文即可執(zhí)行解密,想要詳細(xì)了解jjencode是如何進(jìn)行請(qǐng)參考檬姥,你也可以在github上下載實(shí)現(xiàn)jjdecoder的源碼進(jìn)行分析曾我。
8.JSfuck
JSFuck 可以讓你只用 6 個(gè)字符[ ]( ) ! +來編寫 JavaScript 程序。
JSfuck傳送門
9.jother
jother是一種運(yùn)用于javascript語言中利用少量字符構(gòu)造精簡(jiǎn)的匿名函數(shù)方法對(duì)于字符串進(jìn)行的編碼方式健民。其中8個(gè)少量字符包括:! + ( ) [ ] { }抒巢。只用這些字符就能完成對(duì)任意字符串的編碼。
jother編碼傳送門
jother直接在瀏覽器(IE可以)的控制臺(tái)里輸入密文即可執(zhí)行解密:
10.brainfuck
Brainfuck是一種極小化的計(jì)算機(jī)語言秉犹,按照"Turing complete(完整圖靈機(jī))"思想設(shè)計(jì)的語言蛉谜,它的主要設(shè)計(jì)思路是:用最小的概念實(shí)現(xiàn)一種“簡(jiǎn)單”的語言稚晚,BrainF**k 語言只有八種符號(hào),所有的操作都由這八種符號(hào)(> < + - . , [ ])的組合來完成型诚。
明文:hello!
#!shell
+++++ +++++ [->++ +++++ +++<] >++++ .---. +++++ ++..+ ++.<+ +++++ +++++
[->++ +++++ ++++< ]>+++ ++++. <++++ +++[- >---- ---<] >--.< +++++ ++[->
----- --<]> ----- ----- .<
brainfuck傳送門
其他稀奇古怪的編程語言請(qǐng)參考