题目:
from Crypto.Util.number import *
flag = b'NSSCTF{******}'
class LCG:
def __init__(self, seed, a, b, n):
self.seed = seed # 初始种子
self.a = a # 乘数
self.b = b # 增量
self.n = n # 模数
def generate(self):
self.seed = (self.a * self.seed + self.b) % self.n
return self.seed
lcg = LCG(bytes_to_long(flag), getPrime(256), getPrime(256), getPrime(256))
for i in range(getPrime(16)):
lcg.generate()
print(f'a = {lcg.a}')
print(f'n = {lcg.n}')
print(lcg.generate())
print(lcg.generate())
'''
a = 83968440254358975953360088805517488739689448515913931281582194839594954862517
n = 77161425490597512806099499399561161959645895427463118872087051902811605680317
43959768681328408257423567932475057408934775157371406900460140947365416240650
8052043336238864355872102889254781281466728072798160448260752595038552944808
'''
解题思路:
解答:
import gmpy2
import libnum
from Crypto.Util.number import isPrime
a = 83968440254358975953360088805517488739689448515913931281582194839594954862517
m = 77161425490597512806099499399561161959645895427463118872087051902811605680317
c1=43959768681328408257423567932475057408934775157371406900460140947365416240650
c2=8052043336238864355872102889254781281466728072798160448260752595038552944808
b=(c2-a*c1) % m
#print(b)
#print(gmpy2.gcd(b,m))
a_1 = gmpy2.invert(a,m)
c = c1
for i in range(2**16):
c = (c-b) * a_1 % m
flag = libnum.n2s(int(c))
if b'NSSCTF' in flag:
print(flag)
break
#NSSCTF{recover_b}