DP泄露

选了三道与RSA的dp泄露有关的题,dp泄露算是比较有辨识度的题型。

原理

题目会给出n,c,e,dp,首先这个dp并不是单纯的d*p:

\[dp≡dmod(p-1)
\]

根据这个式子继续推导:

\[dp*e≡d*emod(p-1)
\]
\[d*e=k(p-1)+dp*e
\]

又根据rsa的定义,我们可以得到d*e=1modφ(n) φ(n)=(p-1)*(q-1)

代入可得:

\[k(p-1)+dp*e=1modφ(n)
\]
\[k(p-1)+dp*e=1mod(p-1)(q-1)
\]

变换之后可以得到:

\[k1(p-1)+dp*e=k2(p-1)(q-1)+1
\]
\[dp*e=(p-1)[k2*(q-1)-k1]+1
\]

我们此处令X=k2*(q-1)-k1,即得:

\[dp*e=X*(p-1)+1
\]

根据dp的定义可知,dp一定小于(p-1),由此得出X<e

所以得到X的范围为(1,e)。

有范围了,我们打算把X爆出来。

当X满足:(dp*e-1)%X==0时,p=(dp·e-1)//X +1

算出p之后,p可能不为整数,还得验证n%p=0是否成立。

ctfshow funnyrsa3

题目:

e = 65537
n = 13851998696110232034312408768370264747862778787235362033287301947690834384177869107768578977872169953363148442670412868565346964490724532894099772144625540138618913694240688555684873934424471837897053658485573395777349902581306875149677867098014969597240339327588421766510008083189109825385296069501377605893298996953970043168244444585264894721914216744153344106498382558756181912535774309211692338879110643793628550244212618635476290699881188640645260075209594318725693972840846967120418641315829098807385382509029722923894508557890331485536938749583463709142484622852210528766911899504093351926912519458381934550361
dp = 100611735902103791101540576986246738909129436434351921338402204616138072968334504710528544150282236463859239501881283845616704984276951309172293190252510177093383836388627040387414351112878231476909883325883401542820439430154583554163420769232994455628864269732485342860663552714235811175102557578574454173473
c = 6181444980714386809771037400474840421684417066099228619603249443862056564342775884427843519992558503521271217237572084931179577274213056759651748072521423406391343404390036640425926587772914253834826777952428924120724879097154106281898045222573790203042535146780386650453819006195025203611969467741808115336980555931965932953399428393416196507391201647015490298928857521725626891994892890499900822051002774649242597456942480104711177604984775375394980504583557491508969320498603227402590571065045541654263605281038512927133012338467311855856106905424708532806690350246294477230699496179884682385040569548652234893413
分析

平时RSA一般不会出现dp,出现dp可能是考dp泄露。

解答

import gmpy2
from Crypto.Util.number import long_to_bytes
e = 65537
n = 13851998696110232034312408768370264747862778787235362033287301947690834384177869107768578977872169953363148442670412868565346964490724532894099772144625540138618913694240688555684873934424471837897053658485573395777349902581306875149677867098014969597240339327588421766510008083189109825385296069501377605893298996953970043168244444585264894721914216744153344106498382558756181912535774309211692338879110643793628550244212618635476290699881188640645260075209594318725693972840846967120418641315829098807385382509029722923894508557890331485536938749583463709142484622852210528766911899504093351926912519458381934550361
dp = 100611735902103791101540576986246738909129436434351921338402204616138072968334504710528544150282236463859239501881283845616704984276951309172293190252510177093383836388627040387414351112878231476909883325883401542820439430154583554163420769232994455628864269732485342860663552714235811175102557578574454173473
c = 6181444980714386809771037400474840421684417066099228619603249443862056564342775884427843519992558503521271217237572084931179577274213056759651748072521423406391343404390036640425926587772914253834826777952428924120724879097154106281898045222573790203042535146780386650453819006195025203611969467741808115336980555931965932953399428393416196507391201647015490298928857521725626891994892890499900822051002774649242597456942480104711177604984775375394980504583557491508969320498603227402590571065045541654263605281038512927133012338467311855856106905424708532806690350246294477230699496179884682385040569548652234893413 for x in range(1,e): #遍历X
if (dp*e-1)%x==0:
p=(dp*e-1)//x +1
if n%p==0:
q=n//p #得到q
phi=(p-1)*(q-1) #欧拉函数
d=gmpy2.invert(e,phi) #求逆元
m=pow(c,d,n) #幂取模,m=c^d mod n
print(long_to_bytes(m))

