当前位置: 首页 > news >正文

[羊城杯 2020]Power

目录

1.题目

2.分析

3.解题

4.参考


1.题目

题目只给了一个py代码文件:

Power:

from Crypto.Util.number import *
import gmpy2
from secret import flagp = getPrime(512)
q = getPrime(512)
n = p**4*qe = 0x10001
phi = gmpy2.lcm(p - 1, q - 1)
d = gmpy2.invert(e, phi)
dp = d % (p - 1)
m = bytes_to_long(flag)
c = pow(m, e, n)
print "dp = " + str(dp)
print "c = " + str(c)y = 449703347709287328982446812318870158230369688625894307953604074502413258045265502496365998383562119915565080518077360839705004058211784369656486678307007348691991136610142919372779782779111507129101110674559235388392082113417306002050124215904803026894400155194275424834577942500150410440057660679460918645357376095613079720172148302097893734034788458122333816759162605888879531594217661921547293164281934920669935417080156833072528358511807757748554348615957977663784762124746554638152693469580761002437793837094101338408017407251986116589240523625340964025531357446706263871843489143068620501020284421781243879675292060268876353250854369189182926055204229002568224846436918153245720514450234433170717311083868591477186061896282790880850797471658321324127334704438430354844770131980049668516350774939625369909869906362174015628078258039638111064842324979997867746404806457329528690722757322373158670827203350590809390932986616805533168714686834174965211242863201076482127152571774960580915318022303418111346406295217571564155573765371519749325922145875128395909112254242027512400564855444101325427710643212690768272048881411988830011985059218048684311349415764441760364762942692722834850287985399559042457470942580456516395188637916303814055777357738894264037988945951468416861647204658893837753361851667573185920779272635885127149348845064478121843462789367112698673780005436144393573832498203659056909233757206537514290993810628872250841862059672570704733990716282248839
g = 2
x = 2019*p**2 + 2020*p**3 + 2021*p**4
c1 = pow(g, x, y)
print "c1 = " + str(c1)# dp = 3272293505696712831419859641571956066667516012597886098021642320155056349966612629986261146617139998624603483170466852538289743936225789351270153550594329
# c = 22524257534087703614496632403022329621384173069680778965750290698059674588465640878754707363673789674111671270645152584118206145007310499274423606886261969807360070526126452646719628307689968971699215841867636770320159256301550908771135042912287955209485328267670825390080110910391913063177323585204392804538642393453388536211144485389902591029350060800993352969569703901717308330574394200996651534321547814313195218895547718815009876393987398738932001924661338796059973950012706427109598830049455186171345179840564502215531573714428772608739268313985559628612004439028014417408631851880698512023740903181116906766066951473942201698375224240271523568161242951730224901227589413731025281719101368668617497947995579443908773425555177346524678673641140157885033923288401884
# c1 = 290707924192892686920253390955676600323331633814839708838347288502692494699485764473635783441705302268064111648851157070038783719749721994682837294625334517914882191486257362565066745587415388291939979195637720350919055988532145531805200483161599965215275808797976727969023747299578173497083532351976473770041800769265319548352841139802163279116490053292316399038329210043455932786945180855178341998049756983301499491011851026499269682821602212971062877270127451987836730083380463825717889123804613394241190839837791281657872259492589868751745327696030438893865069941066073554427558697972551085353027574529823439588670263047287131740802375738439636789806332323994866753085014446479034974063195632514803340511247735647970572837053148490258113394359072976858781060349776921428492973183958437965966963122069107876143476772436757554253049619918403996315720023020827394900507088006299225934263699192253079026440287311664705744424959801981503191480257138833694306501816837037995549817186335377411638035575004595417788588264823861850877111374085336446477943372458378834664678094751978400910288151519902977326995118727880223621964441498323865158898463327323193833062919619201107279964663654606753750042791368210261574897455830722232022689695292080269205470491791950839486861811469879413313773338916781857981641910031441448964144000585506870170898052132929034349451945051362244755750988705018897859238859476967568556992146975789444151432386692872801263000639711599152191790766776280

2.分析

这道题目看起来是RSA加密题,数据给了dp、c、c1,中出现了dp的字样,我们首先想到常见dp泄露这种题型。

具体解题,参考大佬的wp,p的求解是最重要的一步,有两种思路:

一种是根据dp推导出p,一种是利用sympy求出x,再使用sage解数学方程得到p,得到p后步骤就一致了。

3.解题

第一种:

根据dp,推导出p:

首先我们得知道,经过数学推导我们能够得到这样一个式子:

dp\cdot e=x\cdot (p-1)+1

x= \frac{dp\cdot e - 1}{p-1} <e

