不知不觉,我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 网)