from secret import flag from Crypto.Util.number import *
p = getPrime(1024) q = getPrime(1024)
N = p*p*q
d= inverse(N, (p-1)*(q-1)//GCD(p-1, q-1))
m = bytes_to_long(flag)
c = pow(m, N, N)
print('c =', c) print('N =', N) print('d =', d)
# c = 1653396627113549535760516503668455111392369905404419847336187180051939350514408518095369852411718553340156505246372037811032919080426885042549723125598742783778413642221563616358386699697645814225855089454045984443096447166740882693228043505960011332616740785976743150624114653594631779427044055729185392854961786323215146318588164139423925400772680226861699990332420246447180631417523181196631188540323779487858453719444807515638025771586275969579201806909799448813112034867089866513864971414742370516244653259347267231436131850871346106316007958256749016599758599549180907260093080500469394473142003147643172770078092713912200110043214435078277125844112816260967490086038358669788006182833272351526796228536135638071670829206746835346784997437044707950580087067666459222916040902038574157577881880027391425763503693184264104932693985833980182986816664377018507487697769866530103927375926578569947076633923873193100147751463 # N = 1768427447158131856514034889456397424027937796617829756303525705316152314769129050888899742667986532346611229157207778487065194513722005516611969754197481310330149721054855689646133721600838194741123290410384315980339516947257172981002480414254023253269098539962527834174781356657779988761754582343096332391763560921491414520707112852896782970123018263505426447126195645371941116395659369152654368118569516482251442513192892626222576419747048343942947570016045016127917578272819812760632788343321742583353340158009324794626006731057267603803701663256706597904789047060978427573361035171008822467120148227698893238773305320215769410594974360573727150122036666987718934166622785421464647946084162895084248352643721808444370307254417501852264572985908550839933862563001186477021313236113690793843893640190378131373214104044465633483953616402680853776480712599669132572907096151664916118185486737463253559093537311036517461749439 # d = 20650646933118544225095544552373007455928574480175801658168105227037950105642248948645762488881219576174131624593293487325329703919313156659700002234392400636474610143032745113473842675857323774566945229148664969659797779146488402588937762391470971617163496433008501858907585683428652637958844902909796849080799141999490231877378863244093900363251415972834146031490928923962271054053278056347181254936750536280638321211545167520935870220829786490686826062142415755063724639110568511969041175019898031990455911525941036727091961083201123910761290998968240338217895275414072475701909497518616112236380389851984377079
p=7, q=11, N=p^2^q=539 , d = N ^-1^ mod lcm ( p − 1 , q − 1 ) = 29
m = 32 , c = m^N^ mod N = 373
验证:
m=c^d^ mod pq = 373 ^29^ mod pq = 373^29^ mod 77 = 32
关于获取pq的问题
由 N = p ^2^ ∗ q , d * N = 1 mod (q-1) (p-1)通过欧拉定理可以得到:
a ^(p1-)(q-1)^ ≡ 1 mod pq
所以:
a^N^ ∗ d = a^1+k∗(q−1)(p−1)^ ≡ a∗a^k∗(q−1)(p−1)^=a mod pq
所以:
k ∗ pq=a^N∗d^ − a pq = gcd(a^N*d^ - a,N) 因为a的取值可以是 a = 2,3,4,5…,这里方便计算我们取 2
解密exp:
1 2 3 4 5 6 7 8 9 10 11 12
from libnum import*
N = 1768427447158131856514034889456397424027937796617829756303525705316152314769129050888899742667986532346611229157207778487065194513722005516611969754197481310330149721054855689646133721600838194741123290410384315980339516947257172981002480414254023253269098539962527834174781356657779988761754582343096332391763560921491414520707112852896782970123018263505426447126195645371941116395659369152654368118569516482251442513192892626222576419747048343942947570016045016127917578272819812760632788343321742583353340158009324794626006731057267603803701663256706597904789047060978427573361035171008822467120148227698893238773305320215769410594974360573727150122036666987718934166622785421464647946084162895084248352643721808444370307254417501852264572985908550839933862563001186477021313236113690793843893640190378131373214104044465633483953616402680853776480712599669132572907096151664916118185486737463253559093537311036517461749439 #N = p^2*q d = 20650646933118544225095544552373007455928574480175801658168105227037950105642248948645762488881219576174131624593293487325329703919313156659700002234392400636474610143032745113473842675857323774566945229148664969659797779146488402588937762391470971617163496433008501858907585683428652637958844902909796849080799141999490231877378863244093900363251415972834146031490928923962271054053278056347181254936750536280638321211545167520935870220829786490686826062142415755063724639110568511969041175019898031990455911525941036727091961083201123910761290998968240338217895275414072475701909497518616112236380389851984377079 c = 1653396627113549535760516503668455111392369905404419847336187180051939350514408518095369852411718553340156505246372037811032919080426885042549723125598742783778413642221563616358386699697645814225855089454045984443096447166740882693228043505960011332616740785976743150624114653594631779427044055729185392854961786323215146318588164139423925400772680226861699990332420246447180631417523181196631188540323779487858453719444807515638025771586275969579201806909799448813112034867089866513864971414742370516244653259347267231436131850871346106316007958256749016599758599549180907260093080500469394473142003147643172770078092713912200110043214435078277125844112816260967490086038358669788006182833272351526796228536135638071670829206746835346784997437044707950580087067666459222916040902038574157577881880027391425763503693184264104932693985833980182986816664377018507487697769866530103927375926578569947076633923873193100147751463
pq = gcd(pow(2,d*N,N)-2,N)
m = pow(c,d,pq) print(n2s(m))
signin[官方解]
考点: p-1光滑,多次rabin :
FLAG:flag{new1sstar_welcome_you}
解题步骤
1 2 3 4 5 6 7
defuniPrime(bits): whileTrue: n = 2 while n.bit_length() < bits: n *= choice(sieve_base) if isPrime(n + 1): return n + 1
from Crypto.Util.number import * N= 3326716005321175474866311915397401254111950808705576293932345690533263108414883877530294339294274914837424580618375346509555627578734883357652996005817766370804842161603027636393776079113035745495508839749006773483720698066943577445977551268093247748313691392265332970992500440422951173889419377779135952537088733 c= 2709336316075650177079376244796188132561250459751152184677022745551914544884517324887652368450635995644019212878543745475885906864265559139379903049221765159852922264140740839538366147411533242116915892792672736321879694956051586399594206293685750573633107354109784921229088063124404073840557026747056910514218246 import gmpy2 a = 2 n = 2 whileTrue: a = pow(a, n, N) res = gmpy2.gcd(a-1, N) if res != 1and res != N: q = N // res p = res break n += 1 print(2**16) e=65536*3 n = p*q x0=gmpy2.invert(p,q) x1=gmpy2.invert(q,p) cs = [c] for i inrange(16): ps = [] for c2 in cs: r = pow(c2, (p + 1) // 4, p) s = pow(c2, (q + 1) // 4, q) x = (r * x1 * q + s * x0 * p) % n y = (r * x1 * q - s * x0 * p) % n if x notin ps: ps.append(x) if n - x notin ps: ps.append(n - x) if y notin ps: ps.append(y) if n - y notin ps: ps.append(n - y) cs = ps for m in ps: flag = long_to_bytes(gmpy2.iroot(m,3)[0]) print(flag)
# h,q = (8916452722821418463248726825721257021744194286874706915832444631771596616116491775091473142798867278598586482678387668986764461265131119164500473719939894343163496325556340181429675937641495981353857724627081847304246987074303722642172988864138967404024201246050387152854001746763104417773214408906879366958729744259612777257542351501592019483745621824894790096639205771421560295175633152877667720038396154571697861326821483170835238092879747297506606983322890706220824261581533324824858599082611886026668788577757970984892292609271082176311433507931993672945925883985629311514143607457603297458439759594085898425992, 31985842636498685945330905726539498901443694955736332073639744466389039373143618920511122288844282849407290205804991634167816417468703459229138891348115191921395278336695684210437130681337971686008048054340499654721317721241239990701099685207253476642931586563363638141636011941268962999641130263828151538489139254625099330199557503153680089387538863574480134898211311252227463870838947777479309928195791241005127445821671684607237706849308372923372795573732000365072815112119533702614620325238183899266147682193892866330678076925199674554569018103164228278742151778832319406135513140669049734660019551179692615505961) # e = 20041713613876382007969284056698149007154248857420752520496829246324512197188211029665990713599667984019715503486507126224558092176392282486689347953069815123212779090783909545244160318938357529307482025697769394114967028564546355310883670462197528011181768588878447856875173263800885048676190978206851268887445527785387532167370943745180538168965461612097037041570912365648125449804109299630958840398397721916860876687808474004391843869813396858468730877627733234832744328768443830669469345926766882446378765847334421595034470639171397587395341977453536859946410431252287203312913117023084978959318406160721042580688 """ from sage.all import * from Crypto.Util.number import long_to_bytes h, q = (8916452722821418463248726825721257021744194286874706915832444631771596616116491775091473142798867278598586482678387668986764461265131119164500473719939894343163496325556340181429675937641495981353857724627081847304246987074303722642172988864138967404024201246050387152854001746763104417773214408906879366958729744259612777257542351501592019483745621824894790096639205771421560295175633152877667720038396154571697861326821483170835238092879747297506606983322890706220824261581533324824858599082611886026668788577757970984892292609271082176311433507931993672945925883985629311514143607457603297458439759594085898425992, 31985842636498685945330905726539498901443694955736332073639744466389039373143618920511122288844282849407290205804991634167816417468703459229138891348115191921395278336695684210437130681337971686008048054340499654721317721241239990701099685207253476642931586563363638141636011941268962999641130263828151538489139254625099330199557503153680089387538863574480134898211311252227463870838947777479309928195791241005127445821671684607237706849308372923372795573732000365072815112119533702614620325238183899266147682193892866330678076925199674554569018103164228278742151778832319406135513140669049734660019551179692615505961) e = 20041713613876382007969284056698149007154248857420752520496829246324512197188211029665990713599667984019715503486507126224558092176392282486689347953069815123212779090783909545244160318938357529307482025697769394114967028564546355310883670462197528011181768588878447856875173263800885048676190978206851268887445527785387532167370943745180538168965461612097037041570912365648125449804109299630958840398397721916860876687808474004391843869813396858468730877627733234832744328768443830669469345926766882446378765847334421595034470639171397587395341977453536859946410431252287203312913117023084978959318406160721042580688 M = Matrix(ZZ, [ [1, h], [0, q] ]) for v in M.LLL(): f, g = v a = e*f % q m = a * inverse_mod(f, g) % g if b'flag' in long_to_bytes(m): print(long_to_bytes(m) """ m = 240545625414656445795697416299836828697587638044418742943136404284040669983557024929358783705357829768985339005 print(long_to_bytes(m))
Smart[官方解]
考点:ECC Smart attack(椭圆曲线trace of Frobenius = 1的情形)
from Crypto.Util.number import * from sage.allimport * deflift_point(E, P): R = P.base_ring() x, y = map(ZZ, P.xy()) PP = E.lift_x(x, all=True) for pt in PP: _, yy = map(R, pt.xy()) if y == yy: return pt p = 75206427479775622966537995406541077245842499523456803092204668034148875719001 a = 40399280641537685263236367744605671534251002649301968428998107181223348036480 b = 34830673418515139976377184302022321848201537906033092355749226925568830384464 E = EllipticCurve(GF(p), [a, b]) G = E(63199291976729017585116731422181573663076311513240158412108878460234764025898, 11977959928854309700611217102917186587242105343137383979364679606977824228558) P = E(75017275378438543246214954287362349176908042127439117734318700769768512624429, 39521483276009738115474714281626894361123804837783117725653243818498259351984) EE = E = EllipticCurve(Qp(p), [int(a) + p * ZZ.random_element(1, p) for a in E.a_invariants()]) x, y = map(ZZ, P.xy()) GG = lift_point(EE, G) PP = lift_point(EE, P) Gp = p * GG Pp = p * PP Gx, Gy = Gp.xy() Px, Py = Pp.xy() d = ZZ((Px / Py) / (Gx / Gy)) % p
# d = 706900059475062772067312229965334421909675651947459433421022963709731965 print(long_to_bytes(d))
""" 考点 lwe FLAG:flag{try_lear1n_wi0h_t1e_error} 解题步骤 """ import re s2n=lambda x: [int(x) for x in re.findall(r"\-?\d+\.?\d*",x)] f=open("./enc.out","r").readlines() m = 66 n = 200 p = 5 q = 2^20 B = [s2n(f[i]) for i inrange(m)] A = [s2n(f[i+66]) for i inrange(m)] C = [s2n(f[i+132]) for i inrange(m)] # print(A) # print(B) # print(C)
b= list(matrix(ZZ,s2n(f[-1]))) m=A+B+C+b M = matrix(ZZ,m) L = M.LLL() print(L[0]) res=M.solve_left(L[0]) for i in res[:-1]: print(chr(abs(i)),end="")