from itertools import product from Crypto.Util.number import * from ast import literal_eval from pwn import *
context(log_level='debug') io = remote('nc1.ctfplus.cn',xxxxx) io.recvuntil(b"Generated coefficients: ") coefficients = literal_eval(io.recvline().strip().decode()) MOD = 2**20 f = lambda x: sum(c * (x ** i) for i, c inenumerate(coefficients)) % MOD
deflist_ring(x0): lis = [x0] whilelen(lis) <= 3: x = f(lis[-1]) if x in lis: return lis lis.append(x)
for i inrange(MOD): if res := list_ring(i): print(res) print(len(res)) break
io.recvuntil(b"Set seed for RNG: ") io.sendline(str(res[0]).encode())
defdecrypt(a, b, encs): MOD = 2**32 + 1 flag = "" for enc in encs: state = enc found = False for i inrange(1,1025): state = (state - b) * pow(a, -1, MOD) % MOD if32 <= state <= 126: flag += chr(state) found = True break ifnot found: returnNone return flag
for a, b in product(res, res): flag = decrypt(a, b, encs) if flag: print(f"0xGame{{{flag}}}")
from itertools import product from Crypto.Util.number import * from ast import literal_eval from pwn import *
context(log_level='debug') io = remote('nc1.ctfplus.cn',xxxxx) io.recvuntil(b"Generated coefficients: ") coefficients = literal_eval(io.recvline().strip().decode()) MOD = 2**20 f = lambda x: sum(c * (x ** i) for i, c inenumerate(coefficients)) % MOD
deflist_ring(x0): lis = [x0] whilelen(lis) <= 3: x = f(lis[-1]) if x in lis: return lis lis.append(x)
for i inrange(MOD): if res := list_ring(i): print(res) print(len(res)) break
io.recvuntil(b"Set seed for RNG: ") io.sendline(str(res[0]).encode())
defdecrypt(a, b, encs): MOD = 2**32 + 1 flag = "" for enc in encs: state = enc found = False for i inrange(1,1025): state = (state - b) * pow(a, -1, MOD) % MOD if32 <= state <= 126: flag += chr(state) found = True break ifnot found: returnNone return flag
for a, b in product(res, res): flag = decrypt(a, b, encs) if flag: print(f"0xGame{{{flag}}}")
题目:Copper!!!.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from Crypto.Util.number import * from secret import flag
m = bytes_to_long(flag)
p = getPrime(512) q = getPrime(512) n = p * q e = 65537 c = pow(m, e, n) print(f"n = {n}") print(f"c = {c}") print(f"gift = {p >> 242 << 242}")
# n = 92873040755425037862453595432032305849700597051458113741962060511759338242511707376645887864988028778023918585157853023538298808432423892753226386473625357887471318145132753202886684219309732628049959875215531475307942392884965913932053771541589293948849554008069165822411930991003624635227296915315188938427 # c = 78798946231057858237017891544035026520248922588969396262361286907576401467816384819451190528802344534495780520382462432888103466971743435370588783181267466189564132373143717299869053172848786781320750631382630113459268771330862538801774075395201914653025347332312015985213462835680853607187971669296490439714 # gift = 10911712225716809560802315710689854621004330184657267444255298781464639032414821020145885934381310240257843204972266622870698161556175406337237650652528640
解答
p高位泄露,用Coppersmith求解就好
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
from gmpy2 import * from Crypto.Util.number import *
n = 92873040755425037862453595432032305849700597051458113741962060511759338242511707376645887864988028778023918585157853023538298808432423892753226386473625357887471318145132753202886684219309732628049959875215531475307942392884965913932053771541589293948849554008069165822411930991003624635227296915315188938427 c = 78798946231057858237017891544035026520248922588969396262361286907576401467816384819451190528802344534495780520382462432888103466971743435370588783181267466189564132373143717299869053172848786781320750631382630113459268771330862538801774075395201914653025347332312015985213462835680853607187971669296490439714 p = 10911712225716809560802315710689854621004330184657267444255298781464639032414821020145885934381310240257843204972266622870698161556175406337237650652528640
PR. = PolynomialRing(Zmod(n))
f = p+x res = f.small_roots(X=2^242, beta=0.5, epsilon=0.02) p = int(res[0]) + p q = n // p print(q) d = inverse_mod(65537, (p-1)*(q-1)) m = power_mod(c, d, n) print(long_to_bytes(m))