源码:
import random
from secret import flag
ror = lambda x, l, b: (x >> l) | ((x & ((1<<l)-1)) << (b-l))
N = 1
for base in [2, 3, 7]:
N *= pow(base, random.randint(123, 456))
e = random.randint(271828, 314159)
m = int.from_bytes(flag, byteorder='big')
assert m.bit_length() < N.bit_length()
for i in range(m.bit_length()):
print(pow(ror(m, i, m.bit_length()), e, N))
好久没做过这么简单的题了,下午已经快让lfsr搞疯了
分析ror函数,就是让m右移i位,然后把这个i位移到前面,是一个循环位移
但是这个i位移不移到前面不重要,因为最后print的就是依次打印m右移i位的e次方模n,奇数相乘还是奇数,也就是二进制最后一位是1那么多少次方都是1,所以我们取chall每个数的二进制最后一位拼起来,因为打印的时候是从m的低位开始打的,所以将二进制倒序才是真正的m
chall=open('chall.txt').read().split()
mm=[]
for i in chall:
mm.append(int(i))
m=''
for i in mm:
m+=bin(i)[-1]
from Crypto.Util.number import long_to_bytes
m=int(m[::-1],2)
print(long_to_bytes(m))