buuctf的RSA(六)

[GWCTF 2019]BabyRSA

下载压缩后有两个文件

开始代码审计,大致意思是说flag分为了两个,

简单分析一下,

secret_num = getPrime(1024) * bytes_to_long(secret)

        将secret字符串转换为长整数,并与上述素数相乘,得到secret_num

        使用sympy.nextprime找到大于secret_num的第一个素数,作为p

         接着找到大于p的第一个素数,作为q

         计算N = p * q

c1 = F1 + F2
c2 = pow(F1, 3) + pow(F2, 3)
assert(c2 < N)

计算c1 = F1 + F2c2 = F1^3 + F2^3

使用assert确保c2 < N,这是为了确保在后续的模幂运算中不会出现溢出。

打开另一个发现了n,m1,m2

分解

接下来求c1,c2

简单的脚本

import libnum

p = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377748737
q = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377747699
n = 636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163
m1 = 90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
m2 = 487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546
e = 65537
d = libnum.invmod(e, (p - 1) * (q - 1))
print(d)

c2 = pow(m2, d, n)
c1 = pow(m1, d, n)
print('c1=', c1)
print('c2=', c2)

后面就就是求flag1,flag2了

继续回去仔细看代码

似乎有点像方程

来列方程后

from sympy import symbols    #sympy是在数学中求素数的
from sympy import solve
c1=
c2=
f1=symbols('f1')
f2=symbols('f2')
x=f1+f2-c1
y=f1**3+f2**3-c2
intr=solve([x,y],[f1,f2],dict=True)   #解出值后以字典的形式输出

print(intr)

得到了F1和F2

最后就来得到flag,修改一下顺序即可

[ACTF新生赛2020]crypto-rsa3

这是个很简单的题目

打开output.txt是n和c

n分解

最基础的RSA

import gmpy2
from Crypto.Util.number import long_to_bytes

n = 177606504836499246970959030226871608885969321778211051080524634084516973331441644993898029573612290095853069264036530459253652875586267946877831055147546910227100566496658148381834683037366134553848011903251252726474047661274223137727688689535823533046778793131902143444408735610821167838717488859902242863683
c = 1457390378511382354771000540945361168984775052693073641682375071407490851289703070905749525830483035988737117653971428424612332020925926617395558868160380601912498299922825914229510166957910451841730028919883807634489834128830801407228447221775264711349928156290102782374379406719292116047581560530382210049
e = 65537
p = 13326909050357447643526585836833969378078147057723054701432842192988717649385731430095055622303549577233495793715580004801634268505725255565021519817179293
q = 13326909050357447643526585836833969378078147057723054701432842192988717649385731430095055622303549577233495793715580004801634268505725255565021519817179231

phi_n = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi_n)
m = gmpy2.powmod(c, d, n)
print(long_to_bytes(m))

[BJDCTF2020]rsa_output

这一看就是共模攻击

之前总结过共模攻击内容,有兴趣可以去看看

那么根据以前的总结来做

简简单单

#coding:utf-8
import gmpy2
import libnum

n=21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111
c1=20152490165522401747723193966902181151098731763998057421967155300933719378216342043730801302534978403741086887969040721959533190058342762057359432663717825826365444996915469039056428416166173920958243044831404924113442512617599426876141184212121677500371236937127571802891321706587610393639446868836987170301813018218408886968263882123084155607494076330256934285171370758586535415136162861138898728910585138378884530819857478609791126971308624318454905992919405355751492789110009313138417265126117273710813843923143381276204802515910527468883224274829962479636527422350190210717694762908096944600267033351813929448599
e2=3659
e1=2767
c2=11298697323140988812057735324285908480504721454145796535014418738959035245600679947297874517818928181509081545027056523790022598233918011261011973196386395689371526774785582326121959186195586069851592467637819366624044133661016373360885158956955263645614345881350494012328275215821306955212788282617812686548883151066866149060363482958708364726982908798340182288702101023393839781427386537230459436512613047311585875068008210818996941460156589314135010438362447522428206884944952639826677247819066812706835773107059567082822312300721049827013660418610265189288840247186598145741724084351633508492707755206886202876227
#共模攻击
#共模攻击函数
def rsa_gong_N_def(e1,e2,c1,c2,n):
    e1, e2, c1, c2, n=int(e1),int(e2),int(c1),int(c2),int(n)
    s = gmpy2.gcdext(e1, e2)
    s1 = s[1]
    s2 = s[2]
    if s1 < 0:
        s1 = - s1
        c1 = gmpy2.invert(c1, n)
    elif s2 < 0:
        s2 = - s2
        c2 = gmpy2.invert(c2, n)
    m = (pow(c1,s1,n) * pow(c2 ,s2 ,n)) % n
    return int(m)
m = rsa_gong_N_def(e1,e2,c1,c2,n)
print(m)
print(libnum.n2s(int(m)))

[HDCTF2019]bbbbbbrsa

看来有点复杂

没有给e的具体值

另一个信息就是这个

解出来了c,这里来了个字符串反转

之前想的是直接输出

这个不是base64,但也不是正确的base32

而是base32倒序解密

一般来说用

from base64 import b32decode  
  
p = 177077389675257695042507998165006460849  
n = 37421829509887796274897162249367329400988647145613325367337968063341372726061  
c = '==gMzYDNzIjMxUTNyIzNzIjMyYTM4MDM0gTMwEjNzgTM2UTN4cjNwIjN2QzM5ADMwIDNyMTO4UzM2cTM5kDN2MTOyUTO5YDM0czM3MjM'  
  

c = c.rstrip('=')  
  
# 反转字符串  
c = c[::-1]  
  
# 使用Base32解码  
try:  
    decoded_data = b32decode(c)  
    print(decoded_data)  
except Exception as e:  
    print(f"Error decoding Base32 string: {e}")  
  

终于得得到了c

最后

利用

得出flag

from base64 import b64encode as b32encode
from base64 import b64decode as b32decode
import gmpy2
from Crypto.Util.number import *
from binascii import a2b_hex,b2a_hex
import random


q = n //p
#q = 211330365658290458913359957704294614589
phi = (q-1) * (p-1)
e = random.randint(50000,70000)
for e in range(50000,70000):
	if gmpy2.gcd(e,phi) == 1:
		d = gmpy2.invert(e ,phi)
		m = pow(c,d,n)
		if 'flag' in str(long_to_bytes(m)):
			print('e = ',e)
			print(long_to_bytes(m))
			break


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值