from Crypto.Util.number import getPrime, bytes_to_long, inverse, isPrime from secret import flag m = bytes_to_long(flag) def getSpecialPrime(): a = 2 for i in range(40): a*=getPrime(20) while True: b = getPrime(20) if isPrime(a*b+1): return a*b+1 p = getSpecialPrime() e1 = getPrime(128) e2 = getPrime(128) e3 = getPrime(128) e = pow(e1,pow(e2,e3)) c = pow(m,e,p) assert pow(c,inverse(e,p-1),p) == m print(f'p = {p}') print(f'e1 = {e1}') print(f'e2 = {e2}') print(f'e3 = {e3}') print(f'c = {c}')
適当に肩の位数を計算する〜
from Crypto.Util.number import inverse p = 127557933868274766492781168166651795645253551106939814103375361345423596703884421796150924794852741931334746816404778765897684777811408386179315837751682393250322682273488477810275794941270780027115435485813413822503016999058941190903932883823 e1 = 219560036291700924162367491740680392841 e2 = 325829142086458078752836113369745585569 e3 = 237262361171684477270779152881433264701 c = 962976093858853504877937799237367527464560456536071770645193845048591657714868645727169308285896910567283470660044952959089092802768837038911347652160892917850466319249036343642773207046774240176141525105555149800395040339351956120433647613 ord = prod([f**e - f**(e-1) for f, e in factor(p-1)]) e = int(pow(e1,pow(e2,e3, ord), p-1)) print(bytes.fromhex(hex(pow(c,inverse(e,p-1),p))[2:]))