所以我们可以在(1, e)得范围内爆破x,进而根据上式得到p的值,这个消耗的时间比较久,有一个多小时:

g = 2
e = 65537
dp = 3272293505696712831419859641571956066667516012597886098021642320155056349966612629986261146617139998624603483170466852538289743936225789351270153550594329
c1 = 290707924192892686920253390955676600323331633814839708838347288502692494699485764473635783441705302268064111648851157070038783719749721994682837294625334517914882191486257362565066745587415388291939979195637720350919055988532145531805200483161599965215275808797976727969023747299578173497083532351976473770041800769265319548352841139802163279116490053292316399038329210043455932786945180855178341998049756983301499491011851026499269682821602212971062877270127451987836730083380463825717889123804613394241190839837791281657872259492589868751745327696030438893865069941066073554427558697972551085353027574529823439588670263047287131740802375738439636789806332323994866753085014446479034974063195632514803340511247735647970572837053148490258113394359072976858781060349776921428492973183958437965966963122069107876143476772436757554253049619918403996315720023020827394900507088006299225934263699192253079026440287311664705744424959801981503191480257138833694306501816837037995549817186335377411638035575004595417788588264823861850877111374085336446477943372458378834664678094751978400910288151519902977326995118727880223621964441498323865158898463327323193833062919619201107279964663654606753750042791368210261574897455830722232022689695292080269205470491791950839486861811469879413313773338916781857981641910031441448964144000585506870170898052132929034349451945051362244755750988705018897859238859476967568556992146975789444151432386692872801263000639711599152191790766776280
y = 449703347709287328982446812318870158230369688625894307953604074502413258045265502496365998383562119915565080518077360839705004058211784369656486678307007348691991136610142919372779782779111507129101110674559235388392082113417306002050124215904803026894400155194275424834577942500150410440057660679460918645357376095613079720172148302097893734034788458122333816759162605888879531594217661921547293164281934920669935417080156833072528358511807757748554348615957977663784762124746554638152693469580761002437793837094101338408017407251986116589240523625340964025531357446706263871843489143068620501020284421781243879675292060268876353250854369189182926055204229002568224846436918153245720514450234433170717311083868591477186061896282790880850797471658321324127334704438430354844770131980049668516350774939625369909869906362174015628078258039638111064842324979997867746404806457329528690722757322373158670827203350590809390932986616805533168714686834174965211242863201076482127152571774960580915318022303418111346406295217571564155573765371519749325922145875128395909112254242027512400564855444101325427710643212690768272048881411988830011985059218048684311349415764441760364762942692722834850287985399559042457470942580456516395188637916303814055777357738894264037988945951468416861647204658893837753361851667573185920779272635885127149348845064478121843462789367112698673780005436144393573832498203659056909233757206537514290993810628872250841862059672570704733990716282248839for i in range(1, e):if (dp * e - 1) % i == 0:p = (dp * e - 1) // i + 1x = 2019 * p**2 + 2020 * p**3 + 2021 * p**4c2 = pow(g, x, y)if c1 == c2:print(i)print(p)break#i
#5535722692962580764045545539105119140941061679289569420988353884209653851308860058948669740693107863231179565602072744542122031789184119031739723962825082929025825322421201364211726001366490949760887367407718763255964735567971493859197583624076478457865073449246835949075135223468616834636386958924709024763349115622062848212445867198457630368236782421195503713107838541903829979118327675371550868768159024260793541264335548489228744367609071659968450303895118817379316060805148754136917043160175570565717388336822960389664337656603584425629662613786203920234401824957121860225422901340950436355650311392398098947210940

第二种方法,先利用sympy解出x,再利用sage解出p:

