前言
玩過CTF的小伙伴會(huì)經(jīng)常遇到類似這樣的問題:dalao這是啥編碼方式白茨?怎么解密岸蛋ぁ膏孟?
其實(shí)CTF中的腦洞密碼題,通常是費(fèi)現(xiàn)代加密方式拌汇,一般都是各種古典密碼的變形柒桑,一般出題者會(huì)對密文進(jìn)行一些處理,但都會(huì)留下不少線索噪舀,當(dāng)然也需要參賽者對于各種編碼方式有所了解魁淳,這樣更有利于快速入手解密飘诗,結(jié)合一定的腦洞,拿到Flag就so easy了.
編碼方式匯總
常見編碼
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
Simple Substitution Cipher簡單換位密碼
Hill Cipher希爾密碼
Pigpen Cipher豬圈密碼
Polybius Square Cipher波利比奧斯方陣密碼
夏多密碼(曲折加密)
Playfair Cipher普萊費(fèi)爾密碼
Vigenere Cipher維吉尼亞密碼
Autokey Cipher自動(dòng)密鑰密碼
Beaufort Cipher波弗特密碼
Running Key Cipher滾動(dòng)密鑰密碼
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個(gè)8位字節(jié)轉(zhuǎn)化為4個(gè)6位的字節(jié)界逛,之后在6位的前面補(bǔ)兩個(gè)0昆稿,形成8位一個(gè)字節(jié)的形式。 如果剩下的字符不足3個(gè)字節(jié)仇奶,則用0填充貌嫡,輸出字符使用’=’,因此編碼后輸出的文本末尾可能會(huì)出現(xiàn)1或2個(gè)’=’
Base32
Base32和Base64相比只有一個(gè)區(qū)別就是该溯,用32個(gè)字符表示256個(gè)ASC字符岛抄,也就是說5個(gè)ASC字符一組可以生成8個(gè)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í)把數(shù)字轉(zhuǎn)換成字母,然后放入腳本氯庆,密鑰要分成矩陣蹭秋。一般是對稱的
腳本已存
柵欄密碼
把要加密的明文分成N個(gè)一組贝咙,然后把每組的第1個(gè)字連起來揭璃,形成一段無規(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]);
}
凱撒密碼
通過把字母移動(dòng)一定的位數(shù)來實(shí)現(xiàn)加密和解密灭袁。明文中的所有字母都在字母表上向后(或向前)按照一個(gè)固定數(shù)目進(jìn)行偏移后被替換成密文实昨。
常規(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.
解題思路:
得知是凱撒加密之后洞豁,嘗試進(jìn)行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定義的是一個(gè)函數(shù)并且最后以()結(jié)尾,則在火狐c(diǎn)onsole中運(yùn)行時(shí)函數(shù)也會(huì)運(yùn)行荒给,就會(huì)錯(cuò)掉什么提示丈挟。這時(shí)候需要把最后的()換成.toString()
培根密碼
培根所用的密碼是一種本質(zhì)上用二進(jìn)制數(shù)設(shè)計(jì)的。不過志电,他沒有用通常的0和1來表示曙咽,而是采用a和b。
已知將一個(gè)flag以一種加密形式為使用密鑰進(jìn)行加密挑辆,使用密鑰WELCOMETOCFF加密后密文為
培根密碼表看其他文件
費(fèi)娜姆密碼
異或
已知將一個(gè)flag以一種加密形式為使用密鑰進(jìn)行加密例朱,使用密鑰WELCOMETOCFF加密后密文為 00000000000000000000000000000000000
0000000000000000101110000110001000000101000000001 請分析出flag。
密鑰為12位鱼蝉,密文為84位茉继,可能是異或:
7位二進(jìn)制可能表示字母順序:
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
豬圈密碼,又稱共濟(jì)會(huì)密碼
CRC32
密文樣例:4D1FAE0B
import zlib
def crc32(st):
crc = zlib.crc32(st)
if crc > 0:
return “%x” % (crc)
else:
return “%x” % (~crc ^ 0xffffffff)
顏文字加密(aaencode)
這個(gè)好萌啊>.<
顏文字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這四個(gè)簡單的數(shù)字,你可以以加法表示出0-9任何一個(gè)數(shù)字氯哮,例如0=28际跪,7=124,9=18喉钢。
這樣姆打,再用1-26來表示A-Z,就可以用作密碼了肠虽。
為了不至于混亂幔戏,我個(gè)人引入了第五個(gè)數(shù)字0,來用作間隔税课,以避免翻譯錯(cuò)誤闲延,所以還可以稱“01248密碼”。
題目:12401011801180212011401804
第一步韩玩,分割垒玲,即124 1 118 118 212 114 18 4
第二步,基本翻譯找颓,例如124可以表示7合愈,也可以表示16(但不可能是34,因?yàn)椴粫?huì)超過26)叮雳,所以可以放在一邊想暗,翻譯其他沒有異議的,可得:124 a s s w o 18 d
第三步帘不,推測得出明文说莫。可以推測后面的18表示r寞焙,前面的為p最合適储狭。
明文:password(密碼).
RC4
key welcometoicqedu
密文UUyFTj8PCzF6geFn6xgBOYSvVTrbpNU4OF9db9wMcPD1yDbaJw==
用腳本解密 腳本已存
曼徹斯特
轉(zhuǎn)二進(jìn)制 不是10就是01 即是曼徹斯特 解密看腳本
對于其他一些未知密文,可嘗試到下列幾個(gè)網(wǎng)站轉(zhuǎn)換試試捣郊,看看運(yùn)氣
其他小技巧:
如果密文是十進(jìn)制辽狈,字符范圍為“0-9”,可以猜測是ASCII編碼呛牲;
如果密文由“a-z”“A-Z”和“=”構(gòu)成刮萌,特別是末尾有“=”,那么可以判斷為Base64編碼娘扩;
如果密文含有“%” 着茸,形式為 “%xx” 和 “%uxxxx”壮锻,字符范圍又是十六進(jìn)制“0-F”,判斷是escape() 函數(shù)編碼涮阔,用unescape()解碼猜绣;
若密文由“[],()敬特,{}掰邢,+,!”字符組成的編碼通常就通過Jother解密伟阔。
判斷出可能的編碼方式辣之,就可以使用程序或工具進(jìn)行解密。