from Crypto.Util.number import * from random import randint,getrandbits from sympy import factorial as factor from gmpy2 import is_prime as is_strongPrime from gmpy2 import gcd from libnum import s2n
from Crypto.Util.number import * defgcd(a,b): if(b==0): return a else: return gcd(b,a%b) leak2 = [362437850887271063413256292444148642949623196635276044583204094265607936120337004605360832421011, 1932915843524327487337992118762711929552569713433223514001673251237692307587356544615955431611435994003602897830069566867051943572065473955405337889221398, 11222178024143398739150445814520244630341642052876364179793404105841311693968292227072031763726153574031884490677131749512430325919668649359617953965112844, 5408933876805830533113961512210040977462510675785228477646978801328722923647434079128879371684477664804744431834418916837956820965870203842552250165916773, 1447143741705069323823257922715038721270982554690635708441585728089036094805730054505696492295730683300002193478561819037345041940787115528445592303142510, 3707657531268843465369646969917923274507341341483950204025637357600814449263032574496424566705812439915548150679438579110456264431525526309588664326456861, 9263925820149827740182684692442727161206242182976684575667062235695526783971703826794731732152445051579616121306722939129265340347908823003172137299057843, 207494591333501391015462321304802957885928775185602834554977737560856036337667840127810136802887548047878444936730742505483927963807357904024967768148122, 7052936859446617933917872361389151092893299250603966165472023802877016733939957851026719428770748111897050866474067880613419756475700748999497496482278608, 1169538791889404037461397919075674424569430764451305755000680272926397357803359328850780774937432248011264334398346178303234064891680342161511829008635621] t = [] for i inrange(9): t.append(leak2[i]-leak2[i-1]) all_n = [] for i inrange(7): all_n.append(gcd((t[i+1]*t[i-1]-t[i]*t[i]), (t[i+2]*t[i]-t[i+1]*t[i+1])))
MMI = lambda A, n,s=1,t=0,N=0: (n < 2and t%N or MMI(n, A%n, t, s-A//n*t, N or n),-1)[n<1] #逆元计算 for p in all_n: p=abs(p) if p==1: continue a=(leak2[2]-leak2[1])*MMI((leak2[1]-leak2[0]),p)%p ani=MMI(a,p) b=(leak2[1]-a*leak2[0])%p seed = (ani*(leak2[0]-b))%p plaintext=seed q = n // p if plaintext.bit_length() >= 63and leak1-p-q==0: #continue print(a) print(b) print(p) print(seed)
通过得到的a,b,seed重新计算seed
1 2 3 4 5 6 7
a = 77103936782340200964969557381530979461498267151335748569651214009683718895787 b = 80415964905483336441916158760498483436647287707097172421898625062076211518999 seed = 4700640019334050676 leak2 = [] for i inrange(10): leak2.append(seed := (seed * a + b) % p) seed = (seed * a + b) % p
接着爆破key得到key
1 2 3 4
for key in trange(60000000+1,10**8 //2+1,-2): if is_prime(key) andnot is_strongPrime(key): print(key) break
拿到key后可求得base,通过final求得c,求解c得到后半段密文
1 2 3 4 5 6 7 8 9 10 11
key = 56052361 base = key ^ seed e=0x10001 d = inverse(e,(p-1)*(q-1)) final = [2268617516274900905319941795987877533673889507146326516564545408684476960310333170888941124460992562245780101836116975666368936099249664924148379487909122, 1445275952377746701088629016221431744592935398639655895336779954310077866709012082302847692239730041591520169244063854849129773530127510048494782550102381, 7] c = 0 u = 0 for i in final: c += final * (base ** u) u += 1 print(long_to_bytes(pow(c,d,n)))
signin
解题人:g0ubu1i
考点:Schmidt-Samoa密码系统
1 2 3 4 5 6 7 8
from Crypto.Util.number import *
c = 29897791365314067508830838449733707533227957127276785142837008063510003132596050393885548439564070678838696563164574990811756434599732001622138564176327233154381380717648392357672642893142367607369679906940371540867456654151408884171467638060523066406441697453971996011548195499549200103123841556085936672833238264876038160712793697159776332101536779874757463509294968879216810485825310481778472384531442206034564488532399171243463881900578407746982324779260941957792455217641883334131366614310644607114128868153897806362954456585661855569432513785225453501792356175649676419772626548071916379318631677869452985829916084336045071072493567871623113923140668031380684940109024609167449291380675124701557542736834722898328082888430566229322840781411336263268594978558564310744076581639469210462567543585251718744340216155557606004995449505782302864725856877289388008819135023371948017425832082773421030256964953984562211638060 N = 3231913372897424708803097969843687520868057190788284975066875241636436021279559026753076528399891936983240045179193386905918743759145596242896507856007669217275515235051689758768735530529408948098860529277921046146065473333357110158008648799207873976745048714516868561754202543130629713461365314627535982379718931633528922076268531363809414255082933615667770491818402126891370106045838695484124212397783571579791558324350069782623908757815983802849109451590357380624488436968737140312471089662428308113246310588336044438265822574558816510054763215983649467009345458480077882624118620789015758507736272402998721366662352794082495441303895025585316667229865533166614969641012195668280586477033200418153345241668242651407009849656745509386158276185301334443855737552801531617549980843398648751032649895403939319648954908487619711555700124294191702406981128355348449748466449951568451135718146828444185238617155432417897711198169 d = 220908195398117048628110042133057032501548264225985823161565460390793825899523662424732910718579350524590368287207857059670558852106434615134645183432670023784725430385048028248108677670095524205518013647694485975996499747580966911259433184798952372110628624294686853944766950244209186984164963987120416687012811346656498861438432610431705868541829977481875385468143747334359481673214618931159403123892213161430602430294790913847722073762999311674428134241956293914716183107414340330449465142849402354034926378025006749405210014879947411570380433942279355488861684317611066949685697268714760755591128598654573304969 l = pow(2,N*d,N)-2 x=GCD(N,pow(2,l)) print(long_to_bytes(pow(c,d,x)))