[GWCTF 2019]BabyRSA

22 篇文章 3 订阅
4 篇文章 0 订阅
import hashlib
import gmpy2
import sympy
from Crypto.Util.number import *

# flag = 'GWHT{******}'
# secret = '******'

# assert(len(flag) == 38)

# half = len(flag) / 2

# flag1 = flag[:half]
# flag2 = flag[half:]

# secret_num = getPrime(1024) * bytes_to_long(secret)

# p = sympy.nextprime(secret_num)
# q = sympy.nextprime(p)

# N = p * q

# e = 0x10001

# F1 = bytes_to_long(flag1)
# F2 = bytes_to_long(flag2)

# c1 = F1 + F2
# c2 = pow(F1, 3) + pow(F2, 3)
# # f1的三次方 加 f2的三次方
# assert(c2 < N)

# m1 = pow(c1, e, N)
# m2 = pow(c2, e, N)

# output = open('secret', 'w')
# output.write('N=' + str(N) + '\n')
# output.write('m1=' + str(m1) + '\n')
# output.write('m2=' + str(m2) + '\n')
# output.close()
e = 0x10001
N=636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163
m1=90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
m2=487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546
# q是p的下一个素数 p和q差距不大 n开平方根得到的值的下一个素数就是q
# 有了p 和 q  可以得到私钥(d,n) 解出c1,c2
# 俩个未知数 俩个方程 可以解出f1 f2
#x = gmpy2.iroot(N,2)
#print(x)
#(mpz(797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377748217), False)
#注意x是一个元组 应该取首元素
x = gmpy2.iroot(N,2)[0]
q = sympy.nextprime(x)
p = N // q
d = gmpy2.invert(e,(p-1)*(q-1))
c1 = pow(m1,d,N)
c2 = pow(m2,d,N)

import sympy   # 引入解方程的专业模块sympy
F1,F2 = sympy.symbols("F1 F2")   # 申明未知数"x"和"y"
flag = sympy.solve([F1 + F2 - c1,pow(F1, 3) + pow(F2, 3) - c2],[F1,F2])   # 写入需要解的方程组
print(flag)  # 打印出结果
#[(1141553212031156130619789508463772513350070909, 1590956290598033029862556611630426044507841845), (1590956290598033029862556611630426044507841845, 1141553212031156130619789508463772513350070909)]
f = long_to_bytes(flag[0][0]) + long_to_bytes(flag[0][1]) 
print(f)
#b'30ca8972959a1033b2}GWHT{f709e0e2cfe7e5'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值