前言
玩過CTF的小伙伴會經(jīng)常遇到類似這樣的問題:dalao這是啥編碼方式啊?怎么解密啊?
其實CTF中的腦洞密碼題,通常是費現(xiàn)代加密方式,一般都是各種古典密碼的變形,一般出題者會對密文進行一些處理,但都會留下不少線索,當然也需要參賽者對于各種編碼方式有所了解,這樣更有利于快速入手解密,結(jié)合一定的腦洞,拿到Flag就so easy了.
編碼方式匯總
常見編碼
ASCii編碼
Base64/32/16編碼
shellcode編碼
Quoted-printable編碼
XXencode編碼
UUencode編碼
URL編碼
Unicode編碼
Escape/Unescape編碼
HTML實體編碼
Tap Code敲擊碼
Morse Code摩爾斯電碼
各種文本加密
換位加密
Rail-fence Cipher柵欄密碼
Curve Cipher曲路密碼
Columnar Transposition Cipher列位移加密
替換加密
Atbash Cipher埃特巴什碼
Caesar Cipher凱撒密碼
ROT5/13/18/47
Simple Substitution Cipher簡單換位密碼
Hill Cipher希爾密碼
Pigpen Cipher豬圈密碼
Polybius Square Cipher波利比奧斯方陣密碼
夏多密碼(曲折加密)
Playfair Cipher普萊費爾密碼
Vigenere Cipher維吉尼亞密碼
Autokey Cipher自動密鑰密碼
Beaufort Cipher波弗特密碼
Running Key Cipher滾動密鑰密碼
Porta Cipher
Homophonic Substitution Cipher同音替換密碼
Affine Cipher仿射密碼
Baconian Cipher培根密碼
ADFG/VX Cipher ADFG和ADFGVX密碼
Bifid Cipher雙密碼
Trifid Cipher三分密碼
Four-Square Cipher四方密碼
Checkerboard Cipher棋盤密碼
============================
Base64
ZXZhbCgkX1BPU1RbcDRuOV96MV96aDNuOV9qMXVfU2gxX0oxM10p
NTU2NJC3ODHHYWJIZ3P4ZWY=
Base64編碼要求把3個8位字節(jié)轉(zhuǎn)化為4個6位的字節(jié),之后在6位的前面補兩個0,形成8位一個字節(jié)的形式。 如果剩下的字符不足3個字節(jié),則用0填充,輸出字符使用’=’,因此編碼后輸出的文本末尾可能會出現(xiàn)1或2個’=’
Base32
Base32和Base64相比只有一個區(qū)別就是,用32個字符表示256個ASC字符,也就是說5個ASC字符一組可以生成8個Base字符,反之亦然。
希爾密碼
密文: 22,09,00,12,03,01,10,03,04,08,01,17
明文:wjamdbkdeibr
解題思路:使用的矩陣是 1 2 3 4 5 6 7 8 10
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
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
把字母用數(shù)字表示,解密時把數(shù)字轉(zhuǎn)換成字母,然后放入腳本,密鑰要分成矩陣。一般是對稱的
腳本已存
柵欄密碼
把要加密的明文分成N個一組,然后把每組的第1個字連起來,形成一段無規(guī)律的話。
密文樣例:tn c0afsiwal kes,hwit1r g,npt ttessfu}ua u hmqik e {m, n huiouosarwCniibecesnren.
解密程序:
char s[]= “tn c0afsiwal kes,hwit1r g,npt ttessfu}ua u hmqik e {m, n huiouosarwCniibecesnren.”;
char t[86]= “”;
int i,j,k;
k=0;
for (i=0;i<17;i++)
{
for(j=0;j<5;j++)
{
t[k++]= ch[j*17+i];
}
}
for(i=0;i<85;i++)
{
printf(“%c”,t[i]);
}
凱撒密碼
通過把字母移動一定的位數(shù)來實現(xiàn)加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一個固定數(shù)目進行偏移后被替換成密文。
常規(guī)解密:
from pycipher import Caesar
for i in range(1,27):
str=Caesar(key=i).encipher(‘UIF RVJDLCSPXOGPYKVNQTPWFSUIFMBAZEPH’)
print “mingwen:”+str.lower()+“rn“
密文樣例:U8Y]:8KdJHTXRI>XU#?!K_ecJH]kJGbRH7YJH7YSH]=93dVZ3^S8$:8″&:9U]RH;g=8Y!U92’=j$KH]ZSj&[S#!gU#*dK9.
解題思路:
得知是凱撒加密之后,嘗試進行127次輪轉(zhuǎn)爆破:
lstr=”””U8Y]:8KdJHTXRI>XU#?!K_ecJH]kJG*bRH7YJH7YSH]*=93dVZ3^S8*$:8″&:9U]RH;g=8Y!U92’=j*$KH]ZSj&[S#!gU#*dK9.”””
forp in range(127):
str1 = ”
for i in lstr:
temp = chr((ord(i)+p)%127)
if 32<ord(temp)<127 :
str1 = str1 + temp
feel = 1
else:
feel = 0
break
if feel == 1:
print(str1)
Unicode
密文樣例:u5927u5bb6u597duff0cu6211u662fu0040u65e0u6240u4e0du80fdu7684u9b42u5927u4ebauff01u8bddu8bf4u5faeu535au7c89u4e1du8fc7
brainfuck
類型:++++++++++[>+++++++>++++++++++>+++>+<<<<-]
++.>+.+++++++..+++.>++.<<+++++++++++++++.
.+++.——.——–.>+.>.
利用BFVM.exe直接解密
用法 loadtxt 1.txt
摩斯密碼
密文樣例:– — .-. … .
jsfuck
密文中 ()[]{}!+
如果jsfuck定義的是一個函數(shù)并且最后以()結(jié)尾,則在火狐console中運行時函數(shù)也會運行,就會錯掉什么提示。這時候需要把最后的()換成.toString()
培根密碼
培根所用的密碼是一種本質(zhì)上用二進制數(shù)設(shè)計的。不過,他沒有用通常的0和1來表示,而是采用a和b。
已知將一個flag以一種加密形式為使用密鑰進行加密,使用密鑰WELCOMETOCFF加密后密文為
培根密碼表看其他文件
費娜姆密碼
異或
已知將一個flag以一種加密形式為使用密鑰進行加密,使用密鑰WELCOMETOCFF加密后密文為 00000000000000000000000000000000000
0000000000000000101110000110001000000101000000001 請分析出flag。
密鑰為12位,密文為84位,可能是異或:
7位二進制可能表示字母順序:
W E L C O M E T O C F F
密文
0000000 0000000 0000000 0000000 0000000 0000000 0000000 0010111 0000110 0010000 0010100 0000001
密鑰
0010111 0000101 0001100 0000011 0001111 0001101 0000101 0010100 0001111 0000011 0000110 0000110
Xor
0010111 0000101 0001100 0000011 0001111 0001101 0000101 0000011 0001001 0010011 0010010 0000111
W E L C O M E C I S R G
即:WELCOMECISRG
flag:WELCOMECISRG
豬圈密碼,又稱共濟會密碼
CRC32
密文樣例:4D1FAE0B
import zlib
def crc32(st):
crc = zlib.crc32(st)
if crc > 0:
return “%x” % (crc)
else:
return “%x” % (~crc ^ 0xffffffff)
顏文字加密(aaencode)
這個好萌啊>.<
顏文字js加密:明文alert(“flag”);
密文:?ω??= /`m′)? ~┻━┻ //′?`/ [‘’]; o=(???) ==3; c=(?Θ?) =(???)-(???); (?Д?) =(?Θ?)= (o_o)/ (o_o);(?Д?)={?Θ?: ‘’ ,?ω?? : ((?ω??==3) +’’) [?Θ?] ,???? :(?ω??+ ‘’)[o^^o -(?Θ?)] ,?Д??:((???==3) +’’)[???] }; (?Д?) [?Θ?] =((?ω??==3) +’’) [c language=”_o”][/c];(?Д?) [‘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 language=”^^o”][/c];(?Д?) [?o?]='”‘;(?Д?) [‘’] ( (?Д?) [‘’] (?ε?+(?Д?)[?o?]+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(?Θ?)+ (???)+ ((???) + (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((o_o) +(o_o))+ ((o_o) – (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((o_o) +(o_o))+ (???)+ (?Д?)[?ε?]+((???) + (?Θ?))+ (c_o)+ (?Д?)[?ε?]+(???)+ ((o_o) – (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ (???)+ ((o_o) +(o_o))+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ (???)+ ((???) + (o_o))+ (?Д?)[?ε?]+(???)+ ((o_o) – (?Θ?))+ (?Д?)[?ε?]+((???) + (?Θ?))+ (?Θ?)+ (?Д?)[?ε?]+((???) + (o_o))+ (o_o)+ (?Д?)[?o?]) (?Θ?)) (‘_’);
Jjencode
密文:$=~[];$={:++$,$$$$:(![]+””)[$],$:++$,$$:(![]+””)[$],$:++$,$$$:({}+””)[$],$$$:($[$]+””)[$],$$:++$,$$$:(!””+””)[$],$:++$,$$:++$,$$:({}+””)[$],$$:++$,$$$:++$,$:++$,$$:++$};$.$=($.$=$+””)[$.$$]+($.$=$.$[$.$])+($.$$=($.$+””)[$.$])+((!$)+””)[$.$$]+($.=$.$[$.$$])+($.$=(!””+””)[$.$])+($.=(!””+””)[$.$])+$.$[$.$$]+$.+$.$+$.$;$.$$=$.$+(!””+””)[$.$$]+$.+$.+$.$+$.$$;$.$=($.)[$.$][$.$];$.$($.$($.$$+”””+$.$$+(![]+””)[$.$]+$.$$$+”\”+$.$+$.$$+$.$+$.+”(\”\”+$.$+$.$+$.+$.$$$+(![]+””)[$.$]+(![]+””)[$.$]+$.$+”,\”+$.$+$.+”\”+$.$+$.$+$.$+$.$$+”\”+$.$+$.$$+$.$$+$.$$+”\”+$.$+$.$+$.$$+$.$$+”\”+$.$+$.$$+$.$+”\”+$.$+$.$$+$.$+”\”+$.$+$.$$+$.+$.+”\”\”+$.$+$._+”)”+”””)())();
無字母加密
<?php
@$_++; // $_ = 1
$__=(“#”^”|”); // $__ = _
$__.=(“.”^”~”); // _P
$__.=(“/”^”`”); // _PO
$__.=(“|”^”/”); // _POS
$__.=(“{“^”/”); // _POST
${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1]);
?>
Utf-7編解碼
原文:gdfgdfg
密文:+AGcAZABmAGcAZABmAGc-
無論何種,都是+開頭-結(jié)尾
云影密碼
如果密碼只有01248組成。。。
原理很簡單,有了1,2,4,8這四個簡單的數(shù)字,你可以以加法表示出0-9任何一個數(shù)字,例如0=28,7=124,9=18。
這樣,再用1-26來表示A-Z,就可以用作密碼了。
為了不至于混亂,我個人引入了第五個數(shù)字0,來用作間隔,以避免翻譯錯誤,所以還可以稱“01248密碼”。
題目:12401011801180212011401804
第一步,分割,即124 1 118 118 212 114 18 4
第二步,基本翻譯,例如124可以表示7,也可以表示16(但不可能是34,因為不會超過26),所以可以放在一邊,翻譯其他沒有異議的,可得:124 a s s w o 18 d
第三步,推測得出明文。可以推測后面的18表示r,前面的為p最合適。
明文:password(密碼).
RC4
key welcometoicqedu
密文UUyFTj8PCzF6geFn6xgBOYSvVTrbpNU4OF9db9wMcPD1yDbaJw==
用腳本解密 腳本已存
曼徹斯特
轉(zhuǎn)二進制 不是10就是01 即是曼徹斯特 解密看腳本
對于其他一些未知密文,可嘗試到下列幾個網(wǎng)站轉(zhuǎn)換試試,看看運氣
其他小技巧:
如果密文是十進制,字符范圍為“0-9”,可以猜測是ASCII編碼;
如果密文由“a-z”“A-Z”和“=”構(gòu)成,特別是末尾有“=”,那么可以判斷為Base64編碼;
如果密文含有“%” ,形式為 “%xx” 和 “%uxxxx”,字符范圍又是十六進制“0-F”,判斷是escape() 函數(shù)編碼,用unescape()解碼;
若密文由“[],(),{},+,!”字符組成的編碼通常就通過Jother解密。
判斷出可能的編碼方式,就可以使用程序或工具進行解密。