2023愚人杯-Comedy

0x00 前言

CTF 加解密合集:CTF 加解密合集

0x01 题目

import gmpy2, libnum
from secret import flag1, flag2

m = libnum.s2n(flag1)
assert m.bit_length() < 200
B = gmpy2.next_prime(libnum.s2n(flag2))
A = (2022 - 2023 * m) % B
leak = pow(2, 2023, B)
print(A)
print(leak)
# 493275281479560936332761096886786925792234184811353209227551802099268192839677496844153534128991899414803550843408607188612593757622064753867565869035222715177143938385039508273050267347710495512806264863554858016145161165422812554800693811328453743229819656381224407015421235005940088439590887928051969351426291843586132741521121351667152673680122929827805479163871436776753859965413192837591532468372
# 23882919612712826315619489814174828013019092034326522825739880286720384600470387795299052447332912523308309627527606407193041656161613591019067409934526702703938632820365348915276930949819955640157402163307102287468908158567757801027652950710230482845168100068220808916294052905228376350724459317369078695781654574654043626188839873217296594576256941670240185925372569647159302388594426256115998232795

0x02 Write Up

这里已知一个前提,m是远小于b的

已知 leak = pow(2, 2023, B)可以得到kB+leak=2**2023也就是kB=2**2023-leak

已知A = (2022 - 2023 * m) % B因为(2022 - 2023 * m)远小于B,并且是负数所以,A-B=(2022 - 2023 * m),此时的A和B是非常相近的。

k=2**2023-leak//B,此时因为B和A非常相近,整除的时候会忽略差异,所以就有 k=2**2023-leak//A

那么就求出来k,已知k则能算出B,算出B,则得m,最终得到结果:

from Crypto.Util.number import *

A = 493275281479560936332761096886786925792234184811353209227551802099268192839677496844153534128991899414803550843408607188612593757622064753867565869035222715177143938385039508273050267347710495512806264863554858016145161165422812554800693811328453743229819656381224407015421235005940088439590887928051969351426291843586132741521121351667152673680122929827805479163871436776753859965413192837591532468372
leak = 238829196127128263156194898141748280130190920343265228257398802867203846004703877952990524473329125233083096275276064071930416561616135910190674099345267027039386328203653489152769309498199556401574021633071022874689081585677578010276529507102304828451681000682208089162940529052283763507244593173690786957816545746540436261888398732172965945762569416702401859253725696471593023885944262561159982327952


kb = 2 ** 2023 - leak
k=kb // A
B = kb//k
m = (B - A + 2022) // 2023
print(m)
print(long_to_bytes(m) + long_to_bytes(B))

以上

你可能感兴趣的:(CTF,CTF加密解密,web安全)