PwnTheBox(Crypto篇)---Rsa
PwnTheBox(Crypto篇)—Rsa
題目描述
from Crypto.Util.number import getPrime,bytes_to_long
flag=open("flag","rb").read()
p=getPrime(1024)
q=getPrime(1024)
assert(e<100000)
n=p*q
m=bytes_to_long(flag)
c=pow(m,e,n)
print c,n
print pow(294,e,n)
p=getPrime(1024)
n=p*q
m=bytes_to_long("BJD"*32)
c=pow(m,e,n)
print c,n
'''
output:
12641635617803746150332232646354596292707861480200207537199141183624438303757120570096741248020236666965755798009656547738616399025300123043766255518596149348930444599820675230046423373053051631932557230849083426859490183732303751744004874183062594856870318614289991675980063548316499486908923209627563871554875612702079100567018698992935818206109087568166097392314105717555482926141030505639571708876213167112187962584484065321545727594135175369233925922507794999607323536976824183162923385005669930403448853465141405846835919842908469787547341752365471892495204307644586161393228776042015534147913888338316244169120 13508774104460209743306714034546704137247627344981133461801953479736017021401725818808462898375994767375627749494839671944543822403059978073813122441407612530658168942987820256786583006947001711749230193542370570950705530167921702835627122401475251039000775017381633900222474727396823708695063136246115652622259769634591309421761269548260984426148824641285010730983215377509255011298737827621611158032976420011662547854515610597955628898073569684158225678333474543920326532893446849808112837476684390030976472053905069855522297850688026960701186543428139843783907624317274796926248829543413464754127208843070331063037
381631268825806469518166370387352035475775677163615730759454343913563615970881967332407709901235637718936184198930226303761876517101208677107311006065728014220477966000620964056616058676999878976943319063836649085085377577273214792371548775204594097887078898598463892440141577974544939268247818937936607013100808169758675042264568547764031628431414727922168580998494695800403043312406643527637667466318473669542326169218665366423043579003388486634167642663495896607282155808331902351188500197960905672207046579647052764579411814305689137519860880916467272056778641442758940135016400808740387144508156358067955215018
979153370552535153498477459720877329811204688208387543826122582132404214848454954722487086658061408795223805022202997613522014736983452121073860054851302343517756732701026667062765906277626879215457936330799698812755973057557620930172778859116538571207100424990838508255127616637334499680058645411786925302368790414768248611809358160197554369255458675450109457987698749584630551177577492043403656419968285163536823819817573531356497236154342689914525321673807925458651854768512396355389740863270148775362744448115581639629326362342160548500035000156097215446881251055505465713854173913142040976382500435185442521721 12806210903061368369054309575159360374022344774547459345216907128193957592938071815865954073287532545947370671838372144806539753829484356064919357285623305209600680570975224639214396805124350862772159272362778768036844634760917612708721787320159318432456050806227784435091161119982613987303255995543165395426658059462110056431392517548717447898084915167661172362984251201688639469652283452307712821398857016487590794996544468826705600332208535201443322267298747117528882985955375246424812616478327182399461709978893464093245135530135430007842223389360212803439850867615121148050034887767584693608776323252233254261047
'''
程式解析
rsa基礎 --> https://blog.csdn.net/qq_52549196/article/details/123491446
from Crypto.Util.number import getPrime, bytes_to_long
flag = open("flag", "rb").read()
p = getPrime(1024) # 得到一個未知素數p
q = getPrime(1024) # 得到一個未知素數q
assert(e < 100000) # e是小於100000
n = p*q
m = bytes_to_long(flag) # flag為m轉成位元組
c = pow(m, e, n)
print c, n
print pow(294, e, n)
p = getPrime(1024) # 再次得到一個未知素數q
n = p*q # 此時的p沒有再次得到,而是與上一個相同
m = bytes_to_long("BJD"*32)
c = pow(m, e, n)
print c, n
拿到flag
將密文 c 解密為明文 m 後再 bytes_to_long
拿到 e
assert(e < 100000)
c = pow(m, e, n)
print c, n
print pow(294, e, n)
從pow(294, e, n)的值中可以爆破出 e 的值
n = 13508774104460209743306714034546704137247627344981133461801953479736017021401725818808462898375994767375627749494839671944543822403059978073813122441407612530658168942987820256786583006947001711749230193542370570950705530167921702835627122401475251039000775017381633900222474727396823708695063136246115652622259769634591309421761269548260984426148824641285010730983215377509255011298737827621611158032976420011662547854515610597955628898073569684158225678333474543920326532893446849808112837476684390030976472053905069855522297850688026960701186543428139843783907624317274796926248829543413464754127208843070331063037
result = 381631268825806469518166370387352035475775677163615730759454343913563615970881967332407709901235637718936184198930226303761876517101208677107311006065728014220477966000620964056616058676999878976943319063836649085085377577273214792371548775204594097887078898598463892440141577974544939268247818937936607013100808169758675042264568547764031628431414727922168580998494695800403043312406643527637667466318473669542326169218665366423043579003388486634167642663495896607282155808331902351188500197960905672207046579647052764579411814305689137519860880916467272056778641442758940135016400808740387144508156358067955215018
for e in range(1000000):
if(pow(294, e, n) == result):
print("e =", e) # e = 52361
break
拿到 q
比如: p*q=n
2 * 3 =6
2 * 7 = 14
由於p,q都是素數,當p相同,q不同時,n 值的最大公因數就為p
由於兩個 n 用的 q 是 同一個 所以可以找到 q 的值
import gmpy2
n1 = 13508774104460209743306714034546704137247627344981133461801953479736017021401725818808462898375994767375627749494839671944543822403059978073813122441407612530658168942987820256786583006947001711749230193542370570950705530167921702835627122401475251039000775017381633900222474727396823708695063136246115652622259769634591309421761269548260984426148824641285010730983215377509255011298737827621611158032976420011662547854515610597955628898073569684158225678333474543920326532893446849808112837476684390030976472053905069855522297850688026960701186543428139843783907624317274796926248829543413464754127208843070331063037
n2 = 12806210903061368369054309575159360374022344774547459345216907128193957592938071815865954073287532545947370671838372144806539753829484356064919357285623305209600680570975224639214396805124350862772159272362778768036844634760917612708721787320159318432456050806227784435091161119982613987303255995543165395426658059462110056431392517548717447898084915167661172362984251201688639469652283452307712821398857016487590794996544468826705600332208535201443322267298747117528882985955375246424812616478327182399461709978893464093245135530135430007842223389360212803439850867615121148050034887767584693608776323252233254261047
print(gmpy2.gcd(n1, n2)) # 99855353761764939308265951492116976798674681282941462516956577712943717850048051273358745095906207085170915794187749954588685850452162165059831749303473106541930948723000882713453679904525655327168665295207423257922666721077747911860159181041422993030618385436504858943615630219459262419715816361781062898911
拿到 d
公式
n=pq
φ(n)=(p-1)(q-1)
(de) mod φ(n) = 1
import gmpy2
n = 13508774104460209743306714034546704137247627344981133461801953479736017021401725818808462898375994767375627749494839671944543822403059978073813122441407612530658168942987820256786583006947001711749230193542370570950705530167921702835627122401475251039000775017381633900222474727396823708695063136246115652622259769634591309421761269548260984426148824641285010730983215377509255011298737827621611158032976420011662547854515610597955628898073569684158225678333474543920326532893446849808112837476684390030976472053905069855522297850688026960701186543428139843783907624317274796926248829543413464754127208843070331063037
q = 99855353761764939308265951492116976798674681282941462516956577712943717850048051273358745095906207085170915794187749954588685850452162165059831749303473106541930948723000882713453679904525655327168665295207423257922666721077747911860159181041422993030618385436504858943615630219459262419715816361781062898911
p = n//q
e = 52361
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
print(d) # 1276549612667235496073062413684557057181896069650439227077329803054445335686784808377690923037459599873467009883319010270651875121757429604270875839653269929942067949999116415472966763781703261391783789416696579230039360655275426092524646237514553620843296246939598642850610281529372695529557731864284109340420883357507020305531046480491317900328979582041526594305177901608995742294702167254904719694767575926422389285466234470975493213355894905893794399011239178089769159371839248867254033385259727103135858943287108430964746755639150797845621865216873608528036490651449334996737443463808057027185022123795910233321
拿到 c
將密文 c 解密為明文m: m = c^d mod n
from Crypto.Util.number import *
import gmpy2
c = 12641635617803746150332232646354596292707861480200207537199141183624438303757120570096741248020236666965755798009656547738616399025300123043766255518596149348930444599820675230046423373053051631932557230849083426859490183732303751744004874183062594856870318614289991675980063548316499486908923209627563871554875612702079100567018698992935818206109087568166097392314105717555482926141030505639571708876213167112187962584484065321545727594135175369233925922507794999607323536976824183162923385005669930403448853465141405846835919842908469787547341752365471892495204307644586161393228776042015534147913888338316244169120
n = 13508774104460209743306714034546704137247627344981133461801953479736017021401725818808462898375994767375627749494839671944543822403059978073813122441407612530658168942987820256786583006947001711749230193542370570950705530167921702835627122401475251039000775017381633900222474727396823708695063136246115652622259769634591309421761269548260984426148824641285010730983215377509255011298737827621611158032976420011662547854515610597955628898073569684158225678333474543920326532893446849808112837476684390030976472053905069855522297850688026960701186543428139843783907624317274796926248829543413464754127208843070331063037
e = 52361
d = 1276549612667235496073062413684557057181896069650439227077329803054445335686784808377690923037459599873467009883319010270651875121757429604270875839653269929942067949999116415472966763781703261391783789416696579230039360655275426092524646237514553620843296246939598642850610281529372695529557731864284109340420883357507020305531046480491317900328979582041526594305177901608995742294702167254904719694767575926422389285466234470975493213355894905893794399011239178089769159371839248867254033385259727103135858943287108430964746755639150797845621865216873608528036490651449334996737443463808057027185022123795910233321
m = pow(c, d, n) # 1625428705257622141630799268122244481687854934813611881085
print(long_to_bytes(m)) # b'BJD{p_is_common_divisor}'
相關文章
- 2019UNCTF-CRYPTO-simple_rsa
- 前端RSA金鑰生成和加解密——window.crypto使用相關前端解密
- crypto
- NSSCTF——crypto
- bugku--crypto
- crypto.randomUUID()randomUI
- Crypto(18)——CTFHub
- Crypto專項
- 乾貨分享:通用加解密函式(crypto),Air780E篇解密函式AI
- python中rsa的RSAPython
- BaseCTF復現-Crypto
- CTF—Crypto基礎
- 2014年澳大利亞資訊保安挑戰 CySCA CTF 官方write up Crypto篇
- Crypto學習筆記筆記
- Crypto 雜題選做
- 攻防世界-Easy_Crypto
- NodeJS加解密之CryptoNodeJS解密
- ModuleNotFoundError: No module named ‘Crypto‘ ‘Cryptodome‘Error
- 第四篇:非對稱加密及RSA加密演算法加密演算法
- RSA加密加密
- Python3之使用CryptoPython
- buuctf中Crypto解題合集
- CF1523E Crypto Lights
- Crypto 基礎知識-01
- BUUCTF Crypto 做題記錄
- CTFshow-Crypto(13-16)
- CTFshow-Crypto(17-25)
- CTFshow-Crypto(1-5)
- CTFshow-Crypto(6-12)
- CTFshow-Crypto(26-29)
- 祥雲杯2020 Crypto wp
- CTFlearn-5x5 Crypto
- RSA入門
- javascript RSA 加密JavaScript加密
- LUC_RSA
- java RSA 解密Java解密
- Node 快速學習 crypto 模組
- Crypto演算法庫詳解演算法