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))
以上