NSSCTF-Crypto靶场练习---41-46WP

文章目录

  • [CISCN 2022 西南]rsa
  • [HDCTF 2023]爬过小山去看云
  • [LitCTF 2023]md5的破解
  • [CISCN 2023 初赛]Sign_in_passwd
  • [CISCN 2021初赛]rsa
  • [GWCTF 2019]babyRSA

[CISCN 2022 西南]rsa

都是迷惑的东西,别看,注意关键的pow就好。

NSSCTF-Crypto靶场练习---41-46WP_第1张图片

求 P-1 和 Q-1 的lcm 最小公倍数实际上就是我们要的 phi了。没有难点。

EXP:

from Crypto.Util.number import *
from gmpy2 import *

E = 65537
c = 4288727484183191191687364666620023549392656794153112764357730676861570386983002380982803054964588111708662498647767438881892355599604826306427809017097724346976778230464708540600157055782723189971534549543664668430013171469625043063261219462210251726207552819381767396148632877168530609902046293626355744288863460554297860696918890189350721960355460410677203131993419723440382095665713164422367291153108363066159712951217816814873413423853338021627653555202253351957999686659021298525147460016557904084617528199284448056532965033560516083489693334373695545423561715471204868795248569806148395196572046378679014697206
N = 17168634922359080770731181740188997952741812682116912079000170434755630873073792773455352815549564103486063484001457037305375162580861025543369063596825489461609724794798857499401637867986508655873564997664216374116361942711233205374363245780323485119184650145879389879046988234947922412374890843297813248828996855478005656041814919367820336728271583686844991928889831691815821365423570311291064846736832327637944358854661523107817781673029406341843040857813841671405147146887291204140157388049394514390098066284975682117038362207142272098796924412602725857521665773622056312191400612944442008222587867782281556388669
phi = 4292158730589770192682795435047249488185453170529228019750042608688907718268448193363838203887391025871515871000364259326343790645215256385842265899206372365402431198699714374850409466996627163968391249416054093529090485677808301343590811445080871279796162536469847469761747058736980603093722710824453312207182881241846080117790728778291633761198069016865260030288832065807438020772711645648333908622890343009942617559434851450007195025869850769670769715654662127278293639938359741401336592219730356884542179574372134014927006215640945952229142436595334916765255426954857520777553915330597952622785359222832224632624
d = invert(E, phi)
m = pow(c, d, N)
print(long_to_bytes(m))


[HDCTF 2023]爬过小山去看云

NSSCTF-Crypto靶场练习---41-46WP_第2张图片

希尔密码

NSSCTF-Crypto靶场练习---41-46WP_第3张图片

这里eightfourtwozeroeightfourtwoonezeroeighteightfourzerotwofourzeroeightfourzeroonezeroonetwofourx 包含了一串数字

翻译后842084210884024084010124 , 只有 02148 云隐密码。

EXP:

def de_code(c):
    dic = [chr(i) for i in range(ord("A"), ord("Z") + 1)]
    flag = []
    c2 = [i for i in c.split("0")]
    for i in c2:
        c3 = 0
        for j in i:
            c3 += int(j)
        flag.append(dic[c3 - 1])
    return flag

c = '842084210884024084010124'
print(de_code(c))

# ['N', 'O', 'T', 'F', 'L', 'A', 'G']

[LitCTF 2023]md5的破解

NSSCTF-Crypto靶场练习---41-46WP_第4张图片

md5爆破 少了 13,14,18,34 。

EXP:

from Crypto.Util.number import *
from hashlib import md5

enc = b'LitCTF{md5can3derypt213thoughcrsh}'
flag = [0] * 38
key = b'0123456789abcdefghijklmnopqrstuvwxyz'
flag[:13] = enc[:13]
flag[15:18] = enc[13:16]
flag[19:34] = enc[16:31]
flag[35:38] = enc[31:34]
for i in key:
    flag[13] = i
    for j in key:
        flag[14] = j
        for k in key:
            flag[18] = k
            for l in key:
                flag[34] = l
                m = md5(bytes(flag)).hexdigest()
                if m == '496603d6953a15846cd7cc476f146771':
                    print(''.join(chr(x) for x in flag))
# LitCTF{md5can123dexrypt213thoughcrpsh}

[CISCN 2023 初赛]Sign_in_passwd

image-20231214104000115

base换表解码。

第二行是base64码表,有 %3D,%2F,%2B 是Unicode编码,可以换成

'GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5'

EXP:

import base64

str = 'j2rXjx8yjd=YRZWyTIuwRdbyQdbqR3R9iZmsScutj2iqj3/tidj1jd=D'

string1 = "GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF"  # 替换的表

string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

print(base64.b64decode(str.translate(str.maketrans(string1, string2))))

# flag{8e4b2888-6148-4003-b725-3ff0d93a6ee4}

要把最后一个5去掉。


[CISCN 2021初赛]rsa

NSSCTF-Crypto靶场练习---41-46WP_第5张图片

新知识点挺好的。

我不知道叫什么。RSA已知高位攻击,这个是已知p高位。要利用到一个叫sage的工具。

简单讲一下,

  • 第一部分是e = 3的小明文攻击,轻轻松松
  • 第二部分是共模攻击,轻轻松松
  • 第三部分是已知高位攻击,用sage。具体原理还在学,只是从网上找了脚本。明天具体学习一下。