得到:flag{dp_i5_1eak}

BUUCTF RSA2

题目:

e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657 c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751
分析

e和上一题一样等于65537,发现了dp,可能是dp泄露。

解答

因为解题思路实际上没有变化,所以上一题的脚本差不多可以直接套用。

import gmpy2
from Crypto.Util.number import long_to_bytes
e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751 for x in range(1,e): #遍历X
if (dp*e-1)%x==0:
p=(dp*e-1)//x +1
if n%p==0:
q=n//p #得到q
phi=(p-1)*(q-1) #欧拉函数
d=gmpy2.invert(e,phi) #求逆元
m=pow(c,d,n) #幂取模,m=c^d mod n
print(long_to_bytes(m))

flag{wow_leaking_dp_breaks_rsa?_98924743502}

[羊城杯 2020]Power

题目:

from Crypto.Util.number import *
import gmpy2
from secret import flag p = getPrime(512)
q = getPrime(512)
n = p**4*q e = 0x10001 #其实还是65537
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
分析

发现给了dp,咱可以猜测应该是考dp泄露。

这题没有直接给我们n,我们需要把p求出来。

之前我们的思路是,当X满足:(dp*e-1)%X==0时,p=(dp·e-1)//X +1,先求出p。

解答

首先,按照之前的思路把p求出来:

dp =
c =
c1 =
y =
g = 2
e = 65537 for x in range(1,e):
if (dp*e-1)%x==0:
p=(dp*e-1)//x+1
x = 2019*p**2 + 2020*p**3 + 2021*p**4
print(p)
break

如果像这样↑不加判断条件的话,会出现很多个p:

和m没有联系的c1就是为此而加上的,c1=pow(g,x,y) 可以用这个来判断x。

成功得到p的值。

之后我们要求的就是m了,根据定义:m=c^dmod n

我们缺少d,也暂时求不出n的值。

有位师傅提到了同余的概念,m和c^d 关于n同余,根据同余关系的性质:a≡b(mod c*d)可以得到 a≡b(mod c) 和 a≡b(mod d)。

也就是说我们可以把 m≡c^d(mod n) 转化为:m≡c^d(mod p) 这样我们就可以回避掉n求不出来的问题,只要知道c、d、p就能求解m。

但这里我个人存在一些疑问,能够求解m的值是基于m小于n且m小于p得出的,有没有可能出现m大于p的情况?再想了一下,p与q毕竟都是非常大的大素数,所以这种情况也许确实会很少。

求完之后只剩下d,根据dp的定义:dp=d%(p-1) ,所以d=k*(p-1)+dp

可以爆一下k试试,不知道范围就先设(0,1000)看看,这个k应该不会太大。

for k in range(1000):
d=k*(p-1)+dp
print(k)
m=pow(c,d,p) #幂求模
try:
print(long_to_bytes(m).decode())
break
except:
pass

脚本:

