BUU-RSA

[GKCTF 2021]RRRRsa

 题目

from Crypto.Util.number import *
from gmpy2 import gcd

flag = b'xxxxxxxxxxxxx'
p = getPrime(512)
q = getPrime(512)
m = bytes_to_long(flag)
n = p*q
e = 65537
c = pow(m,e,n)
print('c={}'.format(c))

p1 = getPrime(512)
q1 = getPrime(512)
n1 = p1*q1
e1 = 65537
assert gcd(e1,(p1-1)*(q1-1)) == 1
c1 = pow(p,e1,n1)
print('n1={}'.format(n1))
print('c1={}'.format(c1))
hint1 = pow(2020 * p1 + q1, 202020, n1)
hint2 = pow(2021 * p1 + 212121, q1, n1)
print('hint1={}'.format(hint1))
print('hint2={}'.format(hint2))

p2 = getPrime(512)
q2 = getPrime(512)
n2 = p2*q2
e2 = 65537
assert gcd(e1,(p2-1)*(q2-1)) == 1
c2 = pow(q,e2,n2)
hint3 = pow(2020 * p2 + 2021 * q2, 202020, n2)
hint4 = pow(2021 * p2 + 2020 * q2, 212121, n2)
print('n2={}'.format(n2))
print('c2={}'.format(c2))
print('hint3={}'.format(hint3))
print('hint4={}'.format(hint4))

#c=13492392717469817866883431475453770951837476241371989714683737558395769731416522300851917887957945766132864151382877462142018129852703437240533684604508379950293643294877725773675505912622208813435625177696614781601216465807569201380151669942605208425645258372134465547452376467465833013387018542999562042758
#n1=75003557379080252219517825998990183226659117019770735080523409561757225883651040882547519748107588719498261922816865626714101556207649929655822889945870341168644508079317582220034374613066751916750036253423990673764234066999306874078424803774652754587494762629397701664706287999727238636073466137405374927829
#c1=68111901092027813007099627893896838517426971082877204047110404787823279211508183783468891474661365139933325981191524511345219830693064573462115529345012970089065201176142417462299650761299758078141504126185921304526414911455395289228444974516503526507906721378965227166653195076209418852399008741560796631569
#hint1=23552090716381769484990784116875558895715552896983313406764042416318710076256166472426553520240265023978449945974218435787929202289208329156594838420190890104226497263852461928474756025539394996288951828172126419569993301524866753797584032740426259804002564701319538183190684075289055345581960776903740881951
#hint2=52723229698530767897979433914470831153268827008372307239630387100752226850798023362444499211944996778363894528759290565718266340188582253307004810850030833752132728256929572703630431232622151200855160886614350000115704689605102500273815157636476901150408355565958834764444192860513855376978491299658773170270
#n2=114535923043375970380117920548097404729043079895540320742847840364455024050473125998926311644172960176471193602850427607899191810616953021324742137492746159921284982146320175356395325890407704697018412456350862990849606200323084717352630282539156670636025924425865741196506478163922312894384285889848355244489
#c2=67054203666901691181215262587447180910225473339143260100831118313521471029889304176235434129632237116993910316978096018724911531011857469325115308802162172965564951703583450817489247675458024801774590728726471567407812572210421642171456850352167810755440990035255967091145950569246426544351461548548423025004
#hint3=25590923416756813543880554963887576960707333607377889401033718419301278802157204881039116350321872162118977797069089653428121479486603744700519830597186045931412652681572060953439655868476311798368015878628002547540835719870081007505735499581449077950263721606955524302365518362434928190394924399683131242077
#hint4=104100726926923869566862741238876132366916970864374562947844669556403268955625670105641264367038885706425427864941392601593437305258297198111819227915453081797889565662276003122901139755153002219126366611021736066016741562232998047253335141676203376521742965365133597943669838076210444485458296240951668402513

 从题目可以知道,加密flag的参数p,q被再次加密了。因此要将p,q解密出来在进行常规的RSA解密就可以了。

参数P:

给出了两个同余方程:

 参数q:

这里的思路也是先使用二项式展开消除带p2*q2的项,然后在消元。

 完整代码

