这题做了好久啊
先看题目吧,点开链接:题目
显示代码如下:
# -*- coding:utf-8 -*-
import A,SALT
from itertools import *
def encrypt(m, a, si):
c=""
for i in range(len(m)):
c+=hex(((ord(m[i])) * a + ord(next(si))) % 128)[2:].zfill(2)
return c
if __name__ == "__main__":
m = 'flag{********************************}'
a = A
salt = SALT
assert(len(salt)==3)
assert(salt.isalpha())
si = cycle(salt.lower())
print("明文内容为:")
print(m)
print("加密后的密文为:")
c=encrypt(m, a, si)
print(c)
#加密后的密文为:
#177401504b0125272c122743171e2c250a602e3a7c206e014a012703273a3c0160173a73753d
然后看完代码得到的信息是a是一个数,si是迭代器,next(si)循环提取si中的字母,作用再加密代码
c+=hex(((ord(m[i])) * a + ord(next(si))) % 128)[2:].zfill(2)
里面,然后si里面只有3个字母且都是小写,明文字符串部分已给出,包含flag{}格式,所以a和salt都可以试出来
先把a找出来,因为si是循环的,所以用 f 和 g 来试:
很直白的试。。
>>> for a in range(150):
for si in range(97,123):
si=chr(si)
c=hex(((ord('f')) * a + ord(si)) % 128)[2:].zfill(2)
if(int(c,base=16)==int(0x17)):
print(a,si)
两个运行的结果比较一下,可以找到一组 57 a
大概率就是a=57,salt[1]=‘a’
然后a=57带进去,得到salt=‘ahh’,这字符…好奇怪
之后继续试明文,跟找si一样,找明文m,不过写代码的时候卡了几个bug,把next(si)放在原来的位置上了,所以一直找出不来,而且flag里面还有数字,所以range里最好是(0,126),运行后就能出来了
from itertools import *
a=57
salt='ahh'
si=cycle(salt.lower())
c='177401504b0125272c122743171e2c250a602e3a7c206e014a012703273a3c0160173a73753d'
q=len(c)//2
s=''
for i in range(q):
b=c[:2]
c=c[2:]
sm=next(si)
for k in range(1,126):
m=chr(k)
c1=hex(((ord(m)) * a + ord(sm)) % 128)[2:].zfill(2)
#print(m,c1,int(c1,base=16)==int(b,base=16))
if(int(c1,base=16)==int(b,base=16)):
s+=m
break
print(s)
#运行结果
#flag{ad7d973ffdd285b476a1a727b3a8fbc4}