ctf crypto 入門總結-編碼+古典密碼
不知不覺,我CTF刷了100道題了,其中76道題目是crypto。(正確率感人0.0)
適逢CTF國賽將至,對密碼學進行簡單總結
(參考書目:《CTF特訓營》FlappyPig戰隊著)
(未經宣告的語言,預設為python2)
編碼
hex
字串轉化為編碼
s="flag"
print s.encode("hex")
編碼轉化為字串
print hex(num)[2:-1].decode("hex")
在解題過程中,一般使用PyCrypto庫中的long_to_bytes和bytes_to_long函式進行轉換
from Crypto.Util.number import bytes_to_long c=flag{123456} print bytes_to_long(c)
urlencode
特點:有%
例子:BUUCTF平臺 url編碼
開啟檔案%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d
import urllib
d="%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d"
print urllib.unquote(d)
得出答案flag{and 1=1}
morsecode
由.和_組成的程式碼,中間以空格或者/間隔
解密網站:
https://tool.lu/morse/
還做到過robomunication,是人讀的
emmm,我覺得還是自己好好聽,好好記一下吧,可以用audacity或者Cool Edit等音訊軟體輔助一下...
jsfuck
解密網站:
http://codertab.com/JsUnFuck
程式碼太長了,放一部分吧..
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])
例子:buuctf平臺 這是什麼
用檔案分析器或者用winhex打開發現是.doc檔案
(Emmm...總感覺這個題對密集恐懼症同學不那麼友好0.0)
然後改字尾,發現是jsfuck,直接用網站破解
uuencode
解密網站:
http://ctf.ssleye.com/uu.html
沒有小寫字母
沒做到過這個編碼的題目...Emmmm
base家族
base64 a-z A-Z 0-9 + / ==補位
base32 A-Z 2-7 ==補位
base16非常接近hex(base16是大寫,然後hex是小寫,其餘不變)
加密程式碼:
import base64
print "flag".encode("base64")
print base64.b16encode("flag")
print base64.b32encode("flag")
print base64.b64encode("flag")
解密程式碼:
import base64
print "ZmxhZw==".decode("base64")
print base64.b16decode("666C6167")
print base64.b16decode("MZWGCZY=")
print base64.b16decode("ZmxhZw==")
推薦去解密網站去解base32和64,因為補位不當的話,可能分解不出來
base32網站:
https://www.qqxiuzi.cn/bianma/base.php
base64網站:
https://www.qqxiuzi.cn/bianma/base64.htm
其他編碼:
我在做題中還發現了很多奇怪的編碼...
中文電碼
解碼網站:
http://code.mcdvisa.com/
密文:2053082329700207187313440356
明文:我喜歡資訊保安
特徵:長度是4的倍數
新月佛論禪
解密網站:
http://hi.pcmoe.net/buddha.html
密文:新佛曰:諸隸僧降壽吽諸壽陀壽摩隸僧缽薩嚤訶陀夷所迦菩諦吽心所羅劫壽吶壽心壽修哆莊咒愍彌降壽蜜哆咒缽壽菩壽吽壽降夷色塞如如囑壽囑
明文:我喜歡資訊保安
特徵:自己看0.0
生僻字
解密網站:
https://www.qqxiuzi.cn/zh/pinyin/
(如果你語文夠好,當我沒說0.0)
密文:淛匶襫黼瀬鎶
明文:這就是flag
特徵:生僻字
社會主義核心價值觀編碼
加密網站:
https://atool.vip/corevalue/
密文:誠信自由公正愛國愛國敬業民主友善愛國平等敬業公正敬業友善公正友善愛國公正友善自由誠信文明友善自由文明友善愛國自由誠信民主誠信平等誠信富強民主誠信自由公正愛國民主誠信富強誠信平等友善愛國平等友善自由誠信自由愛國敬業誠信自由平等愛國平等友善自由愛國
明文:我喜歡資訊保安
特徵:全部都是社會主義核心價值觀的24字
(沒背過的快去背!!!!!)
古代密碼
移位密碼
簡單移位密碼
密文:lafgea{s_eyay_scyprt}o
金鑰:3124
明文:flag{easy_easy_crypto}
解密程式碼:(《CTF特訓營》書中程式碼)
def shift_decrypt(c,k):
l=len(k)
m=""
for i in range(0,len(c),l):
tmp_m=[""]*l
if i+l>=len(c):
tmp_c=c[i:]
use=[]
for kindex in range(len(tmp_c)):
use.append(int(k[kindex])-l)
use.sort()
for kindex in range(len(tmp_c)):
tmp_m[kindex]=tmp_c[use.index(int(k[kindex])-l)]
else:
tmp_c=c[i:i+l]
for kindex in range(len(tmp_c)):
tmp_m[kindex]=tmp_c[int(k[kindex])-1]
m+="".join(tmp_m)
return m
c="lafgea{s_eyay_scyprt}o"
k="3124"
print shift_decrypt(c,k)
(好像平時做題沒見過,可能是我做的太少了吧0.0或者是太簡單了)
曲路密碼
好沒技術含量的密碼,散了,不寫了
雲影密碼
沒用過的密碼,只有01248組成
解密程式碼:
def c01248_decode(c):
l=c.split("0")
origin = 'abcdefghijklmnopqrstuvwxyz'
r = ''
for i in l:
tmp=0
for num in i:
tmp+=int(num)
r+=origin[tmp-1]
return r
print c01248_decode("8842101220480224404014224202480122")
柵欄密碼
可以用米斯特安全團隊製作的CTFcrackTools解密,也可以用程式碼解密:
def zhalan_decrypt(c,k):
l=len(c)
partnum=l/k
if l%k!=0:
partnum+=1
m=[""]*l
for i in range(0,l,partnum):
if i+partnum>=len(c):
tmp_c=c[i:]
else:
tmp_c=c[i:i+partnum]
for j in range(len(tmp_c)):
m[(j*k+i/partnum)%l]=tmp_c[j]
return "".join(m)
c="f{lm_alzaihhahnmaaga_ah}"
for i in range(1,len(c)):
if len(c)%i==0:
print zhalan_decrypt(c,i)
替代密碼
凱撒密碼
可以用米斯特安全團隊製作的CTFcrackTools解密,也可以用程式碼解密:
def caesar_decrypt(c,k):
r=""
for i in c:
r+=chr((ord(i)-k)%128)
return r
def caesar_brute(c,match_str):
result=[]
for k in range(128):
tmp=caesar_decrypt(c,k)
if match_str in tmp:
print tmp
return 0
c="39.4H/?BA2,0.2@.?J"
caesar_brute(c,'')
其中k預設是3
ROT編碼
SYNT對應flag,如出現SYNT,考慮ROT13
解密網站:
https://www.qqxiuzi.cn/bianma/ROT5-13-18-47.php
仿射密碼
c=am+b mod n
解密程式碼:
import primefac
def affine_decode(c,a,b,origin="abcdefghijklmnopqrstuvwxyz"):
r=""
n=len(origin)
ai=primefac.modinv(a,n)%n
for i in c:
if origin.find(i)!=1:
r+=origin[(ai*(origin.index(i)-b))%n]
else:
r+=i
return r
print affine_decode("ihhwvcswfrcp",5,8)
def affine_guessab(m1,c1,m2,c2,origin="abcdefghijklmnopqrstuvwxyz"):
x1=origin.index(m1)
x2=origin.index(m2)
y1=origin.index(c1)
y2=origin.index(c2)
n=len(origin)
dxi=primefac.modinv(x1-x2,n)%n
a=dxi*(y1-y2) % n
b=(y1-a*x1)%n
return a,b
print affine_guessab("a","i","f","h")
buuctf裡面題目小學生密碼學也是用這種方法
圖形替代密碼
豬圈密碼
變種聖堂武士密碼
標準銀河字母
(就是MC上附魔臺的奇妙文字)
維吉尼亞密碼
密文:g vjganxsymda ux ylt vtvjttajwsgt bl udfteyhfgt
oe btlc ckjwc qnxdta
vbbwwrbrtlx su gnw nrshylwmpy cgwps, lum bipee ynecgy gk jaryz frs fzwjp, x puej jgbs udfteyhfgt, gnw sil uuej su zofi. sc okzfpu bl lmi uhzmwi, x nyc dsj bl lmi enyl ys argnj yh nrgsi. nba swi cbz ojprbsw fqdam mx. cdh nsai cb ygaigroysxn jnwwi lr msylte.
cw mekr tg jptpzwi kdikjsqtaz, ftv pek oj pxxkdd xd ugnj scr, yg n esqxwxw nba onxw au ywipgkj fyiuujnxn gnss xwnz onxw jnahl avhwwxn vzkjpu nrofch fvwfoh. v jwhppek lmi vyutfp hbiafp hcguj at nxw gyxyjask ib hw seihxsqpn vtvjttajwsx ds zzj xnegfsmtf egz wtrq lt mbcukj sc hy. qty wnbw ss bbxsq vxtnl ys ghrw zw cbx vt cdh vgxwtfy ssc brzzthh bl wsjdeiwricg cw mekr zjzi grgktr ib lwfv.
破解網站:
https://quipqiup.com/
https://www.guballa.de/vigenere-solver
(第二個比第一個強大,但需要科 學 shang 網)