from Crypto.Util.number import *
import gmpy2
c=13492392717469817866883431475453770951837476241371989714683737558395769731416522300851917887957945766132864151382877462142018129852703437240533684604508379950293643294877725773675505912622208813435625177696614781601216465807569201380151669942605208425645258372134465547452376467465833013387018542999562042758
n1=75003557379080252219517825998990183226659117019770735080523409561757225883651040882547519748107588719498261922816865626714101556207649929655822889945870341168644508079317582220034374613066751916750036253423990673764234066999306874078424803774652754587494762629397701664706287999727238636073466137405374927829
c1=68111901092027813007099627893896838517426971082877204047110404787823279211508183783468891474661365139933325981191524511345219830693064573462115529345012970089065201176142417462299650761299758078141504126185921304526414911455395289228444974516503526507906721378965227166653195076209418852399008741560796631569
hint1=23552090716381769484990784116875558895715552896983313406764042416318710076256166472426553520240265023978449945974218435787929202289208329156594838420190890104226497263852461928474756025539394996288951828172126419569993301524866753797584032740426259804002564701319538183190684075289055345581960776903740881951
hint2=52723229698530767897979433914470831153268827008372307239630387100752226850798023362444499211944996778363894528759290565718266340188582253307004810850030833752132728256929572703630431232622151200855160886614350000115704689605102500273815157636476901150408355565958834764444192860513855376978491299658773170270
n2=114535923043375970380117920548097404729043079895540320742847840364455024050473125998926311644172960176471193602850427607899191810616953021324742137492746159921284982146320175356395325890407704697018412456350862990849606200323084717352630282539156670636025924425865741196506478163922312894384285889848355244489
c2=67054203666901691181215262587447180910225473339143260100831118313521471029889304176235434129632237116993910316978096018724911531011857469325115308802162172965564951703583450817489247675458024801774590728726471567407812572210421642171456850352167810755440990035255967091145950569246426544351461548548423025004
hint3=25590923416756813543880554963887576960707333607377889401033718419301278802157204881039116350321872162118977797069089653428121479486603744700519830597186045931412652681572060953439655868476311798368015878628002547540835719870081007505735499581449077950263721606955524302365518362434928190394924399683131242077
hint4=104100726926923869566862741238876132366916970864374562947844669556403268955625670105641264367038885706425427864941392601593437305258297198111819227915453081797889565662276003122901139755153002219126366611021736066016741562232998047253335141676203376521742965365133597943669838076210444485458296240951668402513

def get_p():
    global hint1, hint2, n1, c1
    h1=pow(2021,202020,n1)*hint1%n1
    h2=pow(2020,202020,n1)*pow(hint2-212121,202020,n1)
    q1=gmpy2.gcd(h2-h1,n1)
    p1=n1//q1
    phi=(p1-1)*(q1-1)
    d=gmpy2.invert(65537,phi)
    p=pow(c1,d,n1)
    return p

def get_q():
    global hint3,hint4,n2,c2
    res=(pow(hint3,212121,n2)*pow(2021,202020*212121,n2)-pow(hint4,202020,n2)*pow(2020,202020*212121,n2))%n2
    q2=gmpy2.gcd(res,n2)
    p2=n2//q2
    phi=(p2-1)*(q2-1)
    d=gmpy2.invert(65537,phi)
    q=pow(c2,d,n2)
    return q
p=get_p()
q=get_q()
phi=(p-1)*(q-1)
d=gmpy2.invert(65537,phi)
m=pow(c,d,p*q)
print(long_to_bytes(m).decode())

[INSHack2019]Yet Another RSA Challenge - Part 1

题目

import subprocess
p = subprocess.check_output('openssl prime -generate -bits 2048 -hex')
q = subprocess.check_output('openssl prime -generate -bits 2048 -hex')
flag = int('INSA{REDACTED}'.encode('hex'), 16)

N = int(p,16) * int(q,16)
print N
print '0x'+p.replace('9F','FC')
print pow(flag,65537,N)


