BUUCTF Crypto练习

RSAROLL

打开data文件,猜测第一行{920139713,19},为{n,e},其余行为rsa加密后的密文,写脚本直接解密

import gmpy2

n = 920139713
e = 19
p = 18443
q = 49891

d = gmpy2.invert(e,(p-1)*(q-1))
m = []
with open('data.txt') as f:
    for line in f.readlines():
        line = line.strip('\n')
        m.append(chr(pow(int(line),d,n)))

for i in m:
    print(i,end="")

得到flag,flag{13212je2ue28fy71w8u87y31r78eu1e2}。

rsa2

本题考查低解密指数攻击,直接使用破解脚本求出d值

import RSAwienerHacker
N = 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170646906557242832893914902053581087502512787303322747780420210884852166586717636559058152544979471
e = 46731919563265721307105180410302518676676135509737992912625092976849075262192092549323082367518264378630543338219025744820916471913696072050291990620486581719410354385121760761374229374847695148230596005409978383369740305816082770283909611956355972181848077519920922059268376958811713365106925235218265173085

d = RSAwienerHacker.hack_RSA(e,N)

import hashlibs
flag = "flag{" + hashlib.md5(hex(d).encode('utf8')).hexdigest() + "}"
print(flag)

得到flag,flag{8159e6c4abdd3b94ce461ed9a1a24017}。然而,结果错误,想到python2与python3的md5结果有区别,故使用python2的在线环境运行,果然得到不同结果,flag{47bf28da384590448e0b0d23909a25a4}。

[GUET-CTF2019]BabyRSA

给了(p+q)、(p+1)(q+1),e,d,c,要想求m,需要知道n。将(p+1)(q+1)展开,可以发现
( p + 1 ) ( q + 1 ) = p q + p + q + 1 (p+1)(q+1)=pq+p+q+1 (p+1)(q+1)=pq+p+q+1
而,pq即为n。脚本如下:

import libnum
import gmpy2

#(p+q)
x = 0x1232fecb92adead91613e7d9ae5e36fe6bb765317d6ed38ad890b4073539a6231a6620584cea5730b5af83a3e80cf30141282c97be4400e33307573af6b25e2ea
#(p+1)(q+1)
y = 0x5248becef1d925d45705a7302700d6a0ffe5877fddf9451a9c1181c4d82365806085fd86fbaab08b6fc66a967b2566d743c626547203b34ea3fdb1bc06dd3bb765fd8b919e3bd2cb15bc175c9498f9d9a0e216c2dde64d81255fa4c05a1ee619fc1fc505285a239e7bc655ec6605d9693078b800ee80931a7a0c84f33c851740
e = 0xe6b1bee47bd63f615c7d0a43c529d219
d = 0x2dde7fbaed477f6d62838d55b0d0964868cf6efb2c282a5f13e6008ce7317a24cb57aec49ef0d738919f47cdcd9677cd52ac2293ec5938aa198f962678b5cd0da344453f521a69b2ac03647cdd8339f4e38cec452d54e60698833d67f9315c02ddaa4c79ebaa902c605d7bda32ce970541b2d9a17d62b52df813b2fb0c5ab1a5
c = 0x50ae00623211ba6089ddfae21e204ab616f6c9d294e913550af3d66e85d0c0693ed53ed55c46d8cca1d7c2ad44839030df26b70f22a8567171a759b76fe5f07b3c5a6ec89117ed0a36c0950956b9cde880c575737f779143f921d745ac3bb0e379c05d9a3cc6bf0bea8aa91e4d5e752c7eb46b2e023edbc07d24a7c460a34a9a

n = y-x-1

m = gmpy2.powmod(c,d,n)
print(libnum.n2s(m))

[BJDCTF 2nd]rsa1

给了e,c,(p-q),(p2+q2),要想求m,需要知道d和n。想到完全平方公式
( p − q ) 2 = p 2 + q 2 − 2 p q = p 2 + q 2 − 2 n , n = ( p 2 + q 2 − ( p − q ) 2 ) / 2 , ( p − 1 ) ( q − 1 ) = n + 1 − ( p + q ) , ( p + q ) = ( p 2 + q 2 + 2 n ) 0.5 (p-q)^2=p^2+q^2-2pq=p^2+q^2-2n, \\ n=(p^2+q^2-(p-q)^2)/2,\\ (p-1)(q-1)=n+1-(p+q),\\ (p+q)=(p^2+q^2+2n)^{0.5} (pq)2=p2+q22pq=p2+q22n,n=(p2+q2(pq)2)/2,(p1)(q1)=n+1(p+q),(p+q)=(p2+q2+2n)0.5
由此,可得到n,(p-1)(q-1),从而得到d。脚本如下:

