1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| e = 3 n1 = 96137714481560340073780038250015316564930752333880363375193088083653975552334517899735106334409092229494004991796910602440032630762575914714152238916128674595912438177270978040111855327624812652948702562503276973409716595778936978757384935820012322432156169815110042972411989274515686945691887468406312791931 ct1 = 45640508926729498938915879450220374487095109122207451961200230820161694723491945276893630019713859109920025191680053056485030809079137883906737197875968862878423820820515399840094772412319820062860149582361429346029277273870654355752499436360499181221418835401103925420623212341317366954144592892392013649421 n2 = 90990790933807553440094447797505116528289571569256574363585309090304380702927241663491819956599368816997683603352289726407304960362149545383683196526764288524742203975596414405902155486632888712453606841629050125783639571606440840246928825545860143096340538904060826483178577619093666337611264852255012241011 ct2 = 58149644956871439128498229750735120049939213159976216414725780828349070974351356297226894029560865402164610877553706310307735037479690463594397903663323983980128060190648604447657636452565715178438939334318494616246072096228912870579093620604596752844583453865894005036516299903524382604570097012992290786402 n3 = 86223965871064436340735834556059627182534224217231808576284808010466364412704836149817574186647031512768701943310184993378236691990480428328117673064942878770269493388776005967773324771885109757090215809598845563135795831857972778498394289917587876390109949975194987996902591291672194435711308385660176310561 ct3 = 16168828246411344105159374934034075195568461748685081608380235707338908077276221477034184557590734407998991183114724523494790646697027318500705309235429037934125253625837179003478944984233647083364969403257234704649027075136139224424896295334075272153594459752240304700899700185954651799042218888117178057955
import gmpy2 gmpy2.get_context().precision = 4096
from binascii import unhexlify from functools import reduce from gmpy2 import root
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): N = 1 for a, n in items: N *= 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
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'))
|