import sympyy = 449703347709287328982446812318870158230369688625894307953604074502413258045265502496365998383562119915565080518077360839705004058211784369656486678307007348691991136610142919372779782779111507129101110674559235388392082113417306002050124215904803026894400155194275424834577942500150410440057660679460918645357376095613079720172148302097893734034788458122333816759162605888879531594217661921547293164281934920669935417080156833072528358511807757748554348615957977663784762124746554638152693469580761002437793837094101338408017407251986116589240523625340964025531357446706263871843489143068620501020284421781243879675292060268876353250854369189182926055204229002568224846436918153245720514450234433170717311083868591477186061896282790880850797471658321324127334704438430354844770131980049668516350774939625369909869906362174015628078258039638111064842324979997867746404806457329528690722757322373158670827203350590809390932986616805533168714686834174965211242863201076482127152571774960580915318022303418111346406295217571564155573765371519749325922145875128395909112254242027512400564855444101325427710643212690768272048881411988830011985059218048684311349415764441760364762942692722834850287985399559042457470942580456516395188637916303814055777357738894264037988945951468416861647204658893837753361851667573185920779272635885127149348845064478121843462789367112698673780005436144393573832498203659056909233757206537514290993810628872250841862059672570704733990716282248839
c1 = 290707924192892686920253390955676600323331633814839708838347288502692494699485764473635783441705302268064111648851157070038783719749721994682837294625334517914882191486257362565066745587415388291939979195637720350919055988532145531805200483161599965215275808797976727969023747299578173497083532351976473770041800769265319548352841139802163279116490053292316399038329210043455932786945180855178341998049756983301499491011851026499269682821602212971062877270127451987836730083380463825717889123804613394241190839837791281657872259492589868751745327696030438893865069941066073554427558697972551085353027574529823439588670263047287131740802375738439636789806332323994866753085014446479034974063195632514803340511247735647970572837053148490258113394359072976858781060349776921428492973183958437965966963122069107876143476772436757554253049619918403996315720023020827394900507088006299225934263699192253079026440287311664705744424959801981503191480257138833694306501816837037995549817186335377411638035575004595417788588264823861850877111374085336446477943372458378834664678094751978400910288151519902977326995118727880223621964441498323865158898463327323193833062919619201107279964663654606753750042791368210261574897455830722232022689695292080269205470491791950839486861811469879413313773338916781857981641910031441448964144000585506870170898052132929034349451945051362244755750988705018897859238859476967568556992146975789444151432386692872801263000639711599152191790766776280
x=sympy.discrete_log(y,c1,2)
print(x)#5535722692962580764045545539105119140941061679289569420988353884209653851308860058948669740693107863231179565602072744542122031789184119031739723962825082929025825322421201364211726001366490949760887367407718763255964735567971493859197583624076478457865073449246835949075135223468616834636386958924709024763349115622062848212445867198457630368236782421195503713107838541903829979118327675371550868768159024260793541264335548489228744367609071659968450303895118817379316060805148754136917043160175570565717388336822960389664337656603584425629662613786203920234401824957121860225422901340950436355650311392398098947210940#耗时:416.408s

解p:

y = 449703347709287328982446812318870158230369688625894307953604074502413258045265502496365998383562119915565080518077360839705004058211784369656486678307007348691991136610142919372779782779111507129101110674559235388392082113417306002050124215904803026894400155194275424834577942500150410440057660679460918645357376095613079720172148302097893734034788458122333816759162605888879531594217661921547293164281934920669935417080156833072528358511807757748554348615957977663784762124746554638152693469580761002437793837094101338408017407251986116589240523625340964025531357446706263871843489143068620501020284421781243879675292060268876353250854369189182926055204229002568224846436918153245720514450234433170717311083868591477186061896282790880850797471658321324127334704438430354844770131980049668516350774939625369909869906362174015628078258039638111064842324979997867746404806457329528690722757322373158670827203350590809390932986616805533168714686834174965211242863201076482127152571774960580915318022303418111346406295217571564155573765371519749325922145875128395909112254242027512400564855444101325427710643212690768272048881411988830011985059218048684311349415764441760364762942692722834850287985399559042457470942580456516395188637916303814055777357738894264037988945951468416861647204658893837753361851667573185920779272635885127149348845064478121843462789367112698673780005436144393573832498203659056909233757206537514290993810628872250841862059672570704733990716282248839
n = 5535722692962580764045545539105119140941061679289569420988353884209653851308860058948669740693107863231179565602072744542122031789184119031739723962825082929025825322421201364211726001366490949760887367407718763255964735567971493859197583624076478457865073449246835949075135223468616834636386958924709024763349115622062848212445867198457630368236782421195503713107838541903829979118327675371550868768159024260793541264335548489228744367609071659968450303895118817379316060805148754136917043160175570565717388336822960389664337656603584425629662613786203920234401824957121860225422901340950436355650311392398098947210940R.<x> = Zmod(y)[]
f = 2019*x**2 + 2020*x**3 + 2021*x**4 - n
f.roots()#[(27153099643155758004096668312955107460371942443314916103081317797447935609743837025836875855460003183463463112030628441633986282429303074401307088449288018122595950015555112665577379107182382486792279613502533059760503631643012140086399099525327757252150787382526024727067741125304545637101243890457735209131643695112201931568803664419937323631443623458729681838936101964386089814954795307765007979091689223457360276609665600722674636982771189644211817531878577244716449340182277311219298462216900564094311137715323599394746011313659622918303346651884667460252069392649694652597830606093658070845415035965490346093712726563530813201693903095778965099699143961970150234250241722705170012125464984496910166424891037267326903208056022593918256641118270219750492227251237271374903818289080800764777510915538524607874339495131265879711773836068864779157831155074886308598640351517797193306764020543814663521500688767936488175400344085876590762863551999737724178247620216729465190713710806241925203250527244175334003558147768480954060293479182100692858275342454555848905267108506143093255521190391754621197594946647627161305525398014270577888680382770782140047324289521555995269531650851818086721597411195491254903961282871313244468832347338656284765861809301805681493962611176632506545134667660012655790219867610709470683242897182340512656749367229763499330639957859709731011397128643353632200423910890011614961112083269613775099398965485851570729322843926050342574215555295617,1),(7234391427703598327916723159145232922047935397302241978344500497098972068808591685717500902909442183573763273395725479516998210374727754578133587007330339,1)]

