ctfcrypto⼊门总结(上)-编码+古典密码不知不觉,我CTF刷了100道题了,其中76道题⽬是crypto。(正确率感⼈0.0)
适逢CTF国赛将⾄,对密码学进⾏简单总结
(参考书⽬:《CTF特训营》FlappyPig战队著)
(未经声明的语⾔,默认为python2)
编码
hex
字符串转化为编码
s="flag"
de("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
jsfuck
例⼦:buuctf平台这是什么
⽤⽂件分析器或者⽤winhex打开发现是.doc⽂件
(总感觉这个题对密集恐惧症同学不那么友好0.0)
然后改后缀,发现是jsfuck,直接⽤⽹站破解
uuencode
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==")
其他编码:
我在做题中还发现了很多奇怪的编码...
中⽂电码
新⽉佛论禅
⽣僻字
社会主义核⼼价值观编码
古代密码
移位密码
简单移位密码
密⽂: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编码
仿射密码
c=am+b mod n
解密代码:
import primefac
def affine_decode(c,a,b,origin="abcdefghijklmnopqrstuvwxyz"):
r=""
n=len(origin)
dinv(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)
dinv(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上附魔台的奇妙⽂字)维吉尼亚密码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。