# n=719579745653303119025873098043848913976880838286635817351790189702008424828505522253331968992725441130409959387942238566082746772468987336980704680915524591881919460709921709513741059003955050088052599067720107149755856317364317707629467090624585752920523062378696431510814381603360130752588995217840721808871896469275562085215852034302374902524921137398710508865248881286824902780186249148613287250056380811479959269915786545911048030947364841177976623684660771594747297272818410589981294227084173316280447729440036251406684111603371364957690353449585185893322538541593242187738587675489180722498945337715511212885934126635221601469699184812336984707723198731876940991485904637481371763302337637617744175461566445514603405016576604569057507997291470369704260553992902776099599438704680775883984720946337235834374667842758010444010254965664863296455406931885650448386682827401907759661117637294838753325610213809162253020362015045242003388829769019579522792182295457962911430276020610658073659629786668639126004851910536565721128484604554703970965744790413684836096724064390486888113608024265771815004188203124405817878645103282802994701531113849607969243815078720289912255827700390198089699808626116357304202660642601149742427766381
# replace=0xDCC5A0BD3A1FC0BEB0DA1C2E8CF6B474481B7C12849B76E03C4C946724DB577D2825D6AA193DB559BC9DBABE1DDE8B5E7805E48749EF002F622F7CDBD7853B200E2A027E87E331AFCFD066ED9900F1E5F5E5196A451A6F9E329EB889D773F08E5FBF45AACB818FD186DD74626180294DCC31805A88D1B71DE5BFEF3ED01F12678D906A833A78EDCE9BDAF22BBE45C0BFB7A82AFE42C1C3B8581C83BF43DFE31BFD81527E507686956458905CC9A660604552A060109DC81D01F229A264AB67C6D7168721AB36DE769CEAFB97F238050193EC942078DDF5329A387F46253A4411A9C8BB71F9AEB11AC9623E41C14FCD2739D76E69283E57DDB11FC531B4611EE3
# c=596380963583874022971492302071822444225514552231574984926542429117396590795270181084030717066220888052607057994262255729890598322976783889090993129161030148064314476199052180347747135088933481343974996843632511300255010825580875930722684714290535684951679115573751200980708359500292172387447570080875531002842462002727646367063816531958020271149645805755077133231395881833164790825731218786554806777097126212126561056170733032553159740167058242065879953688453169613384659653035659118823444582576657499974059388261153064772228570460351169216103620379299362366574826080703907036316546232196313193923841110510170689800892941998845140534954264505413254429240789223724066502818922164419890197058252325607667959185100118251170368909192832882776642565026481260424714348087206462283972676596101498123547647078981435969530082351104111747783346230914935599764345176602456069568419879060577771404946743580809330315332836749661503035076868102720709045692483171306425207758972682717326821412843569770615848397477633761506670219845039890098105484693890695897858251238713238301401843678654564558196040100908796513657968507381392735855990706254646471937809011610992016368630851454275478216664521360246605400986428230407975530880206404171034278692756

由题目可得n,e,c都给出了。p,q都是2048位的素数。在p的16进制中将"9F"替换成了"FC",并且给出了替换后的值。第一反应挺简单的,将变形后的p的16进制中的“FC”替换成"9F"不就还原p了吗,不就分解n了吗,接下来不就是常规的RSA解密吗。结果并非我所预期。

如果原来p的16进制中就有"FC"呢,那么上述做法就是不对的。

思路:变形后的p中一共含有4个“FC”,将这四处“FC”,用"9F","FC"的全排列去替换,如果是正确的p那么它应该可以被n整除。这样就可以将n分解,从而求解

完整代码

import itertools
from Crypto.Util.number import *
import gmpy2

