BUUCTF 每日打卡 2021-4-20

引言

一张谍报

题目给了一份报纸
在这里插入图片描述
完全摸不着头脑
只能找 wp
flag:南天菩萨放鹰捉猴头

SameMod

共模攻击
不再赘述
详见 CTFwiki 共模攻击
题目给的数据都和 CTFwiki 的一模一样(啊这)
解密代码如下:

import gmpy2

n = 6266565720726907265997241358331585417095726146341989755538017122981360742813498401533594757088796536341941659691259323065631249
e1 = 773
e2 = 839
message1=3453520592723443935451151545245025864232388871721682326408915024349804062041976702364728660682912396903968193981131553111537349
message2=5672818026816293344070119332536629619457163570036305296869053532293105379690793386019065754465292867769521736414170803238309535
# s & t
gcd, s, t = gmpy2.gcdext(e1, e2)
if s < 0:
    s = -s
    message1 = gmpy2.invert(message1, n)
if t < 0:
    t = -t
    message2 = gmpy2.invert(message2, n)
plain = gmpy2.powmod(message1, s, n) * gmpy2.powmod(message2, t, n) % n
i = 0
flag = ""
plain = str(plain)
while i < len(plain):
    if plain[i] == '1':
        flag += chr(int(plain[i:i + 3]))
        i += 3
    else:
        flag += chr(int(plain[i:i + 2]))
        i += 2
print(flag)

结果为:flag{whenwethinkitispossible}

BabyRSA

加密代码如下:

import hashlib
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)
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()

看来是把 flag 分成两段加密了
输出数据如下:

N=636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163
m1=90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
m2=487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546

老规矩,先试试能不能爆破 N :
在这里插入图片描述
啊这
爆破出来了
根据 RSA 的常规套路解出 c1, c2
由于
c 1 = f 1 + f 2 c 2 = f 1 3 + f 2 3 c_{1} = f_{1} + f_{2} \\ c_{2} = f_{1}^{3} + f_{2}^{3} c1=f1+f2c2=f13+f23
c2 又可以进行因式分解
c 2 = f 1 3 + f 2 3 = ( f 1 + f 2 ) ( f 1 2 − f 1 f 2 + f 2 2 ) c_{2} = f_{1}^{3} + f_{2}^{3} = (f_{1} + f_{2} )(f_{1}^{2} - f_{1} f_{2} + f_{2}^{2}) c2=f13+f23=(f1+f2)(f12f1f2+f22)
c 1 = f 1 + f 2 c_{1} = f_{1} + f_{2} c1=f1+f2 代入得
c 2 c 1 = f 1 2 − f 1 f 2 + f 2 2 = ( f 1 + f 2 ) 2 − 3 f 1 f 2 \frac{c_{2}}{c_{1}} = f_{1}^{2} - f_{1} f_{2} + f_{2}^{2} = (f_{1} + f_{2} )^{2} - 3f_{1} f_{2} c1c2=f12f1f2+f22=(f1+f2)23f1f2
可以求出 f 1 f 2 f_{1} f_{2} f1f2 记为 c 3 c_{3} c3
然后可以构造一元二次方程
x 2 − c 1 x + c 3 = 0 x^{2} - c_{1}x + c_{3} = 0 x2c1x+c3=0
解出结果即为 f 1 , f 2 f1,f2 f1,f2
最后解密即可
代码如下:

from Crypto.Util.number import *
from sympy import *

p = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377747699
q = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377748737
N = 636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163
m1= 90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
m2 = 487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546
e = int('0x10001', 16)
phi = (p-1)*(q-1)
d = inverse(e, phi)
c1 = pow(m1, d, N) # f1 + f2
c2 = pow(m2, d, N) # f1^3 + f2^3
c3 = (c1**2 - c2//c1) // 3 # f1 * f2
x = symbols('x')
f1, f2 = solve(Eq(x**2 - c1*x + c3,0),x)
print(long_to_bytes(f2) + long_to_bytes(f1))

结果为:GWHT{f709e0e2cfe7e530ca8972959a1033b2}

结语

希望继续坚持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值