import libnum
import gmpy2


e = 11936369
#p^2+q^2
x = 179078542063786171098570462583697203005792437399320455031433804285072395735579228946278501258032028541721083458411587159216647095906724535882854022692256931873918358743337544481893000613838499804988741946438301395627666863836745379213775039519799936282909933735085265938756037672822546212884981890622952397362
#p-q
y = 3157273368464912180731606160312924721346625392732038143456278160252711036825247242023584872976251978996783336798752783895691172396686996517300018571410182

n = (x-y*y)//2
#p+q
z = gmpy2.iroot(x+2*n,2)[0]
phi = n+1-z
d = gmpy2.invert(e,phi)

c = 66098953454358006961620108630616773373519055730570960839104097828299987281185692977116093562142129601885835980449620888536303600362738687568229508028685978611526878455563240136136872621917786963147473728258175495328145544629268095228846372972845783006777274441320840183383523794664315443972804627194163368379


m = gmpy2.powmod(c,d,n)
print(libnum.n2s(m))

[NCTF2019]childRSA

直接在线分解n,得到p,q的值,脚本如下:

import gmpy2
import libnum

e = 0x10001
p = 178449493212694205742332078583256205058672290603652616240227340638730811945224947826121772642204629335108873832781921390308501763661154638696935732709724016546955977529088135995838497476350749621442719690722226913635772410880516639651363626821442456779009699333452616953193799328647446968707045304702547915799734431818800374360377292309248361548868909066895474518333089446581763425755389837072166970684877011663234978631869703859541876049132713490090720408351108387971577438951727337962368478059295446047962510687695047494480605473377173021467764495541590394732685140829152761532035790187269724703444386838656193674253139
q = 184084121540115307597161367011014142898823526027674354555037785878481711602257307508985022577801782788769786800015984410443717799994642236194840684557538917849420967360121509675348296203886340264385224150964642958965438801864306187503790100281099130863977710204660546799128755418521327290719635075221585824217487386227004673527292281536221958961760681032293340099395863194031788435142296085219594866635192464353365034089592414809332183882423461536123972873871477755949082223830049594561329457349537703926325152949582123419049073013144325689632055433283354999265193117288252918515308767016885678802217366700376654365502867
c = 26308018356739853895382240109968894175166731283702927002165268998773708335216338997058314157717147131083296551313334042509806229853341488461087009955203854253313827608275460592785607739091992591431080342664081962030557042784864074533380701014585315663218783130162376176094773010478159362434331787279303302718098735574605469803801873109982473258207444342330633191849040553550708886593340770753064322410889048135425025715982196600650740987076486540674090923181664281515197679745907830107684777248532278645343716263686014941081417914622724906314960249945105011301731247324601620886782967217339340393853616450077105125391982689986178342417223392217085276465471102737594719932347242482670320801063191869471318313514407997326350065187904154229557706351355052446027159972546737213451422978211055778164578782156428466626894026103053360431281644645515155471301826844754338802352846095293421718249819728205538534652212984831283642472071669494851823123552827380737798609829706225744376667082534026874483482483127491533474306552210039386256062116345785870668331513725792053302188276682550672663353937781055621860101624242216671635824311412793495965628876036344731733142759495348248970313655381407241457118743532311394697763283681852908564387282605279108

n = 32849718197337581823002243717057659218502519004386996660885100592872201948834155543125924395614928962750579667346279456710633774501407292473006312537723894221717638059058796679686953564471994009285384798450493756900459225040360430847240975678450171551048783818642467506711424027848778367427338647282428667393241157151675410661015044633282064056800913282016363415202171926089293431012379261585078566301060173689328363696699811123592090204578098276704877408688525618732848817623879899628629300385790344366046641825507767709276622692835393219811283244303899850483748651722336996164724553364097066493953127153066970594638491950199605713033004684970381605908909693802373826516622872100822213645899846325022476318425889580091613323747640467299866189070780620292627043349618839126919699862580579994887507733838561768581933029077488033326056066378869170169389819542928899483936705521710423905128732013121538495096959944889076705471928490092476616709838980562233255542325528398956185421193665359897664110835645928646616337700617883946369110702443135980068553511927115723157704586595844927607636003501038871748639417378062348085980873502535098755568810971926925447913858894180171498580131088992227637341857123607600275137768132347158657063692388249513
phi = (p-1)*(q-1)

