DASCTF-0X401 2023

本校的师傅出题,稍微看了一下,还是捧个场。

ezDHKE

选个光滑素数P发给server,然后ph求dlp就行了。

from Crypto.Cipher import AES
from hashlib import sha256
from Crypto.Util.number import *

a = 3993627002035720184336786224535530764038918932960236609241477350225745139351858731871652971759661359753546821710808478399796791365839350372068697557971984053318985012915167193287593818766555949315695414321804323556873286295630485477171830555760615779882479036789375296463277771251697588579518998855475319788508
b = 4726638805540145659693548169346450898841330209851702104081552725872875633193804791673766260557439483077593308339263017173827361496609024044100283827632651872523961184401005440895404296225657091560294084761764932127000281792901107217300822232077742962859186853422490741968948070101523900021559148138809946994501
p = 16019087551284149685860070031007264573419104447873117115539880544891100109948498947204257425231755260244937936073724518347822141862321871998118899360634871494027262452206466139375087501767969916100005683173721822899114916431262519059470468133035208689671683707975792296984171342914355279446107199266497948345107
g = GF(p)(2)
a = GF(p)(a)
c = b"'\x88\x1e\xcc\n6zR\xb8(\xadg\x17\x1a\xb3&\xe3\x82\xa6\xde\xb8\x1c'\x8b\r\x01h:?=\xd3\x86\xd8E8Q\xbf5\x19\x86#\xeeK{TC\xbf\x1d"
d1 = discrete_log(a,g)
key = sha256(long_to_bytes(int(pow(b, d1, p)))).digest()
iv = b"dasctfdasctfdasc"
aes = AES.new(key, AES.MODE_CBC, iv)
m = aes.decrypt(c)
print(m)

ezRSA

首先是对N的分解,还是剪枝算法,但是他是右移之后再异或的,因此需要把老脚本稍微改一点,要注意第一层rsa解出来的是个偶数,需要加N才是n。

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

N,gift,c1 = 75000029602085996700582008490482326525611947919932949726582734167668021800854674616074297109962078048435714672088452939300776268788888016125632084529419230038436738761550906906671010312930801751000022200360857089338231002088730471277277319253053479367509575754258003761447489654232217266317081318035524086377,8006730615575401350470175601463518481685396114003290299131469001242636369747855817476589805833427855228149768949773065563676033514362512835553274555294034,14183763184495367653522884147951054630177015952745593358354098952173965560488104213517563098676028516541915855754066719475487503348914181674929072472238449853082118064823835322313680705889432313419976738694317594843046001448855575986413338142129464525633835911168202553914150009081557835620953018542067857943
# P_h = gift >> (512-16)
#
# def findp(p,q,q_):
#     if len(p)==(512-16):
#         pp=int(p,2) + P_h * 2 ** (512-16)
#         if gcd(N,pp) > 1:
#             print(pp)
#             print(N//pp)
#     else:
#         l=len(p)
#         pp=int(p,2)
#         qq=int(q,2)
#         if (pp^qq)%(2**l)==gift%(2**l) and pp*(qq*2**16 + q_)%(2**l)==N%(2**l):
#             findp('1'+p,'1'+q,q_)
#             findp('1'+p,'0'+q,q_)
#             findp('0'+p,'1'+q,q_)
#             findp('0'+p,'0'+q,q_)
# for q_ in range(2**16):
#     findp('1','1',q_)

P = 8006847171912577069085166877758626954304824756138758266557706391662987806065132448544117840031499707938227955094109779732609035310252723066470330862622641
Q = N//P
assert P * Q == N

phi = (P-1)*(Q-1)
d = invert(11,phi)
n = pow(c1,d,N)
print(n+N)

后边部分就是常见的rsa相关攻击,因为不知道flag长度所以需要爆破一下:

from Crypto.Util.number import *

n = 83410392685813224685786027640778560521035854332627839979281105731457044069408118952629284089869335506983096270269822559619624906180108256504440296527471536363057103101146262613593336072556587341466840510200003498265457285439149541137127199088938421905041387224795918868443175561632999479925818053898100117419
c1 = 69307306970629523181683439240748426263979206546157895088924929426911355406769672385984829784804673821643976780928024209092360092670457978154309402591145689825571209515868435608753923870043647892816574684663993415796465074027369407799009929334083395577490711236614662941070610575313972839165233651342137645009
c2 = 46997465834324781573963709865566777091686340553483507705539161842460528999282057880362259416654012854237739527277448599755805614622531827257136959664035098209206110290879482726083191005164961200125296999449598766201435057091624225218351537278712880859703730566080874333989361396420522357001928540408351500991

def attack(c1, c2, e, n,le,h):
    PR.<x>=PolynomialRing(Zmod(n))
    g1 = x^e - c1
    g2 = (h*2^(le+8)+x*2^8+125)^e - c2
    def gcd(g1, g2):
        while g2:
            g1, g2 = g2, g1 % g2
        return g1.monic()
    return -gcd(g1, g2)[0]

e=11
h = b"dasctf{"
b = b'}'
h = bytes_to_long(h)
b = bytes_to_long(b)
print(b)
for le in range(1,300):
    try:
        t = attack(c1,c2,e,n,le,h)
        print(long_to_bytes(int(t)).decode())
    except:
        continue

ezAlgebra

copper求t,gb(或者结式)求q,然后在mod q下解方程,最后还是需要爆破。

from Crypto.Util.number import *
from tqdm import tqdm

n = 119156144845956004769507478085325079414190248780654060840257869477965140304727088685316579445017214576182010373548273474121727778923582544853293534996805340795355149795694121455249972628980952137874014208209750135683003125079012121116063371902985706907482988687895813788980275896804461285403779036508897592103
c1 = 185012145382155564763088060801282407144264652101028110644849089283749320447842262397065972319766119386744305208284231153853897076876529326779092899879401876069911627013491974285327376378421323298147156687497709488102574369005495618201253946225697404932436143348932178069698091761601958275626264379615139864425
c2 = 722022978284031841958768129010024257235769706227005483829360633993196299360813
c3 = 999691052172645326792013409327337026208773437618455136594949462410165608463231

PR.<x> = PolynomialRing(Zmod(n))
f = x^4+x^3+x^2+x-c1+1997
root = f.small_roots(X=2^32, beta=0.5, epsilon=0.02)
#(t+p)^4+(t+p)^3+(t+p)^2+(t+p)^1+1997
t_ = ZZ(root[0])
print(t_)
p = GCD(c1-1997-t_-t_^2-t_^3-t_^4, n)
nn = ZZ(n//p)

t = t_
PR.<m,x> = PolynomialRing(Zmod(nn))
f2 = 1997-c2
f3 = 1997-c3
for _ in range(1, 20):
    f2 += (m*t)^_
    f3 += (m+t)^_

G = [f2,f3]
I = Ideal(G).groebner_basis()
res=[x.constant_coefficient() for x in I]
q = res[-1]

PRq.<y> = PolynomialRing(Zmod(q))
f = 1997-c3
for _ in range(1, 20):
    f += (y+t)^_

y = 56985796272753226120469211992443340429346162287195965942430959147227534853120
for i in tqdm(range(2^22,2^24)):
    tmp = ZZ(y + i * q)
    if b'dasctf' in long_to_bytes(tmp):
        print(long_to_bytes(tmp))
posted @ 2023-07-23 15:06  ZimaB1ue  阅读(183)  评论(0编辑  收藏  举报