encrypt
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))
decrypt
发现N是2的倍数,很简单就可以发现每次输出中me 的最后一位就是c的最后一位.,这样很轻易就可以将m给求出来了.
import gmpy2
flag=''
f=open('chall.txt','r').readlines()
li=[]
for i in f:
li.append(int(i.strip('\n')))
#print(li)
for i in li:
flag+=bin(i)[-1]
from Crypto.Util import number
print(number.long_to_bytes(eval('0b'+flag[::-1])))
#zer0pts{0h_1t_l34ks_th3_l34st_s1gn1f1c4nt_b1t}