strings = ['9F', 'FC']
combinations = list(itertools.product(strings, repeat=4))
n=719579745653303119025873098043848913976880838286635817351790189702008424828505522253331968992725441130409959387942238566082746772468987336980704680915524591881919460709921709513741059003955050088052599067720107149755856317364317707629467090624585752920523062378696431510814381603360130752588995217840721808871896469275562085215852034302374902524921137398710508865248881286824902780186249148613287250056380811479959269915786545911048030947364841177976623684660771594747297272818410589981294227084173316280447729440036251406684111603371364957690353449585185893322538541593242187738587675489180722498945337715511212885934126635221601469699184812336984707723198731876940991485904637481371763302337637617744175461566445514603405016576604569057507997291470369704260553992902776099599438704680775883984720946337235834374667842758010444010254965664863296455406931885650448386682827401907759661117637294838753325610213809162253020362015045242003388829769019579522792182295457962911430276020610658073659629786668639126004851910536565721128484604554703970965744790413684836096724064390486888113608024265771815004188203124405817878645103282802994701531113849607969243815078720289912255827700390198089699808626116357304202660642601149742427766381
s="0xDCC5A0BD3A1FC0BEB0DA1C2E8CF6B474481B7C12849B76E03C4C946724DB577D2825D6AA193DB559BC9DBABE1DDE8B5E7805E48749EF002F622F7CDBD7853B200E2A027E87E331AFCFD066ED9900F1E5F5E5196A451A6F9E329EB889D773F08E5FBF45AACB818FD186DD74626180294DCC31805A88D1B71DE5BFEF3ED01F12678D906A833A78EDCE9BDAF22BBE45C0BFB7A82AFE42C1C3B8581C83BF43DFE31BFD81527E507686956458905CC9A660604552A060109DC81D01F229A264AB67C6D7168721AB36DE769CEAFB97F238050193EC942078DDF5329A387F46253A4411A9C8BB71F9AEB11AC9623E41C14FCD2739D76E69283E57DDB11FC531B4611EE3"
s_list=s.split("FC")#以FC去做分割
p=0
q=0
c=596380963583874022971492302071822444225514552231574984926542429117396590795270181084030717066220888052607057994262255729890598322976783889090993129161030148064314476199052180347747135088933481343974996843632511300255010825580875930722684714290535684951679115573751200980708359500292172387447570080875531002842462002727646367063816531958020271149645805755077133231395881833164790825731218786554806777097126212126561056170733032553159740167058242065879953688453169613384659653035659118823444582576657499974059388261153064772228570460351169216103620379299362366574826080703907036316546232196313193923841110510170689800892941998845140534954264505413254429240789223724066502818922164419890197058252325607667959185100118251170368909192832882776642565026481260424714348087206462283972676596101498123547647078981435969530082351104111747783346230914935599764345176602456069568419879060577771404946743580809330315332836749661503035076868102720709045692483171306425207758972682717326821412843569770615848397477633761506670219845039890098105484693890695897858251238713238301401843678654564558196040100908796513657968507381392735855990706254646471937809011610992016368630851454275478216664521360246605400986428230407975530880206404171034278692756
for i in range(len(combinations)):
    tmp=''
    for j in range(len(s_list)):
        if j!=4:
            tmp=tmp+s_list[j]+combinations[i][j]
        if j==4:
            tmp+=s_list[j]
    if n%int(tmp,16)==0:
        p=int(tmp,16)
        q=n//p
        break
phi=(p-1)*(q-1)
d=gmpy2.invert(65537,phi)
m=pow(c,d,n)
print(long_to_bytes(m).decode())

[羊城杯 2020]RRRRRRRSA

 题目:

import hashlib
import sympy
from Crypto.Util.number import *

flag = 'GWHT{************}'

flag1 = flag[:19].encode()
flag2 = flag[19:].encode()
assert(len(flag) == 38)

P1 = getPrime(1038)
P2 = sympy.nextprime(P1)
assert(P2 - P1 < 1000)

Q1 = getPrime(512)
Q2 = sympy.nextprime(Q1)

N1 = P1 * P1 * Q1
N2 = P2 * P2 * Q2

E1 = getPrime(1024)
E2 = sympy.nextprime(E1)

m1 = bytes_to_long(flag1)
m2 = bytes_to_long(flag2)

c1 = pow(m1, E1, N1)
c2 = pow(m2, E2, N2)