d = gmpy2.invert(e,phi)
m = pow(c, d, n)
print(libnum.n2s(m))

[HDCTF2019]bbbbbbrsa

直接写脚本破解:

from base64 import b64decode as b32decode
from gmpy2 import invert,gcd,iroot
from Crypto.Util.number import *

p = 177077389675257695042507998165006460849
n = 37421829509887796274897162249367329400988647145613325367337968063341372726061
cipher = '==gMzYDNzIjMxUTNyIzNzIjMyYTM4MDM0gTMwEjNzgTM2UTN4cjNwIjN2QzM5ADMwIDNyMTO4UzM2cTM5kDN2MTOyUTO5YDM0czM3MjM'
q = n//p

c = int(b32decode(cipher[::-1]))
print(c)

phi = (p-1)*(q-1)

for i in range(50000,70000):
        if gcd(i,phi) == 1:
                try:
                        d = invert(i,phi)
                        m = pow(c,d,n)
                        print(long_to_bytes(m).decode())
                except:
                        continue

[BJDCTF2020]easyrsa

Fraction(a,b) 相当于 a/b,关于Fraction(a,b)详解请看https://blog.csdn.net/weixin_43790779/article/details/108693989
Derivative(f(x),x) : 当x='x’时,f(x)的导数值。
arctan(x)的导数是 1 / ( 1 + x 2 ) 1/(1+x^2) 1/(1+x2)。arth(x)的导数是 1 / ( 1 − x 2 ) 1/(1-x^2) 1/(1x2)
所以, z = p 2 + q 2 z=p^2+q^2 z=p2+q2

p h i = ( p − 1 ) ( q − 1 ) = n − ( p + q ) + 1 ( p + q ) 2 = z + 2 n phi = (p-1)(q-1)=n-(p+q)+1 \\ (p+q)^2 = z+2n phi=(p1)(q1)=n(p+q)+1(p+q)2=z+2n

from Crypto.Util.number import long_to_bytes
import gmpy2

c = 7922547866857761459807491502654216283012776177789511549350672958101810281348402284098310147796549430689253803510994877420135537268549410652654479620858691324110367182025648788407041599943091386227543182157746202947099572389676084392706406084307657000104665696654409155006313203957292885743791715198781974205578654792123191584957665293208390453748369182333152809882312453359706147808198922916762773721726681588977103877454119043744889164529383188077499194932909643918696646876907327364751380953182517883134591810800848971719184808713694342985458103006676013451912221080252735948993692674899399826084848622145815461035
z = 32115748677623209667471622872185275070257924766015020072805267359839059393284316595882933372289732127274076434587519333300142473010344694803885168557548801202495933226215437763329280242113556524498457559562872900811602056944423967403777623306961880757613246328729616643032628964072931272085866928045973799374711846825157781056965164178505232524245809179235607571567174228822561697888645968559343608375331988097157145264357626738141646556353500994924115875748198318036296898604097000938272195903056733565880150540275369239637793975923329598716003350308259321436752579291000355560431542229699759955141152914708362494482
n = 15310745161336895413406690009324766200789179248896951942047235448901612351128459309145825547569298479821101249094161867207686537607047447968708758990950136380924747359052570549594098569970632854351825950729752563502284849263730127586382522703959893392329333760927637353052250274195821469023401443841395096410231843592101426591882573405934188675124326997277775238287928403743324297705151732524641213516306585297722190780088180705070359469719869343939106529204798285957516860774384001892777525916167743272419958572055332232056095979448155082465977781482598371994798871917514767508394730447974770329967681767625495394441

e=65537
#p+q
x = gmpy2.iroot(z+2*n,2)[0]
phi = n-x+1

d = gmpy2.invert(e,phi)
m = pow(c,d,n)
flag=long_to_bytes(m)

print(flag)

猜你喜欢

转载自blog.csdn.net/weixin_43790779/article/details/108694938