貌似输出的根有两个,我们取后者:

p = 7234391427703598327916723159145232922047935397302241978344500497098972068808591685717500902909442183573763273395725479516998210374727754578133587007330339
#len(bin(p)):514

利用解出的p获取flag:

import libnump = 7234391427703598327916723159145232922047935397302241978344500497098972068808591685717500902909442183573763273395725479516998210374727754578133587007330339
dp = 3272293505696712831419859641571956066667516012597886098021642320155056349966612629986261146617139998624603483170466852538289743936225789351270153550594329
c = 22524257534087703614496632403022329621384173069680778965750290698059674588465640878754707363673789674111671270645152584118206145007310499274423606886261969807360070526126452646719628307689968971699215841867636770320159256301550908771135042912287955209485328267670825390080110910391913063177323585204392804538642393453388536211144485389902591029350060800993352969569703901717308330574394200996651534321547814313195218895547718815009876393987398738932001924661338796059973950012706427109598830049455186171345179840564502215531573714428772608739268313985559628612004439028014417408631851880698512023740903181116906766066951473942201698375224240271523568161242951730224901227589413731025281719101368668617497947995579443908773425555177346524678673641140157885033923288401884m = pow(c, dp, p)
print(libnum.n2s(int(m)))#b'GWHT{f372e52f2a0918d92267ff78ff1a9f09}'

我们来看看这个式子的正确性:
c^{dp} = m ^{e\cdot dp}\ mod \ n

c^{dp} = m ^{e\cdot dp}\ mod \ p

加上上面得到的式子:e \cdot dp= 1 + x \cdot (p - 1)

于是可以得到:c^{dp}\equiv m ^{e\cdot dp} = m \cdot (m^{(p- 1)})^{x}\equiv m\ mod\ p

所以在m小于p的条件下,我们能够通过该式得到m的值

4.参考

题解1、题解2

相关文章:

  • sectigo 单IP证书360元
  • zookeeper--ACL详解
  • 151 shell编程,正则表达式,在C语言中如何使用正则表达式
  • Python面对对象 - 类的反射机制
  • 牛客周赛 Round 38(A,B,C,D,E,F,G)
  • Go-React做一个todolist(服务端)【一】项目初始化
  • Linux下使用vim文本编辑器
  • 使用Python实现对word的批量操作
  • java Web洗衣店管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc
  • WebCopilot:一款功能强大的子域名枚举和安全漏洞扫描工具
  • Web CSS笔记2
  • pytest中文使用文档----6临时目录和文件
  • 【力扣】217. 存在重复元素
  • 暴雨服务器X7740赋能大模型训练
  • 基于单片机16路抢答器仿真系统
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 2017前端实习生面试总结
  • Angular Elements 及其运作原理
  • Codepen 每日精选(2018-3-25)
  • Facebook AccountKit 接入的坑点
  • JavaScript设计模式与开发实践系列之策略模式
  • PAT A1092
  • ReactNative开发常用的三方模块
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Terraform入门 - 3. 变更基础设施
  • vue-router的history模式发布配置
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 一个项目push到多个远程Git仓库
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ${ }的特别功能
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (4)事件处理——(7)简单事件(Simple events)
  • (9)STL算法之逆转旋转
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (pojstep1.3.1)1017(构造法模拟)
  • (ZT)薛涌:谈贫说富
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (九)信息融合方式简介
  • (强烈推荐)移动端音视频从零到上手(下)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转载)利用webkit抓取动态网页和链接
  • .CSS-hover 的解释
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET关于 跳过SSL中遇到的问题
  • .net生成的类,跨工程调用显示注释
  • .Net语言中的StringBuilder:入门到精通
  • @FeignClient注解,fallback和fallbackFactory
  • @ModelAttribute 注解
  • @synthesize和@dynamic分别有什么作用?
  • [20190113]四校联考
  • [Android] Android ActivityManager