output = open('secret', 'w')
output.write('N1=' + str(N1) + '\n')
output.write('c1=' + str(c1) + '\n')
output.write('E1=' + str(E1) + '\n')
output.write('N2=' + str(N2) + '\n')
output.write('c2=' + str(c2) + '\n')
output.write('E2=' + str(E2) + '\n')
output.close()

 题目将flag一分为二,分别进行加密。p1,p2是相邻的1038位素数,Q1,Q2是相邻的512位素数。

N1=p1^2*Q1,N2=p2^2*Q2。

已知n,e,c的一般思路是看能不能分解n,这里的e很大,在e过大或过小的时候可以考虑维纳攻击。

factordb:

N1:

分解失败 

 N2:

N2分解成功了,可以根据位数来确定Q2,N2//Q2在开平方根就可以获得p2,p2的前一个素数就是p1,因此所有的参数就都得到了,可以进行常规求解。

维纳:

可以使用这个脚本。rsa-wiener-attack

测试了两组e,n都不行。

维纳攻击原理:

 这里可以借用维纳攻击的思想:

 当然了可以写个程序测试一下:

from Crypto.Util.number import *
import sympy
p=0
q=0
while 1:
    p=getPrime(1038)
    q=sympy.nextprime(p)
    if q-p<1000:
        break
print(p/q)

output:

 

 完整代码:

from Crypto.Util.number import *
import gmpy2
import sympy
N1=60143104944034567859993561862949071559877219267755259679749062284763163484947626697494729046430386559610613113754453726683312513915610558734802079868190554644983911078936369464590301246394586190666760362763580192139772729890492729488892169933099057105842090125200369295070365451134781912223048179092058016446222199742919885472867511334714233086339832790286482634562102936600597781342756061479024744312357407750731307860842457299116947352106025529309727703385914891200109853084742321655388368371397596144557614128458065859276522963419738435137978069417053712567764148183279165963454266011754149684758060746773409666706463583389316772088889398359242197165140562147489286818190852679930372669254697353483887004105934649944725189954685412228899457155711301864163839538810653626724347
c1=55094296873556883585060020895253176070835143350249581136609315815308788255684072804968957510292559743192424646169207794748893753882418256401223641287546922358162629295622258913168323493447075410872354874300793298956869374606043622559405978242734950156459436487837698668489891733875650048466360950142617732135781244969524095348835624828008115829566644654403962285001724209210887446203934276651265377137788183939798543755386888532680013170540716736656670269251318800501517579803401154996881233025210176293554542024052540093890387437964747460765498713092018160196637928204190194154199389276666685436565665236397481709703644555328705818892269499380797044554054118656321389474821224725533693520856047736578402581854165941599254178019515615183102894716647680969742744705218868455450832
E1=125932919717342481428108392434488550259190856475011752106073050593074410065655587870702051419898088541590032209854048032649625269856337901048406066968337289491951404384300466543616578679539808215698754491076340386697518948419895268049696498272031094236309803803729823608854215226233796069683774155739820423103
N2=60143104944034567859993561862949071559877219267755259679749062284763163484947626697494729046430386559610613113754453726683312513915610558734802079868195633647431732875392121458684331843306730889424418620069322578265236351407591029338519809538995249896905137642342435659572917714183543305243715664380787797562011006398730320980994747939791561885622949912698246701769321430325902912003041678774440704056597862093530981040696872522868921139041247362592257285423948870944137019745161211585845927019259709501237550818918272189606436413992759328318871765171844153527424347985462767028135376552302463861324408178183842139330244906606776359050482977256728910278687996106152971028878653123533559760167711270265171441623056873903669918694259043580017081671349232051870716493557434517579121
c2=39328446140156257571484184713861319722905864197556720730852773059147902283123252767651430278357950872626778348596897711320942449693270603776870301102881405303651558719085454281142395652056217241751656631812580544180434349840236919765433122389116860827593711593732385562328255759509355298662361508611531972386995239908513273236239858854586845849686865360780290350287139092143587037396801704351692736985955152935601987758859759421886670907735120137698039900161327397951758852875291442188850946273771733011504922325622240838288097946309825051094566685479503461938502373520983684296658971700922069426788236476575236189040102848418547634290214175167767431475003216056701094275899211419979340802711684989710130215926526387138538819531199810841475218142606691152928236362534181622201347
E2=125932919717342481428108392434488550259190856475011752106073050593074410065655587870702051419898088541590032209854048032649625269856337901048406066968337289491951404384300466543616578679539808215698754491076340386697518948419895268049696498272031094236309803803729823608854215226233796069683774155739820425393

