[ctf.show] baby杯 左左右右

看到一个简单题作一下

题目给了拼音的公钥

-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAi1pq+1IiAwTUy0lR9YZJ
gesapAbqswepD1/pRsP5ssoRJYcqx34BHavUelZKIK1Zuc6ku9vCi6kj9G3AlEg0
eAIoLfMjnXetmYVr0xZTKqUVLrCa9YrA4dx/d7vX/0gRJt+BGlxEuVUFJxbmqofW
xtJ0dOVZaQwlZ26XhFtQXP/FaA5E3+CXoSZqDqJec85iJ/kGjo9Hy68HC8pY56sE
mJNdnv/8B7e7aYh9yhOiTK5x5USvXZdTs68TwbxZvtARfVlA5gupMoGYrYEVb1sC
1g0Tpzf+vr+VeKbT6DCk9h8znOobncJdS7w6dAkuFPCQq4aw9eGBi3TfLo0zI025
O7rNlQ159PT2cslEH2elSm39dsgtagh+rJCsv21WVF3r1p9PQinuS5ThmuvM+0lZ
PGV69yRwH0RSdy7aP5ROzWJXdWJx3uDeWNrIrfcMOzHQnTl4Il0GZSX3wuHsq5rJ
a9p4n96EQxLGAlmh206Bpt8ZXgITt8hdIJsk+wHn7pQrC80VSkYqKJf6lF6lD39I
7VMsXCLY/viaMs3SsMrR4Op2YSI7/ttZpTq2FpDaY8FpH00/l7JdWDvnhzhFwhxA
G9S4nmRmw2W4RrSe/xSa71I9UHpcVRCD23C+2Q38TaPzK05DUQ18DmFC1+Ant3Ge
XJ9vjfA8cZNmrkC6NJNQrksCAwEAAQ==
-----END PUBLIC KEY-----

和一个提示,提示是注音的,找到注音表转过来就是异或

ㄆㄧ ㄏㄜˊ ㄎㄩ ㄉㄜ˙ ㄧˋ ㄏㄨㄛˋ ㄨㄟˊ 14888341604833092644320517178995218863140075447248553491998009563290635797577584168541475182868460354002676506510022737991235505863280692834456922818976538567404433536975818048117228043538288574146575189434114636089457163102836992771135916943908638838664754950054366616595720376775483042419894111809594196921094622748829507007225386497860712297983163991922115281874405958425150230425022352399160180729388420737504894531730293184312234027389010694250276180164566305650002005847658634262586502376480156783797707464921684005903262645036582646230195014405925896563524738461846501341559320502121567566177129772692775771082

pi  he ku de yi huo wei

所以根据这个爆破一下p和q,n是4096位,p^q是2047位乘2是4094位显然p和q的最高位都是1异或值是0

n = 568511......
e = 65537
p_xor_q = 14888341604...

def getpq(p,q, i):
    if p*q > n:
        #print('A', i)
        return 
    tail = (1<<i)-1   #后i位置1
    if (p|tail)*(q|tail) < n:
        #print('B:', i, hex(p|tail), hex(q|tail))
        return 
    if p*q == n:
        print('p=',p)
        print('q=',q)
        return 
    i -= 1
    if p_xor_q & (1<<i) == 0:
        getpq(p^(1<<i), q^(1<<i), i)
        getpq(p,q,i)
    else:
        getpq(p^(1<<i), q, i)
        getpq(p,q^(1<<i),i)
        
print(n.bit_length(), p_xor_q.bit_length())  #4096 2047
import sys
sys.setrecursionlimit(3000)
  
getpq(3<<2046,1<<2047, 2046)

经过爆破得到p,q

p= 24633319543506897387087736095267231275525921935876304351294504175489248530552573901582442755282972664856139503520724875296158770529501318369184640044481916649023736038308440668431647771313759074744914610981612868938195349412963010737491060005285707648895679414833685273040670329653106330561922504799654337819049284345825274464385034774739001213294847528109963285058635741506919825038895381715392741745090004648596155700992389200975891194632207423205369158019005890151152589668261044523237483536623368767578715487910746571519012671067216263119661869095063221820038352918791623753610008710548774716769741462701300185249
q= 23078961565711023895486288383186358334625784951488840242903117718953734482327406362880023856581975493387736953898749589146354039540802607477997696119533586150394891934322807510687925624599507611880416775620076178236786135571917552051011266174847052237036146471916884608507932281075462752244971082347721809591448715143311352152836548087208586387009737023063629639051312610487948450357926939419977727186412536465577808519043368808628305337909072997518901149377484999873834146617841424415959364297665132316873609426171948891122611980026484703119233629116203630097345827333430890755736575155772589249181875564875012432747

已知p,q后就很容易得到flag了

p= 246333195....
q= 230789615....

n = p*q
e = 65537

from Crypto.Util.number import bytes_to_long, long_to_bytes
from gmpy2 import invert
c = bytes_to_long(open('cipher.dat', 'rb').read())
phi = (p-1)*(q-1)
d = invert(e, phi)
m = pow(c,d,n)
print(m)
print(long_to_bytes(m))

#ctfshow{Fr0M_Y0u_2_zU0_i5_4_G00d_S7r4T39y~}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值