p = 687219428995849307159753802176826720614443448112639362736756075536712284271368245160895405670269902708573338310356219613086190099255844887741784618855016920048234684293006570562990541691001806147536244341734294184552071957617135670324033740343310715129099061775681349948606808564402940626123330630160286881579340386334965540482118792747008000000000001 A=335552743420679234329148970511218896997601385906883726332995008235884222458402718630454131870339078291212740007898280534096148645865607142505963928515142688040039717894160718957581165478790845015784669316242365836105123358445389473114258079496864395305736953525495280869798973522061376416657724952819882938423860134889489381194721475625991034249370405 B=124932587325670663879223586833057531216405982194388727491003735826959381651144884173560698180809650509124298042399895272898360595484846749003181399102790126621267612604455027249548658867464152859902503403482052872223356190808705722019838835957180131472465396393805754894807066912358298286636341295047088312993295531586756216688993184400293247207470722 enc=b"`\x91\xef$\xd5M':uZg\xdav\x99\x80\x93}\x9fF\xe3\xb2\x7f\xb5:u\x8e\xc7#\xd9\xefJ!\x9f \xca-\x8e\xb0\t\xd017af)\xd4k\xfa" g=2 b = discrete_log(mod(B,p),mod(g,p)) print(b) s=pow(A,b,p) print(s) 24337517220429569124569345031528854295527516625779640084726001971382212694608358020650084261257530396508562810393973693596740037123856713502933039288568369244220854490558831218253077398214912647768561080391472966462052374826120102354661315574984458777747842045987875677771966895546087628105903438170691094768 121039085525256583350061969360141423112251549364913366224253560955245267411238052009484584383440642954508844181465291960521925268663911365198164162915744775997736449214822251856839814384243367590997158770443172643652756611499571162423379215693673873990296744550370933255346955692568190671124568984558026809875718138608166371097360612555343057689975884
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
from Crypto.Util.number import * from gmpy2 import * from Crypto.Cipher import AES from hashlib import sha256 P = 687219428995849307159753802176826720614443448112639362736756075536712284271368245160895405670269902708573338310356219613086190099255844887741784618855016920048234684293006570562990541691001806147536244341734294184552071957617135670324033740343310715129099061775681349948606808564402940626123330630160286881579340386334965540482118792747008000000000001 alice_c=335552743420679234329148970511218896997601385906883726332995008235884222458402718630454131870339078291212740007898280534096148645865607142505963928515142688040039717894160718957581165478790845015784669316242365836105123358445389473114258079496864395305736953525495280869798973522061376416657724952819882938423860134889489381194721475625991034249370405 bob_c=124932587325670663879223586833057531216405982194388727491003735826959381651144884173560698180809650509124298042399895272898360595484846749003181399102790126621267612604455027249548658867464152859902503403482052872223356190808705722019838835957180131472465396393805754894807066912358298286636341295047088312993295531586756216688993184400293247207470722 enc=b"`\x91\xef$\xd5M':uZg\xdav\x99\x80\x93}\x9fF\xe3\xb2\x7f\xb5:u\x8e\xc7#\xd9\xefJ!\x9f \xca-\x8e\xb0\t\xd017af)\xd4k\xfa" g=2 s=121039085525256583350061969360141423112251549364913366224253560955245267411238052009484584383440642954508844181465291960521925268663911365198164162915744775997736449214822251856839814384243367590997158770443172643652756611499571162423379215693673873990296744550370933255346955692568190671124568984558026809875718138608166371097360612555343057689975884 key = sha256(long_to_bytes(s)).digest() iv = b"dasctfdasctfdasc" aes = AES.new(key, AES.MODE_CBC, iv) enc = aes.decrypt(enc) print(enc) b'DASCTF{1b90f1ae-7df8-4436-a258-b04d79e6dd46}\x04\x04\x04\x04'
ezRSA
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
from Crypto.Util.number import * from secret import secret, flag def encrypt(m): return pow(m, e, n) assert flag == b"dasctf{" + secret + b"}" e = 11 p = getPrime(512) q = getPrime(512) n = p * q P = getPrime(512) Q = getPrime(512) N = P * Q gift = P ^ (Q >> 16) print(N, gift, pow(n, e, N)) print(encrypt(bytes_to_long(secret)), encrypt(bytes_to_long(flag)))
n = 83410392685813224685786027640778560521035854332627839979281105731457044069408118952629284089869335506983096270269822559619624906180108256504440296527471536363057103101146262613593336072556587341466840510200003498265457285439149541137127199088938421905041387224795918868443175561632999479925818053898100117419 def GCD(a,b): if b == 0: return a.monic() else: return GCD(b,a % b) PR.<x> = PolynomialRing(Zmod(n)) for k in range(50): f1 = x ^ 11 - c2 f2 = (bytes_to_long(b'dasctf{' + b'\x00' * k + b'}') + 256 * x) ^ 11 - c3 if GCD(f1,f2)[0] != 1: print(long_to_bytes(int(n - GCD(f1,f2)[0])))
n = 119156144845956004769507478085325079414190248780654060840257869477965140304727088685316579445017214576182010373548273474121727778923582544853293534996805340795355149795694121455249972628980952137874014208209750135683003125079012121116063371902985706907482988687895813788980275896804461285403779036508897592103 c1 = 185012145382155564763088060801282407144264652101028110644849089283749320447842262397065972319766119386744305208284231153853897076876529326779092899879401876069911627013491974285327376378421323298147156687497709488102574369005495618201253946225697404932436143348932178069698091761601958275626264379615139864425 P.<x> = PolynomialRing(Zmod(n)) f = x^4 + x^3 + x^2 + x + 1997 - c1 t=f.small_roots(X=2^32, beta=0.4, epsilon=0.01) print(t) #2915836867
然后求p和qr
1 2 3
kp = t ** 4 + t ** 3 + t **2 + t + 1997 - c1 p = gcd(kp,n) qr = n // p
然后可利用groebner_basis()求出m
1 2 3 4 5 6 7 8 9 10 11 12
P.<x,y> = PolynomialRing(Zmod(n)) f1 = 1997 - c3 f2 = 1997 - c2 for i in range(1,20): f1 += (x + t)^i f2 += (x * t)^i G = [f1,f2] B = Ideal(G).groebner_basis() res = [x.constant_coefficient() for x in B] q = res[1] m = -res[0] % q
但是发现m不是正常的值,那么其应该是大于q的
然后需要爆破求解
1 2 3 4 5 6 7 8
q = 87038069032840052005520908272237788908169043580221040711149494083975743478969 x = 56985796272753226120469211992443340429346162287195965942430959147227534853120 for i in range(10000000): flag = long_to_bytes(x + i * q) if b'dasctf' in flag : print(flag) # dasctf{ShangPoXiaPoYaSiLeYiQianDuo}