fenshu=sympy.Rational(N1,N2)#有理数对象
cf=list(sympy.continued_fraction(fenshu))#获取连分数
jj=list(sympy.continued_fraction_convergents(cf))#获取渐进分数

Q1=0
Q2=0
for item in jj:
    fenzi=item.numerator
    fenmu=item.denominator
    if fenzi==0 or fenmu==0:
        continue
    if N1%fenzi==0 and N2%fenmu==0 and fenzi.bit_length()==512:
        Q1=fenzi
        Q2=fenmu
        break
p1=gmpy2.iroot(N1//Q1,2)[0]
p2=gmpy2.iroot(N2//Q2,2)[0]
phi1=p1*(p1-1)*(Q1-1)
phi2=p2*(p2-1)*(Q2-1)

d1=gmpy2.invert(E1,phi1)
d2=gmpy2.invert(E2,phi2)

m1=pow(c1,d1,N1)
m2=pow(c2,d2,N2)

print(long_to_bytes(m1).decode()+long_to_bytes(m2).decode())

[NCTF2019]easyRSA

 题目:

from flag import flag

e = 0x1337  #4919
p = 199138677823743837339927520157607820029746574557746549094921488292877226509198315016018919385259781238148402833316033634968163276198999279327827901879426429664674358844084491830543271625147280950273934405879341438429171453002453838897458102128836690385604150324972907981960626767679153125735677417397078196059
q = 112213695905472142415221444515326532320352429478341683352811183503269676555434601229013679319423878238944956830244386653674413411658696751173844443394608246716053086226910581400528167848306119179879115809778793093611381764939789057524575349501163689452810148280625226541609383166347879832134495444706697124741
n = p * q

assert(flag.startswith('NCTF'))
m = int.from_bytes(flag.encode(), 'big')
assert(m.bit_length() > 1337)

c = pow(m, e, n)
print(c)
# 10562302690541901187975815594605242014385201583329309191736952454310803387032252007244962585846519762051885640856082157060593829013572592812958261432327975138581784360302599265408134332094134880789013207382277849503344042487389850373487656200657856862096900860792273206447552132458430989534820256156021128891296387414689693952047302604774923411425863612316726417214819110981605912408620996068520823370069362751149060142640529571400977787330956486849449005402750224992048562898004309319577192693315658275912449198365737965570035264841782399978307388920681068646219895287752359564029778568376881425070363592696751183359

乍一看,这题真好,e,p,q,n,c都有了,就差一个d就可以进行解密了。pow(c,d,n)。

可是gcd(e,p-1),gcd(e,q-1)都等于e。

就不能使用这一招了:

同时这题还有:

e和phi的最大公因数 4919
e和p-1的最大公因数 4919
e和q-1的最大公因数 4919

e|p-1  e|q-1。这里可以使用AMM算法在有限域中开n次方来得到一个n次方根,然后得到n个n次单位根,利用一个n次方根和n个n次单位根来得到n个n次方根。在用中国剩余定理将他们组合就可以得到模n下的m,通过判断b'NCTF'是否在字节流中来得到想要的m。

完整代码(Sage):

from Crypto.Util.number import *
import gmpy2
import random
import math
import libnum
import time
import sys
def findAll(m0,root,p):
    #root是e个e次单位根
    print("开始获取所有根")
    start=time.time()
    allroot=set()
    for num in root:
        allroot.add(num*m0%p)
    print("根获取完毕,耗时:",time.time()-start)
    return allroot

def find(e,p):
    print("开始获取单位根")
    start=time.time()
    root = set()
    while len(root) < e:
        root.add(pow(random.randint(2, p - 1), (p - 1) // e, p))
    print("单位根获取结束,耗时:",time.time()-start)
    return root
def AMM(residue,r,p):
    print("AMM算法开始")
    # 计算t,s
    t = 0
    s = p - 1
    while s % r == 0:
        t += 1
        s = s // r
    print("t=",t)
    print("s=",s)
    #计算alpha
    k=1
    while ( k * s + 1 ) % r != 0:
        k+=1
    alpha=(k*s+1)//r
    print("alpha=",alpha)
    #当t=1时的情况
    if t==1:
        m0=pow(residue,alpha,p)
        print("AMM得到的一个根为mp:",m0)
        print("AMM算法结束")
        return m0
    #t>=2的情况
    #计算一个r次非剩余
    noresidue = random.randint(1, p)
    while pow(noresidue, (p - 1) // r, p) == 1:
        noresidue = random.randint(1, p)
    print("选择的非e次剩余=",noresidue)
    a=pow( noresidue , ( r ** ( t-1 )) * s, p )
    b=pow( residue , r * alpha - 1, p )
    c=pow( noresidue , s , p )
    h=1
    for i in range(1,t):
        d=pow( b , r ** ( t-1-i ) , p )
        if d==1:
            j=0
        else:
            j=-math.log(d,a)
        b=pow( pow ( c , r , p ) , j , p ) * b % p
        h=pow( c , j , p ) * h % p
        c=pow( c , r , p )
    m0=pow( residue , alpha , p ) * h % p
    print("AMM得到的一个根为mp:",m0)
    print("AMM算法结束")
    return m0
e = 4919
p = 199138677823743837339927520157607820029746574557746549094921488292877226509198315016018919385259781238148402833316033634968163276198999279327827901879426429664674358844084491830543271625147280950273934405879341438429171453002453838897458102128836690385604150324972907981960626767679153125735677417397078196059
q = 112213695905472142415221444515326532320352429478341683352811183503269676555434601229013679319423878238944956830244386653674413411658696751173844443394608246716053086226910581400528167848306119179879115809778793093611381764939789057524575349501163689452810148280625226541609383166347879832134495444706697124741
c = 10562302690541901187975815594605242014385201583329309191736952454310803387032252007244962585846519762051885640856082157060593829013572592812958261432327975138581784360302599265408134332094134880789013207382277849503344042487389850373487656200657856862096900860792273206447552132458430989534820256156021128891296387414689693952047302604774923411425863612316726417214819110981605912408620996068520823370069362751149060142640529571400977787330956486849449005402750224992048562898004309319577192693315658275912449198365737965570035264841782399978307388920681068646219895287752359564029778568376881425070363592696751183359
n = p * q
phi=(p-1)*(q-1)
# print("e和phi的最大公因数",gmpy2.gcd(e,phi))
# print("e和p-1的最大公因数",gmpy2.gcd(e,p-1))
# print("e和q-1的最大公因数",gmpy2.gcd(e,q-1))

cp=c%p
cq=c%q
#通过AMM得到一个根
mp=AMM(cp,e,p)
mq=AMM(cq,e,q)

#得到p,q各自的e次单位根
root_p=find(e,p)
root_q=find(e,q)
# print("p,q各自的e次单位根获取完毕")
# #通过AMM得到的根和各自的单位根得到所有的根
allroot_p=findAll(mp,root_p,p)
allroot_q=findAll(mq,root_q,q)
k=0
print("开始进行CRT")
start=time.time()
for num1 in allroot_p:
    for num2 in allroot_q:
        k+=1
        yushu=[int(num1),int(num2)]
        moshu=[int(p),int(q)]
        res=CRT_list(yushu,moshu)
        if b'NCTF' in long_to_bytes(res):
            print("find it!!!")
            print("当前是第{}次".format(k))
            print(long_to_bytes(res))
            print("CRT耗时:", time.time() - start)
            sys.exit()
    print("当前是第{}次,当前CRT耗时{}".format(k,time.time()-start))#一共24196561次

 output:

注意:这里要使用sagemath里面的CRT_list函数来计算中国剩余定理会很快,由于我之前一直都是使用libnum.solve_crt函数来求解中国剩余定理,因此那时一直爆不出。

 

 附一份官方脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值