sage关键代码:

from sage.all import *
n = 113432930155033263769270712825121761080813952100666693606866355917116416984149165507231925180593860836255402950358327422447359200689537217528547623691586008952619063846801829802637448874451228957635707553980210685985215887107300416969549087293746310593988908287181025770739538992559714587375763131132963783147
p4=7117286695925472918001071846973900342640107770214858928188419765628151478620236042882657992902
e = 0x10001
pbits = 512
kbits = pbits - p4.nbits()
print(p4.nbits())
p4 = p4 << kbits
PR.<x> = PolynomialRing(Zmod(n))
f = x + p4
roots = f.small_roots(X=2^kbits, beta=0.4)
if roots:
    p = p4+int(roots[0])
    print ("n: ", n)
    print ("p: ", p)
    print ("q: ", n/p)

要用工具,或者在线网站https://sagecell.sagemath.org/

NSSCTF-Crypto靶场练习---41-46WP_第6张图片

NSSCTF-Crypto靶场练习---41-46WP_第7张图片

来源:https://blog.csdn.net/m0_57291352/article/details/120675242

EXP:

from Crypto.Util.number import *
from gmpy2 import *
import hashlib

txt = b''
c1 = 19105765285510667553313898813498220212421177527647187802549913914263968945493144633390670605116251064550364704789358830072133349108808799075021540479815182657667763617178044110939458834654922540704196330451979349353031578518479199454480458137984734402248011464467312753683234543319955893
e1 = 3
N1 = 123814470394550598363280518848914546938137731026777975885846733672494493975703069760053867471836249473290828799962586855892685902902050630018312939010564945676699712246249820341712155938398068732866646422826619477180434858148938235662092482058999079105450136181685141895955574548671667320167741641072330259009
for i in range(1000):
    if iroot(i * N1 + c1,e1)[1]:
        m = long_to_bytes(iroot(i * N1 + c1,e1)[0])
        print(m)
        txt += m
        break
c2 = 54995751387258798791895413216172284653407054079765769704170763023830130981480272943338445245689293729308200574217959018462512790523622252479258419498858307898118907076773470253533344877959508766285730509067829684427375759345623701605997067135659404296663877453758701010726561824951602615501078818914410959610
c3 = 91290935267458356541959327381220067466104890455391103989639822855753797805354139741959957951983943146108552762756444475545250343766798220348240377590112854890482375744876016191773471853704014735936608436210153669829454288199838827646402742554134017280213707222338496271289894681312606239512924842845268366950
e2 = 17
e3 = 65537
N2 = 111381961169589927896512557754289420474877632607334685306667977794938824018345795836303161492076539375959731633270626091498843936401996648820451019811592594528673182109109991384472979198906744569181673282663323892346854520052840694924830064546269187849702880332522636682366270177489467478933966884097824069977
e, s, t = gcdext(e2, e3)
c = pow(c2, s, N2) * pow(c3, t, N2) % N2
m = long_to_bytes(iroot(c,e)[0])
print(m)
txt += m
c4 = 59213696442373765895948702611659756779813897653022080905635545636905434038306468935283962686059037461940227618715695875589055593696352594630107082714757036815875497138523738695066811985036315624927897081153190329636864005133757096991035607918106529151451834369442313673849563635248465014289409374291381429646
N3 = 113432930155033263769270712825121761080813952100666693606866355917116416984149165507231925180593860836255402950358327422447359200689537217528547623691586008952619063846801829802637448874451228957635707553980210685985215887107300416969549087293746310593988908287181025770739538992559714587375763131132963783147
p = 11437038763581010263116493983733546014403343859218003707512796706928880848035239990740428334091106443982769386517753703890002478698418549777553268906496423
q = 9918033198963879798362329507637256706010562962487329742400933192721549307087332482107381554368538995776396557446746866861247191248938339640876368268930589
phi = (p-1)*(q-1)
d = invert(e3,phi)
m = long_to_bytes(pow(c4,d,N3))
print(m)
txt += m
print(txt)
print(hashlib.md5(txt).hexdigest())

[GWCTF 2019]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()

没有考什么,N可以直接分解,得到p和q。之后可以根据RSA计算出c1和c2.

c1和c2再根据z3就可以算出F1和F2了。

注意的是 z3中用的是Int类型,所以要求的c1和c2也要是int类型,原先 c1 = pow(m1,d,N) 这样得出来的c1是 mpz类型的,所以要用int转换。

EXP:

from Crypto.Util.number import *
from gmpy2 import *
from z3 import *
p = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377747699
q = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377748737
e = 65537
m1=90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
m2=487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546
N = p * q
phi = (p - 1) * (q - 1)
d = invert(e,phi)
c1 = int(pow(m1,d,N))
c2 = int(pow(m2,d,N))
s = Solver()
F1,F2 = Ints('F1 F2')
s.add(F1 + F2 == c1)
s.add(F1**3 + F2**3 == c2)
if s.check()==sat:
    print(s.model())
F1 = 1590956290598033029862556611630426044507841845
F2 = 1141553212031156130619789508463772513350070909
flag = b''
flag += long_to_bytes(F1) + long_to_bytes(F2)
print(flag)

你可能感兴趣的:(CTF学习笔记,CTFCrypto学习记录,CTF,学习,密码学,Crypto,python,算法)