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{*************}'
assert(len(m)==71)
a = randint(50,100)
salt = ''.join(sample(ascii_uppercase, 4))
si = cycle(salt.lower())
c=encrypt(m, a, si)
print(c)
打开文件,从代码内容上来看,密文的形式是明文中每个字节的ascii值*a+未知ascii值%128
a是再50到100之间的数,可以爆破,salt是随机从A~Z之间的4个不重复的字母,可以爆破,关键在于怎么爆破?m的长度是71,测了一下确实是71,说明代码里m中的flag的位置和真正的明文中flag的位置是一样的,位于第53位,由于16进制一位会变成两位,那么对应到密文就是第105位
53和105是从1开始计数,由于代码下表从0开始计数,代码如下:
from itertools import *
from string import *
from random import *
from mitmproxy import sys
c&#