1. 程式人生 > >實驗吧密碼學WriteUp(三)

實驗吧密碼學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}