I had something so important to say that I just had to tell three of my friends!
Here’s the provided txt file:
e: 3n1: 96137714481560340073780038250015316564930752333880363375193088083653975552334517899735106334409092229494004991796910602440032630762575914714152238916128674595912438177270978040111855327624812652948702562503276973409716595778936978757384935820012322432156169815110042972411989274515686945691887468406312791931ct1: 45640508926729498938915879450220374487095109122207451961200230820161694723491945276893630019713859109920025191680053056485030809079137883906737197875968862878423820820515399840094772412319820062860149582361429346029277273870654355752499436360499181221418835401103925420623212341317366954144592892392013649421n2: 90990790933807553440094447797505116528289571569256574363585309090304380702927241663491819956599368816997683603352289726407304960362149545383683196526764288524742203975596414405902155486632888712453606841629050125783639571606440840246928825545860143096340538904060826483178577619093666337611264852255012241011ct2: 58149644956871439128498229750735120049939213159976216414725780828349070974351356297226894029560865402164610877553706310307735037479690463594397903663323983980128060190648604447657636452565715178438939334318494616246072096228912870579093620604596752844583453865894005036516299903524382604570097012992290786402n3: 86223965871064436340735834556059627182534224217231808576284808010466364412704836149817574186647031512768701943310184993378236691990480428328117673064942878770269493388776005967773324771885109757090215809598845563135795831857972778498394289917587876390109949975194987996902591291672194435711308385660176310561ct3: 16168828246411344105159374934034075195568461748685081608380235707338908077276221477034184557590734407998991183114724523494790646697027318500705309235429037934125253625837179003478944984233647083364969403257234704649027075136139224424896295334075272153594459752240304700899700185954651799042218888117178057955So we’re given a publix exponent, 3 n’s, and 3 ct’s. This is a classic example of Hastad’s broadcast attack. This site does a great job of explaining it.
We can very easily search up a script for this to decrypt the flag:
e = 3n1 = 96137714481560340073780038250015316564930752333880363375193088083653975552334517899735106334409092229494004991796910602440032630762575914714152238916128674595912438177270978040111855327624812652948702562503276973409716595778936978757384935820012322432156169815110042972411989274515686945691887468406312791931ct1 = 45640508926729498938915879450220374487095109122207451961200230820161694723491945276893630019713859109920025191680053056485030809079137883906737197875968862878423820820515399840094772412319820062860149582361429346029277273870654355752499436360499181221418835401103925420623212341317366954144592892392013649421n2 = 90990790933807553440094447797505116528289571569256574363585309090304380702927241663491819956599368816997683603352289726407304960362149545383683196526764288524742203975596414405902155486632888712453606841629050125783639571606440840246928825545860143096340538904060826483178577619093666337611264852255012241011ct2 = 58149644956871439128498229750735120049939213159976216414725780828349070974351356297226894029560865402164610877553706310307735037479690463594397903663323983980128060190648604447657636452565715178438939334318494616246072096228912870579093620604596752844583453865894005036516299903524382604570097012992290786402n3 = 86223965871064436340735834556059627182534224217231808576284808010466364412704836149817574186647031512768701943310184993378236691990480428328117673064942878770269493388776005967773324771885109757090215809598845563135795831857972778498394289917587876390109949975194987996902591291672194435711308385660176310561ct3 = 16168828246411344105159374934034075195568461748685081608380235707338908077276221477034184557590734407998991183114724523494790646697027318500705309235429037934125253625837179003478944984233647083364969403257234704649027075136139224424896295334075272153594459752240304700899700185954651799042218888117178057955
import gmpy2gmpy2.get_context().precision = 4096
from binascii import unhexlifyfrom functools import reducefrom gmpy2 import root
# Håstad's Broadcast Attack# https://id0-rsa.pub/problem/11/
# Resources# https://en.wikipedia.org/wiki/Coppersmith%27s_Attack# https://github.com/sigh/Python-Math/blob/master/ntheory.py
EXPONENT = 3
CIPHERTEXT_1 = "ciphertext.1"CIPHERTEXT_2 = "ciphertext.2"CIPHERTEXT_3 = "ciphertext.3"
MODULUS_1 = "modulus.1"MODULUS_2 = "modulus.2"MODULUS_3 = "modulus.3"
def chinese_remainder_theorem(items): # Determine N, the product of all n_i N = 1 for a, n in items: N *= n
# Find the solution (mod N) result = 0 for a, n in items: m = N // n r, s, d = extended_gcd(n, m) if d != 1: raise "Input not pairwise co-prime" result += a * s * m
# Make sure we return the canonical solution. return result % N
def extended_gcd(a, b): x, y = 0, 1 lastx, lasty = 1, 0
while b: a, (q, b) = b, divmod(a, b) x, lastx = lastx - q * x, x y, lasty = lasty - q * y, y
return (lastx, lasty, a)
def mul_inv(a, b): b0 = b x0, x1 = 0, 1 if b == 1: return 1 while a > 1: q = a // b a, b = b, a % b x0, x1 = x1 - q * x0, x0 if x1 < 0: x1 += b0 return x1
if __name__ == '__main__': ciphertexts = [ct1, ct2, ct3] modulus = [n1, n2, n3]
C = chinese_remainder_theorem([(ct1, n1), (ct2, n2), (ct3, n3)]) M = int(root(C, 3))
M = hex(M)[2:] print(unhexlify(M).decode('utf-8'))squ1rrel{math_is_too_powerful_1q3y41t1s98u23rf8}