實驗吧密碼學WriteUp(三)
2.凱撒和某某加密 (http://www.shiyanbar.com/ctf/1822)
凱撒的話平時碰到的都是跟著字母表移位的,這裡也沒有多少字母,自然想到根據ascii來移位,可是移幾位呢,要知道最後的格式中一定有{,},f,l,a,g等,於是就試著看看移動多少位能得到這些,或者也可以用pyhton跑,指令碼如下:
-- coding:utf-8 --
import string
def foo():
s=”aZZg/x\ZbavpZiEZp+n)o+”
#ascii碼錶中可列印的字元
a=string.maketrans(”, ”)[33:127]
for n in xrange(0,26):
b=a[n:]+a[:n]
table=string.maketrans(a,b)
print string.translate(s,table)
pass
if name == ‘main‘:
foo()
print ‘ok’
得到了其中最像的結果:f__l4}a_gf{u_nJ_u0s.t0
用腳指頭想想都知道是柵欄加密
解密即可
3.一串奇怪的數(http://www.shiyanbar.com/ctf/1824)
(引用pcat,侵刪)
這題有提供加密程式,其實看懂後,最關鍵的是加密密碼,如果不知道,就坑爹了,除非暴力破解匹配結果是否存在金鑰的格式,鑑於這題密碼為空,我就提供下面的python程式碼(如果覺得非要暴力破密碼,自己加個迴圈讀取密碼字典之類,再判斷結果是否符合金鑰格式即可),程式理解不難,我就不贅述了。題目給出的密文解出來是4組金鑰(附帶4個\n),提交最後一組金鑰即可。
-- coding: utf8 --
import hashlib
def md5(s):
return hashlib.md5(s).hexdigest()
def evalCrossTotal(strMd5):
r = 0
for i in strMd5:
r += int(“0x%s” % i, 16)
return r
def encryptString(strString, strPasswd):
strPasswdMd5 = md5(strPasswd)
intMd5 = evalCrossTotal(strPasswdMd5)
r = []
for i in range(len(strString)):
r.append(ord(strString[i]) + int(“0x%s” % strPasswdMd5[i%32], 16) - intMd5)
intMd5 = evalCrossTotal(md5(strString[:(i+1)])[:16] + md5(str(intMd5))[:16])
return ” “.join(map(lambda x: str(x), r))
以下就是自己寫的
def decryptString(nList,strPasswd):
strPasswdMd5 = md5(strPasswd)
intMd5 = evalCrossTotal(strPasswdMd5)
r = “”
for i in range(len(nList)):
r+=chr(nList[i] - int(“0x%s” % strPasswdMd5[i%32], 16) + intMd5)
intMd5 = evalCrossTotal(md5(r[:(i+1)])[:16] + md5(str(intMd5))[:16])
return r
def foo():
s=”-149 -234 -157 -132 -187 -140 -157 -241 -158 -177 -85 -215 -180 -187 -173 -218 -161 -183 -133 -226 -136 -171 -126 -169 -155 -96 -169 -240 -163 -153 -137 -111 -123 -191 -151 -213 -151 -142 -152 -208 -118 -137 -136 -244 -157 -168 -187 -201 -170 -176 -192 -209 -205 -174 -163 -189 -126 -133 -148 -194 -145 -212 -170 -155 -148 -165 -167 -206 -171 -177 -88 -173 -125 -129 -129 -235 -121 -190 -161 -165”
nList=eval(‘[%s]’ %s.replace(’ ‘,’,’))
strPasswd=” #密碼為空
print decryptString(nList,strPasswd)
if name == ‘main‘:
foo()
print “ok”
pass
play的加密方式,百度可得playfair,依照百科中playfair的定義,先構造5*5密碼錶,
s n f m t
h b g o u
i c j p v
y d k q w
a e l r x
如何構造?
先填充給出的金鑰,後面再填充其他沒出現過的字元,最後丟棄頻率低的(一般是z)
把密文KQSAMFPAOPMFPA兩兩分組
kq sa mf pa op mf pa
按照playfair的解密方法,得到結果
0x標識表明這是十六進位制編碼,解碼得到一串百分號打頭的編碼:
這是URL編碼,解碼,得到:
.xCjEwOQoxMDEKMTE2CjExMQoxMTUKMTA0CjEwNQoxMjEKOTcKMTEwCjk4Cjk3CjExNA==
串尾後面的==號很明顯地暴露了這是Base64,再次解碼一系列數字,這是ASCII碼,解碼得到flag
加上flag格式後就可以提交了ctf{welc??????????????}
解密摩斯電碼即可
8.奇妙的音樂(http://www.shiyanbar.com/ctf/1862)
海倫凱勒可以猜到圖片下方是盲文,解碼得到.zip的解壓密碼
將音訊拖入Audicity,可以看到波形是摩斯
解密即可
柵欄:首先分欄
12位只能是2*6或6*2,根據題意6,所以分6欄,結果為NEQ{etIYdsf}
然後用凱撒解密即可
10.古典密碼(http://www.shiyanbar.com/ctf/1870)
將Ascii碼轉換為字母,得到OCU{CFTELXOUYDECTNGAHOHRNFIENM}IOTA
再嘗試柵欄(準確說,是類似柵欄的思想)
35=7*5
OCU{CFT
ELXOUYD
ECTNGAH
OHRNFIE
NM}IOTA
根據flag的格式CTF..來調整
得到
CTF{COU
LDYOUEX
CHANGET
HEINFOR
MATION}
CTF{COULDYOUEXCHANGETHEINFORMATION}