from multiprocessing import Pool from Crypto.Util.number import * from tqdm import trange import itertools import hashlib import sys
defsmall_roots(f, bounds, m=1, d=None):#多元copper ifnot d: d = f.degree() R = f.base_ring() N = R.cardinality() f /= f.coefficients().pop(0) f = f.change_ring(ZZ) G = Sequence([], f.parent()) for i inrange(m + 1): base = N ^ (m - i) * f ^ i for shifts in itertools.product(range(d), repeat=f.nvariables()): g = base * prod(map(power, f.variables(), shifts)) G.append(g) B, monomials = G.coefficient_matrix() monomials = vector(monomials) factors = [monomial(*bounds) for monomial in monomials] for i, factor inenumerate(factors): B.rescale_col(i, factor) B = B.dense_matrix().LLL() B = B.change_ring(QQ) for i, factor inenumerate(factors): B.rescale_col(i, 1 / factor) H = Sequence([], f.parent().change_ring(QQ)) for h infilter(None, B * monomials): H.append(h) I = H.ideal() if I.dimension() == -1: H.pop() elif I.dimension() == 0: roots = [] for root in I.variety(ring=ZZ): root = tuple(R(root[var]) for var in f.variables()) roots.append(root) return roots return []
defattack(range_): N = 136118062754183389745310564810647775266982676548047737735816992637554134173584848603639466464742356367710495866667096829923708012429655117288119142397966759435369796296519879851106832954992705045187415658986211525671137762731976849094686834222367125196467449367851805003704233320272315754132109804930069754909 e = 84535510470616870286532166161640751551050308780129888352717168230068335698416787047431513418926383858925725335047735841034775106751946839596675772454042961048327194226031173378872580065568452305222770543163564100989527239870852223343451888139802496983605150231009547594049003160603704776585654802288319835839 c = 33745401996968966125635182001303085430914839302716417610841429593849273978442350942630172006035442091942958947937532529202276212995044284510510725187795271653040111323072540459883317296470560328421002809817807686065821857470217309420073434521024668676234556811305412689715656908592843647993803972375716032906 dh = 4640688526301435859021440727129799022671839221457908177477494774081091121794107526784960489513468813917071906410636566370999080603260865728323300663211132743906763686754869052054190200779414682351769446970834390388398743976589588812203933 leak = 12097621642342138576471965047192766550499613568690540866008318074007729495429051811080620384167050353010748708981244471992693663360941733033307618896919023 kh = (e * (dh << 234) // N) >> 999 hash512 = bytes_to_long(hashlib.sha512(long_to_bytes(kh)).digest())
if __name__ == "__main__": ranges = [(i, i + 524288) for i inrange(0, 2 ^ 24, 524288)] with Pool(32) as pool: #2 ^ 24 // 32 = 524288 list(pool.imap(attack, ranges))
low = range_[0] high = range_[1] for dl in trange(low, high): p = 0 for km inrange(2 ^ 3): hash224 = bytes_to_long(hashlib.sha224(long_to_bytes(dl)).digest()) kl = leak ^^ hash512 ^^ hash224 k = kl + 2 ^ 512 * km + 2 ^ (512 + int(km).bit_length()) * new_kh s = (inverse(k, e) + N + 1) % e Delta = iroot(s ^ 2 - 4 * N, 2) if Delta[1]: p1 = (s + Delta[0]) // 2 p2 = (s - Delta[0]) // 2 if N % p1 == 0: p = p1 elif N % p2 == 0: p = p2 q = N // p phi = (p - 1) * (q - 1) d = inverse(e, phi) m = long_to_bytes(int(pow(c, d, N))) if m.isascii(): print(m) return
if __name__ == "__main__": ranges = [(i, i + 524288) for i inrange(0, 2 ^ 24, 524288)] with Pool(32) as pool: #2 ^ 24 // 32 = 524288 list(pool.imap(attack, ranges))
from hashlib import sha1 from Crypto.Util.number import bytes_to_long from ecdsa.ecdsa import Public_key, Private_key, Signature, generator_192 from datetime import datetime from random import randrange
banner = """ // / / // ) ) // ) ) // ) ) // | | //____ // // / / (( //__| | / ____ // // / / \\ / ___ | // // // / / ) ) // | | //____/ / ((____/ / //____/ / ((___ / / // | | Welcome to this CTF challenge! you have THREE choices: - sign_time to get a signature - verify to verify the signature - I kown the secret to get the flag You only have TWO chances per connection. Best wish for you! """
from hashlib import sha1 from Crypto.Util.number import *
p = 6277101735386680763835789423207666416083908700390324961279 b = 0x64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1 E = EllipticCurve(GF(p), [-3, b]) n = E.order()
message = 'The time is 1:1' H = bytes_to_long(sha1(message.encode()).digest()) r = 0xbce1ebbcf6b5e0d4f2c190fd9c33f078230a21f0cef7b151 s = 0x22d47c13fac8721ac71820cec3d0e8278d0cf38825ef517b k = 100 d = (s * k - H) * inverse(r, n) % n hex(d)
from tqdm import trange from Crypto.Util.number import * from multiprocessing import Pool
defattack(range_): h1 = -17696257697673533517695215344482784803953262308315416688683426036407670627060768442028628137969719289734388098357659521255966031131390425549974547376165392147394271974280020234101031837837842620775164967619688351222631803585213762205793801828461058523503457022704948803795360591719481537859524689187847958423587638744086265395438163720708785636319741908901866136858161996560525252461619641697255819255661269266471689541673348377717503957328827459396677344554172542244540931545166846117626585580964318010181586516365891413041095399344533013057011854734701706641516027767197631044458866554524544179750101814734153116374 h2 = 23686728880494758233026798487859622755203105120130180108222733038275788082047755828771429849079142070779731875136837978862880500205129022165600511611807590195341629179443057553694284913974985006590617143873019530710952420242412437467917519539591683898715990297750494900923245055632544763410401540518654522017115269508183482044872091052235608170710105631742176900306097734799793264202179181242015892763311753674799273300604804820015447161950996038795518844564861004398396796284113803759208011 h3 = 419166458284161364374927086939132546372091965414091344286510440034452974193054721041229068769658972346759176374539266235862042787888391905466876330331208651698002159575012622762558316612596034044109738533275009086940744966244759977014078484433213617582101347769476703012517531619023366639507114909172774156647998737369356116119513795863130218094614475699956104117183821832339358478426978211282822163928764161915824622224165694904342224081321345691796882691318330781141960650263488927837990954860719950761728580780956673732592771855694502630374907978111094148614378212006604233062606116168868545120407836000858982789824582335703891535021579560434875457656655941164757860852341484554015214879991896412137447010444797452119431147303295803678311972500421396900616845556636124424993090559354406417222700637726789045926994792374756038517484548544506630672251868349748176389591615802039026216656891403871728516658502023897343287181822303758976641229952646993446276281728919020747050486979968215989594984778920359425264076558022228448529089047021814759587052098774273578311709416672952218680244714492318709603579024 h4 = 13541898381047120826573743874105965191304100799517820464813250201030319771155430755606644860103469823030581858410957600027665504533335597988508084284252510961847999525811558651340906333101248760970154440885012717108131962658921396549020943832983712611749095468180648011521808106480590665594160479324931351996812185581193608244652792936715504284312172734662364676167010674359243219959129435127950232321130725013160026977752389409620674167037650367196748592335698164875097139931376389630867192761783936757260359606379088577977154378217235326249540098268616890307702288393952949444753648206049856544634755301197410481479 n = (h3 + 1025) // h2 p, q = var('p q') low = range_[0] high = range_[1] for r in trange(low, high): res = solve([p + q - n + r - h1, p * q - n], p, q) if res: try: for i in res: pp = int(str(i[0]).split('==')[1]) if n % pp == 0: qq = n // pp d = inverse(65537, (pp - 1) * (qq - 1)) print(long_to_bytes(int(pow(h4, d, n)))) except: pass if __name__ == "__main__": ranges = [(i, i + 82) for i inrange(-1026, 1026, 82)] with Pool(25) as pool: #2050 // 25 = 82 r = list(pool.imap(attack, ranges))
import random import os from Crypto.Util.number import * from secret import flag
defpad(x, n): whilelen(x) < n // 8: x += os.urandom(1) return x
defgenp(p, l): while1: r = random.randint(1 << l - 1, 1 << l) if isPrime(p + r): return p + r
bits = 1024 b = 345 flag = pad(flag, bits * 3) m = bytes_to_long(flag) p = getPrime(bits) q = genp(p, b) r = genp(q, b) n = p * q * r print(n) print(pow(m, 65537, n)) # 5605777780127871552103278440489930168557569118966981388111283042550796167470265465148458919374665519335013101681890408413810351780671950283765145543168779446153786190869731166707967097095246677053262868926963631796027692694223765625053269102325714361312299011876036815423751522482629914361369303649193526946050137701205931577449326939722902280884984494828850611521784382097900268639648421100760612558110614208245291400961758972415881709281708443424129033685255718996719201537066717587527029554871540574867831957154286334639399985379381455084604901293000229526196544921067214723085504463673412082637877637982771445298815007769526806112008703908400170846707986989384244531990469279604588770393462375930699135443458952703826608237292999895910024613311408883134789788541751697007502656798556053417265191533053158952284994030769145926816478390761642058013769635850833893158830591398862163134753203291719549474871116653745337968227 # 2998195560453407057321637509862236387961676411996988529185696118404592349869917006166370346762261303282478779647282039317061146533808487789458703169149689179547543732935053220010550004328207373171271534689897340156346458951776319267981966893926724550629182100766890856964207263709029611781806548130358294543573874132473259788387939849997550651614987993962540192023207354839106090274252125961835070701748643163379053118598595995782448140944376681636633592442158453965800439960134688017496184195454406927204485213436540382637720118180670197194949275760000729877093621741313147190401896114633643891311672542703928421032698499968701052818985292683628072129271790220674145955527935027879112279336148316425115255710066132502392447843608711463775710558880259205308541126041959858947252063815158749021817255637836170676726466347847422352280599210078359786387419424076245960344657767332883964636288493649066530215094453490169688507988
from multiprocessing import Pool from tqdm import trange
n = 5605777780127871552103278440489930168557569118966981388111283042550796167470265465148458919374665519335013101681890408413810351780671950283765145543168779446153786190869731166707967097095246677053262868926963631796027692694223765625053269102325714361312299011876036815423751522482629914361369303649193526946050137701205931577449326939722902280884984494828850611521784382097900268639648421100760612558110614208245291400961758972415881709281708443424129033685255718996719201537066717587527029554871540574867831957154286334639399985379381455084604901293000229526196544921067214723085504463673412082637877637982771445298815007769526806112008703908400170846707986989384244531990469279604588770393462375930699135443458952703826608237292999895910024613311408883134789788541751697007502656798556053417265191533053158952284994030769145926816478390761642058013769635850833893158830591398862163134753203291719549474871116653745337968227 c = 2998195560453407057321637509862236387961676411996988529185696118404592349869917006166370346762261303282478779647282039317061146533808487789458703169149689179547543732935053220010550004328207373171271534689897340156346458951776319267981966893926724550629182100766890856964207263709029611781806548130358294543573874132473259788387939849997550651614987993962540192023207354839106090274252125961835070701748643163379053118598595995782448140944376681636633592442158453965800439960134688017496184195454406927204485213436540382637720118180670197194949275760000729877093621741313147190401896114633643891311672542703928421032698499968701052818985292683628072129271790220674145955527935027879112279336148316425115255710066132502392447843608711463775710558880259205308541126041959858947252063815158749021817255637836170676726466347847422352280599210078359786387419424076245960344657767332883964636288493649066530215094453490169688507988 my_p = iroot(n, 3)[0]
R.<pl> = Zmod(n)[] ph = int(bin(my_p)[2::][:675:], 2) for i in trange(2 ^ 16): f = pl + 2 ^ 333 * i + 2 ^ 349 * ph root = f.small_roots(X = 2 ^ (1024 - 691), beta = 0.33) if root: p = root[0] + 2 ^ 333 * i + 2 ^ 349 * ph assert n % p == 0 print(p) break
defsmall_roots(f, bounds, m=1, d=None):#多元copper ifnot d: d = f.degree() R = f.base_ring() N = R.cardinality() f /= f.coefficients().pop(0) f = f.change_ring(ZZ) G = Sequence([], f.parent()) for i inrange(m + 1): base = N ^ (m - i) * f ^ i for shifts in itertools.product(range(d), repeat=f.nvariables()): g = base * prod(map(power, f.variables(), shifts)) G.append(g) B, monomials = G.coefficient_matrix() monomials = vector(monomials) factors = [monomial(*bounds) for monomial in monomials] for i, factor inenumerate(factors): B.rescale_col(i, factor) B = B.dense_matrix().LLL() B = B.change_ring(QQ) for i, factor inenumerate(factors): B.rescale_col(i, 1 / factor) H = Sequence([], f.parent().change_ring(QQ)) for h infilter(None, B * monomials): H.append(h) I = H.ideal() if I.dimension() == -1: H.pop() elif I.dimension() == 0: roots = [] for root in I.variety(ring=ZZ): root = tuple(R(root[var]) for var in f.variables()) roots.append(root) return roots return [] n = 5605777780127871552103278440489930168557569118966981388111283042550796167470265465148458919374665519335013101681890408413810351780671950283765145543168779446153786190869731166707967097095246677053262868926963631796027692694223765625053269102325714361312299011876036815423751522482629914361369303649193526946050137701205931577449326939722902280884984494828850611521784382097900268639648421100760612558110614208245291400961758972415881709281708443424129033685255718996719201537066717587527029554871540574867831957154286334639399985379381455084604901293000229526196544921067214723085504463673412082637877637982771445298815007769526806112008703908400170846707986989384244531990469279604588770393462375930699135443458952703826608237292999895910024613311408883134789788541751697007502656798556053417265191533053158952284994030769145926816478390761642058013769635850833893158830591398862163134753203291719549474871116653745337968227 c = 2998195560453407057321637509862236387961676411996988529185696118404592349869917006166370346762261303282478779647282039317061146533808487789458703169149689179547543732935053220010550004328207373171271534689897340156346458951776319267981966893926724550629182100766890856964207263709029611781806548130358294543573874132473259788387939849997550651614987993962540192023207354839106090274252125961835070701748643163379053118598595995782448140944376681636633592442158453965800439960134688017496184195454406927204485213436540382637720118180670197194949275760000729877093621741313147190401896114633643891311672542703928421032698499968701052818985292683628072129271790220674145955527935027879112279336148316425115255710066132502392447843608711463775710558880259205308541126041959858947252063815158749021817255637836170676726466347847422352280599210078359786387419424076245960344657767332883964636288493649066530215094453490169688507988 p = 177641852143539875144076287104359901067433280125353192376052994247805596999311993133680118926203330508832035411734411354655205181670634659281906946269134849688257950688607255823034295123844247237760781276097419942184026876577385488539741117262151706924975877975832474838035368684036367680294369184184885365711 R.<t1, t2> = Zmod(n // p)[]
t1 = 36612637538559704137020978084239164831057486505073569845873637454679077873685259765691802604546779099912 t2 = 86764840482114786370161852859709669396853471381872969412105255376939704081824493999267048666125470182348 q = p + t1 r = p + t2 phi = (p - 1) * (q - 1) * (r - 1) d = inverse(65537, phi) print(long_to_bytes(int(pow(c, d, n))))