已知output(逆元不出来)

题目:

from Crypto.Util.number import *

flag = b'NSSCTF{******}'

class LCG:
    def __init__(self, seed, a, b, m):
        self.seed = seed  # 初始种子
        self.a = a  # 乘数
        self.b = b  # 增量
        self.m = m  # 模数

    def generate(self):
        self.seed = (self.a * self.seed + self.b) % self.m
        return self.seed

lcg = LCG(bytes_to_long(flag), getPrime(256), getPrime(256), getPrime(256))

for i in range(getPrime(16)):
    lcg.generate()

print(lcg.generate())
print(lcg.generate())
print(lcg.generate())
print(lcg.generate())
print(lcg.generate())

'''
47513456973995038401745402734715062697203139056061145149400619356555247755807
57250853157569177664354712595458385047274531304709190064872568447414717938749
30083421760501477670128918578491346192479634327952674530130693136467154794135
38739029019071698539301566649413274114468266283936163804522278316663267625091
42506270962409723585330663340839465445484970240895653869393419413017237427900
'''

解题思路:

  • 首先,我们要先求出m
  • 为什么m//=2?
  • 我们虽然得到了m的倍数,通过求解GCD也确实能得到m,但是在数据不够多的情况下,我们可能得到的是km(可以输出一下isPrime(m)发现m确实不是素数),这时就需要我们遍历一些小数,手动去除k

解答:

import gmpy2
import libnum
from Crypto.Util.number import GCD, isPrime, long_to_bytes

c=[47513456973995038401745402734715062697203139056061145149400619356555247755807,
   57250853157569177664354712595458385047274531304709190064872568447414717938749,
   30083421760501477670128918578491346192479634327952674530130693136467154794135,
   38739029019071698539301566649413274114468266283936163804522278316663267625091,
   42506270962409723585330663340839465445484970240895653869393419413017237427900]

t=[]
for i in range(1,len(c)):
    t.append(c[i]-c[i-1])

m = 0
for i in range(1,len(t)-1):
    m = GCD(t[i+1]*t[i-1]-t[i]**2, m)
# print(isPrime(m))       False

m//=2
# print(isPrime(m))

a = (c[3]-c[2])*gmpy2.invert(c[2]-c[1],m) % m
b = (c[2]-a*c[1]) % m
# print(gmpy2.gcd(a,m))
# print(gmpy2.gcd(b,m))
a_1=gmpy2.invert(a,m)

for i in range(2**16):
    c[1] = (c[1]-b) * a_1 % m
    flag = long_to_bytes(c[1])

    if b'NSSCTF{' in flag:
        print(flag)
        break
#NSSCTF{recover_module_number}
posted @ 2025-03-12 00:03  sevensnight  阅读(11)  评论(0)    收藏  举报