1、simple algorithm
题目地址:http://www.simplexue.com/ctf/examctfdetail/737
题目给了一个py脚本和一个密文文件,py脚本将明文转换为密文,现在需要将密文文件中的密文解密得到明文。
加密算法为
flag = '[censored]'
hflag = flag.encode('hex')
iflag = int(hflag[2:], 16)
def FAN(n, m):
i = 0
z = []
s = 0
while n > 0:
if n % 2 != 0:
z.append(2 - (n % 4))
else:
z.append(0)
n = (n - z[i])/2
i = i + 1
z = z[::-1]
l = len(z)
for i in range(0, l):
s += z[i] * m ** (l - 1 - i)
return s
i = 0
r = ''
while i < len(str(iflag)):
d = str(iflag)[i:i+2]
nf = FAN(int(d), 3)
r += str(nf)
i += 2
print r
很明显加密流程为将明文转换为16进制编码,在转化为10进制数,将每两位数字构成的数进行FAN函数运算,再拼接起来得到密文。
因此解密流程为:将0~99利用FAN函数求得加密值,建立加密值–>原数的字典,在明文中查字典拼接得到10进制数,转化为16进制数,再求取字符串。代码如下:
xxx={} #字典
for kk in range(0,100):
xxx[FAN(kk, 3)]=kk
ff=open('enc.txt','r')
dd=ff.read()
print dd
str1=''
jj=0
while jj<len(dd):
if xxx.has_key(int(dd[jj:jj+4])):
str1+='%d'%(xxx[int(dd[jj:jj+4])])
jj+=4
elif xxx.has_key(int(dd[jj:jj+3])):
str1+='%02d'%(xxx[int(dd[jj:jj+3])])
jj+=3
elif xxx.has_key(int(dd[jj:jj+2])):
str1+='%02d'%(xxx[int(dd[jj:jj+2])])
jj+=2
elif xxx.has_key(int(dd[jj:jj+1<