from Crypto.Util.number import *
import gmpy2
import sys
dp = 3272293505696712831419859641571956066667516012597886098021642320155056349966612629986261146617139998624603483170466852538289743936225789351270153550594329
c = 22524257534087703614496632403022329621384173069680778965750290698059674588465640878754707363673789674111671270645152584118206145007310499274423606886261969807360070526126452646719628307689968971699215841867636770320159256301550908771135042912287955209485328267670825390080110910391913063177323585204392804538642393453388536211144485389902591029350060800993352969569703901717308330574394200996651534321547814313195218895547718815009876393987398738932001924661338796059973950012706427109598830049455186171345179840564502215531573714428772608739268313985559628612004439028014417408631851880698512023740903181116906766066951473942201698375224240271523568161242951730224901227589413731025281719101368668617497947995579443908773425555177346524678673641140157885033923288401884
c1 = 290707924192892686920253390955676600323331633814839708838347288502692494699485764473635783441705302268064111648851157070038783719749721994682837294625334517914882191486257362565066745587415388291939979195637720350919055988532145531805200483161599965215275808797976727969023747299578173497083532351976473770041800769265319548352841139802163279116490053292316399038329210043455932786945180855178341998049756983301499491011851026499269682821602212971062877270127451987836730083380463825717889123804613394241190839837791281657872259492589868751745327696030438893865069941066073554427558697972551085353027574529823439588670263047287131740802375738439636789806332323994866753085014446479034974063195632514803340511247735647970572837053148490258113394359072976858781060349776921428492973183958437965966963122069107876143476772436757554253049619918403996315720023020827394900507088006299225934263699192253079026440287311664705744424959801981503191480257138833694306501816837037995549817186335377411638035575004595417788588264823861850877111374085336446477943372458378834664678094751978400910288151519902977326995118727880223621964441498323865158898463327323193833062919619201107279964663654606753750042791368210261574897455830722232022689695292080269205470491791950839486861811469879413313773338916781857981641910031441448964144000585506870170898052132929034349451945051362244755750988705018897859238859476967568556992146975789444151432386692872801263000639711599152191790766776280
y = 449703347709287328982446812318870158230369688625894307953604074502413258045265502496365998383562119915565080518077360839705004058211784369656486678307007348691991136610142919372779782779111507129101110674559235388392082113417306002050124215904803026894400155194275424834577942500150410440057660679460918645357376095613079720172148302097893734034788458122333816759162605888879531594217661921547293164281934920669935417080156833072528358511807757748554348615957977663784762124746554638152693469580761002437793837094101338408017407251986116589240523625340964025531357446706263871843489143068620501020284421781243879675292060268876353250854369189182926055204229002568224846436918153245720514450234433170717311083868591477186061896282790880850797471658321324127334704438430354844770131980049668516350774939625369909869906362174015628078258039638111064842324979997867746404806457329528690722757322373158670827203350590809390932986616805533168714686834174965211242863201076482127152571774960580915318022303418111346406295217571564155573765371519749325922145875128395909112254242027512400564855444101325427710643212690768272048881411988830011985059218048684311349415764441760364762942692722834850287985399559042457470942580456516395188637916303814055777357738894264037988945951468416861647204658893837753361851667573185920779272635885127149348845064478121843462789367112698673780005436144393573832498203659056909233757206537514290993810628872250841862059672570704733990716282248839
g = 2
e = 65537
for x in range(1,e):
if (dp*e-1)%x==0:
p=(dp*e-1)//x+1
x = 2019*p**2 + 2020*p**3 + 2021*p**4
if c1 == pow(g, x, y):
print(p)
break
for k in range(1000):
d=k*(p-1)+dp
print(k)
m=pow(c,d,p)
try:
print(long_to_bytes(m).decode())
break
except:
pass

得到flag

GWHT{f372e52f2a0918d92267ff78ff1a9f09}

最新文章

  1. mybatis实战教程(mybatis in action)之三:实现数据的增删改查
  2. oracle sqlplus 连接不正常
  3. Linux给指定用户或全部用户(已登录)发送消息
  4. [转] - C++程序启动过程
  5. Objective-C语言的面向对象特性
  6. 为Delphi程序增加UAC功能
  7. MBProgressHUD -[__NSCFString sizeWithAttributes:]: unrecognized selector问题解决了
  8. centos7 部署openstf
  9. 双十一临近,怎样让买家流畅地秒杀? ——腾讯WeTest独家开放电商产品压测服务
  10. Android动画(二)-属性动画
  11. &lt;Android基础&gt; (六) 数据存储 Part 3 SQLite数据库存储
  12. kubernetes组成
  13. Firemonkey的几个特色属性(二)
  14. leetcode题解 Generate Parentheses
  15. linux系统修改系统时间与时区
  16. 【MongoDB-MongoVUE图像管理工具】
  17. 解决The SDK platform-tools version ((23)) is too old to check APIs compiled with API 23
  18. idea没有代码自动提示功能和包自动引入不了问题
  19. html border画三角形
  20. C#中调用PowerShell代码

热门文章

  1. vue2 项目引入Fontawesome
  2. 2022-05-13内部群每日三题-清辉PMP
  3. 一次eureka的事故
  4. Mac新手必看Mac入门基本知识图文教程
  5. libvirtd升级
  6. Java中如何处理大批量照片上传,然后调用图片上传服务区接口,使用异步吗,是不是需要用到多线程
  7. 网络爬虫Python(一)
  8. elementUI中table组件前端自己实现序号排序
  9. 流程图draw.io自选中文字体
  10. 搭建 springboot 应用