buuctf rsa类题目(2)

1.BJDCTF2020 rsa_output

这道题目是一道rsa的共模攻击题,具体原理可参考下面:

https://www.cnblogs.com/gwind/p/8013154.html

脚本如下:

import gmpy2
from Crypto.Util.number import long_to_bytes
e2=3659
e1=2767
n=21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111
c1=20152490165522401747723193966902181151098731763998057421967155300933719378216342043730801302534978403741086887969040721959533190058342762057359432663717825826365444996915469039056428416166173920958243044831404924113442512617599426876141184212121677500371236937127571802891321706587610393639446868836987170301813018218408886968263882123084155607494076330256934285171370758586535415136162861138898728910585138378884530819857478609791126971308624318454905992919405355751492789110009313138417265126117273710813843923143381276204802515910527468883224274829962479636527422350190210717694762908096944600267033351813929448599
c2=11298697323140988812057735324285908480504721454145796535014418738959035245600679947297874517818928181509081545027056523790022598233918011261011973196386395689371526774785582326121959186195586069851592467637819366624044133661016373360885158956955263645614345881350494012328275215821306955212788282617812686548883151066866149060363482958708364726982908798340182288702101023393839781427386537230459436512613047311585875068008210818996941460156589314135010438362447522428206884944952639826677247819066812706835773107059567082822312300721049827013660418610265189288840247186598145741724084351633508492707755206886202876227
s=[]
def egcd(a, b):
  if a == 0:
    return (b, 0, 1)
  else:
    g, y, x = egcd(b % a, a)
    return (g, x - (b // a) * y, y)
s=egcd(e1,e2)
s1=s[1]
s2=s[2]
s1=-s1
c1=gmpy2.invert(c1,n)
m=(pow(c1,s1)*pow(c2,s2))%n
print(long_to_bytes(m))

2.GWCTF BabyRSA

题目分析一下,是要求出F1和F2的值,因为这里的p和q是两个相近的大素数,可以直接用yafu进行分解,这里我用开平方来求解p和q(因为p和q的值很近,所以N开完平方后的nextprime,就是p和q中较大的一方),求出F1+F2和F13+F23,用下列定理变换就可以得到F1和F2的值
F1^2+F2^3=(F1+F2)(F1^2-F1F2+F2^2)
完整脚本代码如下:

import gmpy2
from Crypto.Util.number import long_to_bytes
import sympy
m1=90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
m2=487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546
N=gmpy2.mpz(636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163)
middle=gmpy2.iroot(N,2)[0]
q=sympy.nextprime(middle)
p=N//q
phi=(p-1)*(q-1)
e=65537
d=gmpy2.invert(e,phi)
m1=pow(m1,d,N)
m2=pow(m2,d,N)
ans1=m2//m1
F1F2=(pow(m1,2)-ans1)//3
F1_F2=gmpy2.iroot(ans1-F1F2,2)[0]
F1=(F1_F2+m1)//2
F2=m1-F1
print(long_to_bytes(F1))
print(long_to_bytes(F2))

posted @ 2020-08-30 12:08  Mr_small  阅读(509)  评论(0)    收藏  举报