下载附件,解压打开
encrypt.py内容如下
import hashlib
import sympy
from Crypto.Util.number import *flag = 'GWHT{******}'
secret = '******'assert(len(flag) == 38)
half = len(flag) / 2
flag1 = flag[:half]
flag2 = flag[half:]secret_num = getPrime(1024) * bytes_to_long(secret)
p = sympy.nextprime(secret_num)
q = sympy.nextprime(p)N = p * q
e = 0x10001
F1 = bytes_to_long(flag1)
F2 = bytes_to_long(flag2)c1 = F1 + F2
c2 = pow(F1, 3) + pow(F2, 3)
assert(c2 < N)m1 = pow(c1, e, N)
m2 = pow(c2, e, N)output = open('secret', 'w'
output.write('N=' + str(N) + '\n')
output.write('m1=' + str(m1) + '\n')
output.write('m2=' + str(m2) + '\n')
output.close()
secret内容如下
已知,e,n,m1,m2 可以求出c1,c2。
c1 = F1 + F2
c2 = pow(F1, 3) + pow(F2, 3)
使用factordb.com分解n可得
编写脚本,进行解题
- import gmpy2
- from gmpy2 import *
- from Crypto.Util.number import *
- import sympy
-
- e = 0x10001
- n = 636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163
- m1 = 90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
- m2 = 487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546
- # n=mpz(636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163)
-
- q = next_prime(iroot(n,2)[0])
- p = n//q
-
- d = gmpy2.invert(e, (q-1)*(p-1))#计算逆元
-
- c1 = gmpy2.powmod(m1,d,n)#解密
- c2 = gmpy2.powmod(m2,d,n)#解密
-
- #解方程组c1 = F1 + F2
- # c2 = pow(F1, 3) + pow(F2, 3)
- F1 = sympy.Symbol('F1')#方程组定义变量
- F2 = sympy.Symbol('F2')
- f1 = F1+F2-c1
- f2 = pow(F1,3)+pow(F2,3)-c2
- result = sympy.solve([f1,f2],[F1,F2])
-
- flag1 = long_to_bytes(result[0][1])
- flag2 = long_to_bytes(result[0][0])
- flag = flag1 + flag2
-
- print(flag)
运行得到
[LitCTF 2023]yafu (中级) (素数分解)-CSDN博客
下载附件,内容如下
from Crypto.Util.number import *
from secret import flagm = bytes_to_long(flag)
n = 1
for i in range(15):
n *=getPrime(32)
e = 65537
c = pow(m,e,n)
print(f'n = {n}')
print(f'c = {c}')
'''
n = 15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307
c = 12608550100856399369399391849907846147170257754920996952259023159548789970041433744454761458030776176806265496305629236559551086998780836655717
'''
题目问:你知道yafu分解吗?
yafu是用来分解大素数的,但是没搞太懂这个东西怎么用
使用factordb.com 对n进行分解,得到了15个因子
求这15个数字乘积的欧拉函数再求解
- import gmpy2
- from Crypto.Util.number import long_to_bytes
-
- n = 15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307
-
- e = 65537
- c = 12608550100856399369399391849907846147170257754920996952259023159548789970041433744454761458030776176806265496305629236559551086998780836655717
-
- p1=2151018733
- p2=2201440207
- p3=2315495107
- p4=2585574697
- p5=2719600579
- p6=2758708999
- p7=2767137487
- p8=2906576131
- p9=2923522073
- p10=3354884521
- p11=3355651511
- p12=3989697563
- p13=4021078331
- p14=4044505687
- p15=4171911923
-
-
- phi = (p1 - 1) * (p2 - 1) * (p3 - 1) * (p4 - 1) * (p5 - 1) * (p6 - 1) * (p7 - 1) * (p8 - 1) * (p9 - 1) * (p10 - 1) * (p11 - 1) * (p12 - 1) * (p13 - 1) * (p14 - 1) * (p15 - 1)
- d = gmpy2.invert(e, phi)
- m = pow(c, d, n)
- print(long_to_bytes(m))
运行
得到flag
或者
- from Cryptodome.Util.number import *
- import libnum
- from gmpy2 import gmpy2
-
- e = 65537
- n = 15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307
- c = 12608550100856399369399391849907846147170257754920996952259023159548789970041433744454761458030776176806265496305629236559551086998780836655717
- f_list=libnum.factorize(n)
- print(f_list)
- phi=1
- for f in f_list:
- phi*=(f-1)*f**(f_list[f]-1)
- d=gmpy2.invert(e,phi)
- print(long_to_bytes(pow(c,d,n)))
也可以得到flag
密码CTF_[swpuctf 2021 新生赛]crypto7-CSDN博客
[山海关crypto 训练营 day9]_rsa高位泄露-CSDN博客
下载附件,解压打开
chall.py内容如下
from flag import text,flag
import md5
from Crypto.Util.number import long_to_bytes,bytes_to_long,getPrimeassert md5.new(text).hexdigest() == flag[6:-1]
msg1 = text[:xx]
msg2 = text[xx:yy]
msg3 = text[yy:]msg1 = bytes_to_long(msg1)
msg2 = bytes_to_long(msg2)
msg3 = bytes_to_long(msg3)p1 = getPrime(512)
q1 = getPrime(512)
N1 = p1*q1
e1 = 3
print pow(msg1,e1,N1)
print (e1,N1)p2 = getPrime(512)
q2 = getPrime(512)
N2 = p2*q2
e2 = 17
e3 = 65537
print pow(msg2,e2,N2)
print pow(msg2,e3,N2)
print (e2,N2)
print (e3,N2)p3 = getPrime(512)
q3 = getPrime(512)
N3 = p3*q3
print pow(msg3,e3,N3)
print (e3,N3)
print p3>>200
这题全程看大佬的wp解的
flag如下
3943e8843a19149497956901e5d98639
下载打开附件,内容如下
e = 65537
n = 87924348264132406875276140514499937145050893665602592992418171647042491658461
c = 87677652386897749300638591365341016390128692783949277305987828177045932576708
大整数n分解
得到
p=275127860351348928173285174381581152299 q=319576316814478949870590164193048041239
编写脚本
- from gmpy2 import *
- from Crypto.Util.number import *
- e = 65537
- n = 87924348264132406875276140514499937145050893665602592992418171647042491658461
- c = 87677652386897749300638591365341016390128692783949277305987828177045932576708
- p=275127860351348928173285174381581152299
- q=319576316814478949870590164193048041239
- phi=(q-1)*(p-1)
- d=gmpy2.invert(e,(p-1)*(q-1))
- m=pow(c,d,n)
- print(long_to_bytes(m))
运行后得到flag
下载附件,内容如下
from Crypto.Util.number import *
e=65537
m=bytes_to_long(b'xxxx')
p=getPrime(512)
q=getPrime(512)
n=p*q
phi=(p-1)*(q-1)
d=inverse(e,phi)
dp=d%(p-1)
c=pow(m,e,n)
print("dp=",dp)
print("n=",n)
print("c=",c)
#dp= 5892502924236878675675338970704766304539618343869489297045857272605067962848952532606770917225218534430490745895652561015493032055636004130931491316020329
#n= 50612159190225619689404794427464916374543237300894011803225784470008992781409447214236779975896311093686413491163221778479739252804271270231391599602217675895446538524670610623369953168412236472302812808639218392319634397138871387898452935081756580084070333246950840091192420542761507705395568904875746222477
#c= 39257649468514605476432946851710016346016992413796229928386230062780829495844059368939749930876895443279723032641876662714088329296631207594999580050131450251288839714711436117326769029649419789323982613380617840218087161435260837263996287628129307328857086987521821533565738409794866606381789730458247531619
代码审计,给了dp,分解n
脚本如下:
- dp= 5892502924236878675675338970704766304539618343869489297045857272605067962848952532606770917225218534430490745895652561015493032055636004130931491316020329
- n= 50612159190225619689404794427464916374543237300894011803225784470008992781409447214236779975896311093686413491163221778479739252804271270231391599602217675895446538524670610623369953168412236472302812808639218392319634397138871387898452935081756580084070333246950840091192420542761507705395568904875746222477
- c= 39257649468514605476432946851710016346016992413796229928386230062780829495844059368939749930876895443279723032641876662714088329296631207594999580050131450251288839714711436117326769029649419789323982613380617840218087161435260837263996287628129307328857086987521821533565738409794866606381789730458247531619
-
- def known_dp_e_n_get_p(dp, e, n):
- for i in range(1, e):
- if (dp*e-1)%i == 0:
- if n%(((dp*e-1)//i)+1) == 0:
- p = ((dp*e-1)//i)+1
- print(i, p)
- return p
-
- p = known_dp_e_n_get_p(dp, e, n)
- q = n//p
- phi=(p-1)*(q-1)
- d=inverse(e,phi)
- m = pow(c,d,n)
- long_to_bytes(m)
运行后,可以得到flag
关于dp泄露的一些知识点
[HUBUCTF 2022 新生赛]RSAaaa-CSDN博客
下载附件,内容如下
就你小子是黑客?
我忘记怎么解密了!
靠你了,大黑阔!(536970330703, 65537)
message: 473878130775 40132555282 40132555282 94619939727 72818765591 208015808884 42561234694 159353248388 27748063975 159353248388 159353248388 278953790403 410746718603 496849210942 27748063975 142521857906 103632267191 17774494147 328684046745 278953790403 129956887006 129956887006 366275425558 328684046745 142521857906 410746718603 142521857906 129956887006 379067009467 328684046745 159353248388 366275425558 129956887006 103632267191 27748063975 27748063975 17774494147 160623996897 278953790403 182341799525
观察附件,题目给了n,e,以及40个c的值
模仿大佬编写的脚本
- import gmpy2
- from Crypto.Util.number import *
- from binascii import a2b_hex, b2a_hex
- import binascii
-
-
- c_list = ['473878130775', '40132555282', '40132555282', '94619939727', '72818765591', '208015808884', '42561234694', '159353248388', '27748063975', '159353248388', '159353248388', '278953790403', '410746718603', '496849210942', '27748063975', '142521857906', '103632267191', '17774494147', '328684046745', '278953790403',
- '129956887006', '129956887006', '366275425558', '328684046745', '142521857906', '410746718603', '142521857906', '129956887006', '379067009467', '328684046745', '159353248388', '366275425558', '129956887006', '103632267191', '27748063975', '27748063975', '17774494147', '160623996897', '278953790403', '182341799525']
-
-
- for i in range(len(c_list)):
-
- e = 65537
-
- # c = 473878130775
- # 1.将n分解为p和q
- p = 992623
- q = 540961
- n = p * q
-
- phi = (p - 1) * (q - 1)
- # 2.求d
- d = gmpy2.invert(e, phi)
- # 3.m=pow(c,d,n)
- m = gmpy2.powmod(int(c_list[i]), d, n)
- print(chr(m), end="")
- # binascii.unhexlify(hexstr):从十六进制字符串hexstr返回二进制数据
运行后得到flag
[NISACTF 2022]sign_crypto_n,e,sign crypto解密-CSDN博客
提示为:flag为大写
下载附件,得到一张图片如下
搜索了wp才知道,是LaTeX符号,可以根据LaTeX表进行解密Latex常见符号对照表_latex冒号-CSDN博客
也可以利用这个网站进行解密在线LaTeX公式编辑器-编辑器 (latexlive.com)
在{ }中取每个字段的首字母
注意为大写字母
获得flag:NSSCTF{EDIT_WITH_LATEX}
下载附件,内容如下
import sympy
import randomdef myGetPrime():
A= getPrime(513)
print(A)
B=A-random.randint(1e3,1e5)
print(B)
return sympy.nextPrime((B!)%A)
p=myGetPrime()
#A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
#B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596q=myGetPrime()
#A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
#B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026r=myGetPrime()
n=p*q*r
#n=85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733
c=pow(flag,e,n)
#e=0x1001
#c=75700883021669577739329316795450706204502635802310731477156998834710820770245219468703245302009998932067080383977560299708060476222089630209972629755965140317526034680452483360917378812244365884527186056341888615564335560765053550155758362271622330017433403027261127561225585912484777829588501213961110690451987625502701331485141639684356427316905122995759825241133872734362716041819819948645662803292418802204430874521342108413623635150475963121220095236776428
#so,what is the flag?
B!%A,威尔逊定理:威尔逊定理-CSDN博客
(A−1)!≡−1(modA)
(A−2)!≡1(modA)
脚本如下
-
- from Cryptodome.Util.number import long_to_bytes
- from gmpy2 import *
- from sympy import nextprime
-
- def get_p_q(A,B):
- tmp = 1
- for i in range(B+1,A-1):
- tmp *= i
- tmp %= A
-
- tmp_inv = invert(tmp,A)
- result = nextprime(tmp_inv)
- print(result)
- return result
-
- A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
- B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596
- A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
- B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026
- n = 85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733
- e = 0x1001
- c = 75700883021669577739329316795450706204502635802310731477156998834710820770245219468703245302009998932067080383977560299708060476222089630209972629755965140317526034680452483360917378812244365884527186056341888615564335560765053550155758362271622330017433403027261127561225585912484777829588501213961110690451987625502701331485141639684356427316905122995759825241133872734362716041819819948645662803292418802204430874521342108413623635150475963121220095236776428
-
- p = get_p_q(A1,B1)
- q = get_p_q(A2,B2)
- r = n // p // q
-
- phi = (p - 1) * (q - 1) * (r - 1)
- d = invert(e, phi)
-
- print(long_to_bytes(powmod(c, d, n)))
[RoarCTF2019]RSA_[roarctf 2019]rsa-CSDN博客
下载附件,内容如下
A=(((y%x)**5)%(x%y))**2019+y**316+(y+1)/x
p=next_prime(z*x*y)
q=next_prime(z)
A = 2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
n = 117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
c = 41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128
题目给的n很大,直接把它放到网站上去分解
使用大佬的脚本,爆破e,并得到flag
- import gmpy2
- import libnum
- import sympy
- A = 2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
- n = 117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
- c = 41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128
- p=842868045681390934539739959201847552284980179958879667933078453950968566151662147267006293571765463137270594151138695778986165111380428806545593588078365331313084230014618714412959584843421586674162688321942889369912392031882620994944241987153078156389470370195514285850736541078623854327959382156753458569
- q=139916095583110895133596833227506693679306709873174024876891023355860781981175916446323044732913066880786918629089023499311703408489151181886568535621008644997971982182426706592551291084007983387911006261442519635405457077292515085160744169867410973960652081452455371451222265819051559818441257438021073941183
- phi=(p-1)*(q-1)
- # 爆破e
- for e in range(100000):
- if(gmpy2.gcd(e,phi)==1):
- d=gmpy2.invert(e,phi)
- m=pow(c,d,n)
- flag=libnum.n2s(int(m))
- if('CTF' in str(flag)):
- print(flag)
- break
运行后得到flag
[NCTF2019]childRSA(费马定理)-CSDN博客
下载附件,内容如下
from random import choice
from Crypto.Util.number import isPrime, sieve_base as primes
from flag import flag
def getPrime(bits):
while True:
n = 2
while n.bit_length() < bits:
n *= choice(primes)
if isPrime(n + 1):
return n + 1e = 0x10001
m = int.from_bytes(flag.encode(), 'big')
p, q = [getPrime(2048) for _ in range(2)]
n = p * q
c = pow(m, e, n)# n = 32849718197337581823002243717057659218502519004386996660885100592872201948834155543125924395614928962750579667346279456710633774501407292473006312537723894221717638059058796679686953564471994009285384798450493756900459225040360430847240975678450171551048783818642467506711424027848778367427338647282428667393241157151675410661015044633282064056800913282016363415202171926089293431012379261585078566301060173689328363696699811123592090204578098276704877408688525618732848817623879899628629300385790344366046641825507767709276622692835393219811283244303899850483748651722336996164724553364097066493953127153066970594638491950199605713033004684970381605908909693802373826516622872100822213645899846325022476318425889580091613323747640467299866189070780620292627043349618839126919699862580579994887507733838561768581933029077488033326056066378869170169389819542928899483936705521710423905128732013121538495096959944889076705471928490092476616709838980562233255542325528398956185421193665359897664110835645928646616337700617883946369110702443135980068553511927115723157704586595844927607636003501038871748639417378062348085980873502535098755568810971926925447913858894180171498580131088992227637341857123607600275137768132347158657063692388249513
# c = 26308018356739853895382240109968894175166731283702927002165268998773708335216338997058314157717147131083296551313334042509806229853341488461087009955203854253313827608275460592785607739091992591431080342664081962030557042784864074533380701014585315663218783130162376176094773010478159362434331787279303302718098735574605469803801873109982473258207444342330633191849040553550708886593340770753064322410889048135425025715982196600650740987076486540674090923181664281515197679745907830107684777248532278645343716263686014941081417914622724906314960249945105011301731247324601620886782967217339340393853616450077105125391982689986178342417223392217085276465471102737594719932347242482670320801063191869471318313514407997326350065187904154229557706351355052446027159972546737213451422978211055778164578782156428466626894026103053360431281644645515155471301826844754338802352846095293421718249819728205538534652212984831283642472071669494851823123552827380737798609829706225744376667082534026874483482483127491533474306552210039386256062116345785870668331513725792053302188276682550672663353937781055621860101624242216671635824311412793495965628876036344731733142759495348248970313655381407241457118743532311394697763283681852908564387282605279108
费马小定理 费马小定理详解-CSDN博客
脚本如下
- from Crypto.Util.number import isPrime, sieve_base as primes,long_to_bytes
- import gmpy2
-
- e = 65537
- n = 32849718197337581823002243717057659218502519004386996660885100592872201948834155543125924395614928962750579667346279456710633774501407292473006312537723894221717638059058796679686953564471994009285384798450493756900459225040360430847240975678450171551048783818642467506711424027848778367427338647282428667393241157151675410661015044633282064056800913282016363415202171926089293431012379261585078566301060173689328363696699811123592090204578098276704877408688525618732848817623879899628629300385790344366046641825507767709276622692835393219811283244303899850483748651722336996164724553364097066493953127153066970594638491950199605713033004684970381605908909693802373826516622872100822213645899846325022476318425889580091613323747640467299866189070780620292627043349618839126919699862580579994887507733838561768581933029077488033326056066378869170169389819542928899483936705521710423905128732013121538495096959944889076705471928490092476616709838980562233255542325528398956185421193665359897664110835645928646616337700617883946369110702443135980068553511927115723157704586595844927607636003501038871748639417378062348085980873502535098755568810971926925447913858894180171498580131088992227637341857123607600275137768132347158657063692388249513
- c = 26308018356739853895382240109968894175166731283702927002165268998773708335216338997058314157717147131083296551313334042509806229853341488461087009955203854253313827608275460592785607739091992591431080342664081962030557042784864074533380701014585315663218783130162376176094773010478159362434331787279303302718098735574605469803801873109982473258207444342330633191849040553550708886593340770753064322410889048135425025715982196600650740987076486540674090923181664281515197679745907830107684777248532278645343716263686014941081417914622724906314960249945105011301731247324601620886782967217339340393853616450077105125391982689986178342417223392217085276465471102737594719932347242482670320801063191869471318313514407997326350065187904154229557706351355052446027159972546737213451422978211055778164578782156428466626894026103053360431281644645515155471301826844754338802352846095293421718249819728205538534652212984831283642472071669494851823123552827380737798609829706225744376667082534026874483482483127491533474306552210039386256062116345785870668331513725792053302188276682550672663353937781055621860101624242216671635824311412793495965628876036344731733142759495348248970313655381407241457118743532311394697763283681852908564387282605279108
-
- num=1
- for i in primes:
- num*=i
- p=gmpy2.gcd(gmpy2.powmod(2,num,n)-1,n)
- q=n//p
- d=gmpy2.invert(e,(p-1)*(q-1))
- m=gmpy2.powmod(c,d,n)
-
- print(long_to_bytes(m))
运行得到flag
下载附件,解压打开,内容如下
n = 3454083680130687060405946528826790951695785465926614724373
e = 3
c = 1347530713288996422676156069761604101177635382955634367208
gcd(m, n) = 1
n比较小,可以直接分解n
编写脚本如下
- from gmpy2 import *
- from Cryptodome.Util.number import *
-
- n = 3454083680130687060405946528826790951695785465926614724373
- e = 3
- c = 1347530713288996422676156069761604101177635382955634367208
-
- # 对n进行分解,然后取与e互质的因数,得到新的phi和n。然后求得私钥和m
- p = [17172929050033177661, 11761833764528579549, 17100682436035561357]
- phi = 1
- n = 1
- for i in p:
- if gcd(e, i - 1) == 1:
- print(i)
- print(i-1)
- phi *= i - 1
- print(phi)
- n *= i
-
- d = invert(e, phi)
- print(long_to_bytes(powmod(c, d, n)))
运行得到flag
[HDCTF 2023]Normal_Rsa(revenge)(素数分解)-CSDN博客
确定吗?
下载附件,打开得到内容如下
脚本如下
- import gmpy2
- from Cryptodome.Util.number import *
- P = 8760210374362848654680470219309962250697808334943036049450523139299289451311563307524647192830909610600414977679146980314602124963105772780782771611415961
- Q = 112922164039059900199889201785103245191294292153751065719557417134111270255457254419542226991791126571932603494783040069250074265447784962930254787907978286600866688977261723388531394128477338117384319760669476853506179783674957791710109694089037373611516089267817074863685247440204926676748540110584172821401
- n = 12260605124589736699896772236316146708681543140877060257859757789407603137409427771651536724218984023652680193208019939451539427781667333168267801603484921516526297136507792965087544395912271944257535087877112172195116066600141520444466165090654943192437314974202605817650874838887065260835145310202223862370942385079960284761150198033810408432423049423155161537072427702512211122538749
- c = 7072137651389218220368861685871400051412849006784353415843217734634414633151439071501997728907026771187082554241548140511778339825678295970901188560688120351732774013575439738988314665372544333857252548895896968938603508567509519521067106462947341820462381584577074292318137318996958312889307024181925808817792124688476198837079551204388055776209441429996815747449815546163371300963785
-
- e=0x10001
- p=gmpy2.iroot(P,2)[0]
- q=gmpy2.iroot(Q,2)[0]
- r=n//q//p
- phi=(p-1)*(q-1)*(r-1)
- d = gmpy2.invert(e, phi)
- m = pow(c,d,n)
- print(long_to_bytes(m))
运行后,可以得到flag
下载打开附件,内容如下
from Crypto.Util.number import *
m=bytes_to_long(b'xxxxxx')
p=getPrime(256)
q=getPrime(256)
e=74
n=p*q
c=pow(m,e,n)
print("p=",p)
print("q=",q)
print("c=",c)
#p= 86053582917386343422567174764040471033234388106968488834872953625339458483149
#q= 72031998384560188060716696553519973198388628004850270102102972862328770104493
#c= 3939634105073614197573473825268995321781553470182462454724181094897309933627076266632153551522332244941496491385911139566998817961371516587764621395810123
e是偶数与phi互质,可以找到e与phi的最大公因数s,然后让e除以s,再正常解rsa,只不过得到的不是m而是m的s次幂,
- from Crypto.Util.number import *
- from gmpy2 import *
-
- p = 86053582917386343422567174764040471033234388106968488834872953625339458483149
- q = 72031998384560188060716696553519973198388628004850270102102972862328770104493
- c = 3939634105073614197573473825268995321781553470182462454724181094897309933627076266632153551522332244941496491385911139566998817961371516587764621395810123
- n = p * q
- e = 74
- phi = (p - 1) * (q - 1)
- s = gcd(e, phi)
- d = inverse(e // s, phi)
- m = powmod(c, d, n)
- m1 = iroot(m, s)
- print(long_to_bytes(m1[0]))
运行后,得到flag
bases
下载得到附件,内容如下
BlS0*r4qV&kRo7dh=NuQ+,*0..?ijiJ5L\%>sY13yoQz?wMA6r\X\3W1bWlCTG]XM_t|U4/YUC:hpfL}<)'8n,[dPB\T=
Yd>\,SGYOowHIFx?oZnbhy!WeXWIkR[&R*_saYcoz943\somf'rJTtkn}d|=w$Mv?87DsiMV9dyDxkWd:^$KYRm Xj5D3s[Sb+Eake@>7;hK[jJN53Z]%v)B
base92解码CTF在线工具-在线base92编码|在线base92解码|base92编码|base92解码 (hiencode.com)
base91解码
使用在线工具:CyberChef
BASE85解码
BASE64解码
BASE32解码
BASE16解码
得到flag
2022年HGAME中CRYPTO的RSA Attack2_rsa task.py-CSDN博客
下载解压,打开附件
task.py内容如下
import re
from math import ceil
from Crypto.Util.number import getPrime
from libnum import s2n
from secret import flagflag_parts = list(map(s2n, re.findall(rf".{{,{ceil(len(flag) / 3)}}}", flag)))
print("# task1")
m = flag_parts[0]
e = 65537
p = getPrime(1024)
q = getPrime(1024)
r = getPrime(1024)
n1 = p * q
c1 = pow(m, e, n1)
n2 = r * q
c2 = pow(m, e, n2)
print("e =", e)
print("n1 =", n1)
print("c1 =", c1)
print("n2 =", n2)
print("c2 =", c2)print("# task2")
m = flag_parts[1]
e = 7
p = getPrime(1024)
q = getPrime(1024)
n = p * q
c = pow(m, e, n)
print("e =", e)
print("n =", n)
print("c =", c)print("# task3")
m = flag_parts[2]
p = getPrime(1024)
q = getPrime(1024)
n = p * q
e1 = getPrime(32)
e2 = getPrime(32)
c1 = pow(m, e1, n)
c2 = pow(m, e2, n)
print("n =", n)
print("e1 =", e1)
print("c1 =", c1)
print("e2 =", e2)
print("c2 =", c2)
output.txt内容如下
代码审计
flag_parts = list(map(s2n, re.findall(rf".{{,{ceil(len(flag) / 3)}}}", flag)))
将flag切割成了长度差不多的三部分,还对三部分分别加密
tsak1:欧几里得算法
task2:低加密指数攻击
task3:共模攻击
大佬编写的脚本如下
- from Crypto.Util.number import *
- import gmpy2
-
- # task1
- e = 65537
- n1 = 14611545605107950827581005165327694782823188603151768169731431418361306231114985037775917461433925308054396970809690804073985835376464629860609710292181368600618626590498491850404503443414241455487304448344892337877422465715709154238653505141605904184985311873763495761345722155289457889686019746663293720106874227323699288277794292208957172446523420596391114891559537811029473150123641624108103676516754449492805126642552751278309634846777636042114135990516245907517377320190091400729277307636724890592155256437996566160995456743018225013851937593886086129131351582958811003596445806061492952513851932238563627194553
- c1 = 965075803554932988664271816439183802328812013694203741320763105376036912584995031647672348468111310423680858101990670067065306237596121664884353679987689532305437801346923070145524106271337770666947677115752724993307387122132705797012726237073550669419110046308257408484535063515678066777681017211510981429273346928022971149411064556225001287399141306136081722471075032423079692908380267160214143720516748000734987068685104675254411687005690312116824966036851568223828884335112144637268090397158532937141122654075952730052331573980701136378212002956719295192733955673315234274064519957670199895100508623561838510479
- n2 = 20937478725109983803079185450449616567464596961348727453817249035110047585580142823551289577145958127121586792878509386085178452171112455890429474457797219202827030884262273061334752493496797935346631509806685589179618367453992749753318273834113016237120686880514110415113673431170488958730203963489455418967544128619234394915820392908422974075932751838012185542968842691824203206517795693893863945100661940988455695923511777306566419373394091907349431686646485516325575494902682337518438042711296437513221448397034813099279203955535025939120139680604495486980765910892438284945450733375156933863150808369796830892363
- c2 = 11536506945313747180442473461658912307154460869003392732178457643224057969838224601059836860883718459986003106970375778443725748607085620938787714081321315817144414115589952237492448483438910378865359239575169326116668030463275817609827626048962304593324479546453471881099976644410889657248346038986836461779780183411686260756776711720577053319504691373550107525296560936467435283812493396486678178020292433365898032597027338876045182743492831814175673834198345337514065596396477709839868387265840430322983945906464646824470437783271607499089791869398590557314713094674208261761299894705772513440948139429011425948090
- # task2
- ee = 7
- nn = 14157878492255346300993349653813018105991884577529909522555551468374307942096214964604172734381913051273745228293930832314483466922529240958994897697475939867025561348042725919663546949015024693952641936481841552751484604123097148071800416608762258562797116583678332832015617217745966495992049762530373531163821979627361200921544223578170718741348242012164115593777700903954409103110092921578821048933346893212805071682235575813724113978341592885957767377587492202740185970828629767501662195356276862585025913615910839679860669917255271734413865211340126544199760628445054131661484184876679626946360753009512634349537
- cc = 10262871020519116406312674685238364023536657841034751572844570983750295909492149101500869806418603732181350082576447594766587572350246675445508931577670158295558641219582729345581697448231116318080456112516700717984731655900726388185866905989088504004805024490513718243036445638662260558477697146032055765285263446084259814560197549018044099935158351931885157616527235283229066145390964094929007056946332051364474528453970904251050605631514869007890625
- # task3
- n = 18819509188106230363444813350468162056164434642729404632983082518225388069544777374544142317612858448345344137372222988033366528086236635213756227816610865045924357232188768913642158448603346330462535696121739622702200540344105464126695432011739181531217582949804939555720700457350512898322376591813135311921904580338340203569582681889243452495363849558955947124975293736509426400460083981078846138740050634906824438689712748324336878791622676974341814691041262280604277357889892211717124319329666052810029131172229930723477981468761369516771720250571713027972064974999802168017946274736383148001865929719248159075729
- e11 = 2519901323
- c11 = 3230779726225544872531441169009307072073754578761888387983403206364548451496736513905460381907928107310030086346589351105809028599650303539607581407627819797944337398601400510560992462455048451326593993595089800150342999021874734748066692962362650540036002073748766509347649818139304363914083879918929873577706323599628031618641793074018304521243460487551364823299685052518852685706687800209505277426869140051056996242882132616256695188870782634310362973153766698286258946896866396670872451803114280846709572779780558482223393759475999103607704510618332253710503857561025613632592682931552228150171423846203875344870
- e22 = 3676335737
- c22 = 940818595622279161439836719641707846790294650888799822335007385854166736459283129434769062995122371073636785371800857633841379139761091890426137981113087519934854663776695944489430385663011713917022574342380155718317794204988626116362865144125136624722782309455452257758808172415884403909840651554485364309237853885251876941477098008690389600544398998669635962495989736021020715396415375890720335697504837045188626103142204474942751410819466379437091569610294575687793060945525108986660851277475079994466474859114092643797418927645726430175928247476884879817034346652560116597965191204061051401916282814886688467861
-
- #task1
- p = gmpy2.gcd(n1,n2) # 欧几里得算法
- q = n1 // p
- phi = (p-1)*(q-1)
-
- d = gmpy2.invert(e,phi)
- m = gmpy2.powmod(c1,d,n1)
- m1 = long_to_bytes(m)
-
- #task2
- k = 0
- while 1:
- res = gmpy2.iroot(cc+k*nn,ee) #c+k*n 开3次方根 能开3次方即可
- if(res[1] == True):
- m2=long_to_bytes(res[0]) #转为字符串
- break
- k=k+1
- #task3
- import gmpy2
- def rsa_gong_N_def(e1,e2,c1,c2,n):
- e1, e2, c1, c2, n=int(e1),int(e2),int(c1),int(c2),int(n)
- # print("e1,e2:",e1,e2)
- # print(gmpy2.gcd(e1,e2))
- s = gmpy2.gcdext(e1, e2)
- # print(s)
- s1 = s[1]
- s2 = s[2]
- if s1 < 0:
- s1 = - s1
- c1 = gmpy2.invert(c1, n)
- elif s2 < 0:
- s2 = - s2
- c2 = gmpy2.invert(c2, n)
- m = (pow(c1,s1,n) * pow(c2 ,s2 ,n)) % n
- return long_to_bytes(int(m))
-
- m3 = rsa_gong_N_def(e11,e22,c11,c22,n)
- print(m1+m2+m3)
-
-
运行后可以得到flag