周六打了下DASCTF

没了

complex_enc

题目描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from Crypto.Util.number import *
import random
from secret import flag


def GET_KEY(n):
sum=2
key=[1]
for i in range(n):
r=random.randint(0,1)
x=sum+random.randint(0,n)*r
key.append(x)
sum+=x
return key

def enc(m,k):
cipher_list = []
for i in range(len(m)):
if m[i] == 1:
cipher_list.append(m[i] * k[i])
cipher = sum(cipher_list)
return cipher

m=bytes_to_long(flag)
m = [int(bit) for byte in flag for bit in format(byte, '08b')]
key=GET_KEY(len(m))
c=enc(m,key)

with open('output.txt', 'w') as f:
f.write(str(c))
f.write(str(key))
题目分析:

超递增序列

exp:

1
2
3
4
5
6
7
8
9
10
11
from Crypto.Util.number import *
c = 287687761937146187597379915545639385740275457170939564210821293233370716878150576
key = [1, 2, 87, 99, 190, 380, 760, 1702, 3350, 6712, 13302, 26669, 53257, 106512, 213212, 426262, 852583, 1705083, 3410164, 6820581, 13640909, 27281818, 54563749, 109127508, 218254958, 436509851, 873019897, 1746039768, 3492079367, 6984158992, 13968317822, 27936635563, 55873271257, 111746542368, 223493084736, 446986169472, 893972338944, 1787944677888, 3575889355776, 7151778711750, 14303557423366, 28607114846668, 57214229693336, 114428459386792, 228856918773559, 457713837547023, 915427675094046, 1830855350188252, 3661710700376344, 7323421400752912, 14646842801505675, 29293685603011275, 58587371206022773, 117174742412045483, 234349484824090806, 468698969648181659, 937397939296363271, 1874795878592726601, 3749591757185453143, 7499183514370906547, 14998367028741812852, 29996734057483625898, 59993468114967251756, 119986936229934503501, 239973872459869007099, 479947744919738013939, 959895489839476027878, 1919790979678952055983, 3839581959357904111739, 7679163918715808223719, 15358327837431616447319, 30716655674863232894717, 61433311349726465789458, 122866622699452931578804, 245733245398905863157495, 491466490797811726314990, 982932981595623452629980, 1965865963191246905260222, 3931731926382493810520182, 7863463852764987621040623, 15726927705529975242080987, 31453855411059950484161974, 62907710822119900968323970, 125815421644239801936647918, 251630843288479603873295836, 503261686576959207746591710, 1006523373153918415493183613, 2013046746307836830986367190, 4026093492615673661972734253, 8052186985231347323945468456, 16104373970462694647890936894, 32208747940925389295781874025, 64417495881850778591563748059, 128834991763701557183127495888, 257669983527403114366254991760, 515339967054806228732509983520, 1030679934109612457465019967093, 2061359868219224914930039934133, 4122719736438449829860079868450, 8245439472876899659720159736935, 16490878945753799319440319473651, 32981757891507598638880638947330, 65963515783015197277761277894728, 131927031566030394555522555789579, 263854063132060789111045111579109, 527708126264121578222090223158048, 1055416252528243156444180446316096, 2110832505056486312888360892632193, 4221665010112972625776721785264450, 8443330020225945251553443570528835, 16886660040451890503106887141057670, 33773320080903781006213774282115477, 67546640161807562012427548564230882, 135093280323615124024855097128461699, 270186560647230248049710194256923398, 540373121294460496099420388513846796, 1080746242588920992198840777027693592, 2161492485177841984397681554055387246, 4322984970355683968795363108110774528, 8645969940711367937590726216221549105, 17291939881422735875181452432443098117, 34583879762845471750362904864886196180, 69167759525690943500725809729772392360, 138335519051381887001451619459544784838, 276671038102763774002903238919089569616, 553342076205527548005806477838179139174, 1106684152411055096011612955676358278348, 2213368304822110192023225911352716556750, 4426736609644220384046451822705433113446, 8853473219288440768092903645410866226907, 17706946438576881536185807290821732453830, 35413892877153763072371614581643464907890, 70827785754307526144743229163286929815519, 141655571508615052289486458326573859631099, 283311143017230104578972916653147719262229, 566622286034460209157945833306295438524626, 1133244572068920418315891666612590877049074, 2266489144137840836631783333225181754098066, 4532978288275681673263566666450363508196132, 9065956576551363346527133332900727016392264, 18131913153102726693054266665801454032784553, 36263826306205453386108533331602908065569081, 72527652612410906772217066663205816131138180, 145055305224821813544434133326411632262276342, 290110610449643627088868266652823264524552684, 580221220899287254177736533305646529049105368, 1160442441798574508355473066611293058098210736, 2320884883597149016710946133222586116196421472, 4641769767194298033421892266445172232392842944, 9283539534388596066843784532890344464785686063, 18567079068777192133687569065780688929571371951, 37134158137554384267375138131561377859142743902, 74268316275108768534750276263122755718285487804, 148536632550217537069500552526245511436570975608, 297073265100435074139001105052491022873141951360, 594146530200870148278002210104982045746283902576, 1188293060401740296556004420209964091492567805360, 2376586120803480593112008840419928182985135610512, 4753172241606961186224017680839856365970271221024, 9506344483213922372448035361679712731940542442048, 19012688966427844744896070723359425463881084884096, 38025377932855689489792141446718850927762169768220, 76050755865711378979584282893437701855524339536412, 152101511731422757959168565786875403711048679072824, 304203023462845515918337131573750807422097358145648, 608406046925691031836674263147501614844194716291296, 1216812093851382063673348526295003229688389432582797, 2433624187702764127346697052590006459376778865165617, 4867248375405528254693394105180012918753557730331006, 9734496750811056509386788210360025837507115460662129, 19468993501622113018773576420720051675014230921324265, 38937987003244226037547152841440103350028461842648406, 77875974006488452075094305682880206700056923685296910, 155751948012976904150188611365760413400113847370593722, 311503896025953808300377222731520826800227694741187444, 623007792051907616600754445463041653600455389482374933, 1246015584103815233201508890926083307200910778964749821, 2492031168207630466403017781852166614401821557929499642, 4984062336415260932806035563704333228803643115858999284, 9968124672830521865612071127408666457607286231717998666, 19936249345661043731224142254817332915214572463435997301, 39872498691322087462448284509634665830429144926871994535, 79744997382644174924896569019269331660858289853743989190, 159489994765288349849793138038538663321716579707487978260, 318979989530576699699586276077077326643433159414975956596, 637959979061153399399172552154154653286866318829951913129, 1275919958122306798798345104308309306573732637659903826311, 2551839916244613597596690208616618613147465275319807652591, 5103679832489227195193380417233237226294930550639615305147, 10207359664978454390386760834466474452589861101279230610294, 20414719329956908780773521668932948905179722202558461220588, 40829438659913817561547043337865897810359444405116922441176, 81658877319827635123094086675731795620718888810233844882508, 163317754639655270246188173351463591241437777620467689764860, 326635509279310540492376346702927182482875555240935379529854, 653271018558621080984752693405854364965751110481870759059704, 1306542037117242161969505386811708729931502220963741518119363, 2613084074234484323939010773623417459863004441927483036238705, 5226168148468968647878021547246834919726008883854966072477346, 10452336296937937295756043094493669839452017767709932144954692, 20904672593875874591512086188987339678904035535419864289909384, 41809345187751749183024172377974679357808071070839728579818768, 83618690375503498366048344755949358715616142141679457159637536, 167237380751006996732096689511898717431232284283358914319275072, 334474761502013993464193379023797434862464568566717828638550144, 668949523004027986928386758047594869724929137133435657277100288, 1337899046008055973856773516095189739449858274266871314554200576, 2675798092016111947713547032190379478899716548533742629108401375, 5351596184032223895427094064380758957799433097067485258216802527, 10703192368064447790854188128761517915598866194134970516433605054, 21406384736128895581708376257523035831197732388269941032867210108, 42812769472257791163416752515046071662395464776539882065734420216, 85625538944515582326833505030092143324790929553079764131468840607, 171251077889031164653667010060184286649581859106159528262937681073, 342502155778062329307334020120368573299163718212319056525875362112, 685004311556124658614668040240737146598327436424638113051750724224, 1370008623112249317229336080481474293196654872849276226103501448448, 2740017246224498634458672160962948586393309745698552452207002896896, 5480034492448997268917344321925897172786619491397104904414005793914, 10960068984897994537834688643851794345573238982794209808828011587706, 21920137969795989075669377287703588691146477965588419617656023175412, 43840275939591978151338754575407177382292955931176839235312046350824, 87680551879183956302677509150814354764585911862353678470624092701691, 175361103758367912605355018301628709529171823724707356941248185403485, 350722207516735825210710036603257419058343647449414713882496370806824, 701444415033471650421420073206514838116687294898829427764992741613648, 1402888830066943300842840146413029676233374589797658855529985483227499, 2805777660133886601685680292826059352466749179595317711059970966454839, 5611555320267773203371360585652118704933498359190635422119941932909634, 11223110640535546406742721171304237409866996718381270844239883865819325, 22446221281071092813485442342608474819733993436762541688479767731638735, 44892442562142185626970884685216949639467986873525083376959535463277328, 89784885124284371253941769370433899278935973747050166753919070926554729, 179569770248568742507883538740867798557871947494100333507838141853109648, 359139540497137485015767077481735597115743894988200667015676283706219166, 718279080994274970031534154963471194231487789976401334031352567412438331, 1436558161988549940063068309926942388462975579952802668062705134824876530, 2873116323977099880126136619853884776925951159905605336125410269649753060, 5746232647954199760252273239707769553851902319811210672250820539299506381, 11492465295908399520504546479415539107703804639622421344501641078599012695, 22984930591816799041009092958831078215407609279244842689003282157198025444, 45969861183633598082018185917662156430815218558489685378006564314396050678, 91939722367267196164036371835324312861630437116979370756013128628792101318, 183879444734534392328072743670648625723260874233958741512026257257584202636, 367758889469068784656145487341297251446521748467917483024052514515168405272, 735517778938137569312290974682594502893043496935834966048105029030336810544, 1471035557876275138624581949365189005786086993871669932096210058060673621088, 2942071115752550277249163898730378011572173987743339864192420116121347242216, 5884142231505100554498327797460756023144347975486679728384840232242694484649, 11768284463010201108996655594921512046288695950973359456769680464485388969041, 23536568926020402217993311189843024092577391901946718913539360928970777938082, 47073137852040804435986622379686048185154783803893437827078721857941555876305, 94146275704081608871973244759372096370309567607786875654157443715883111752579, 188292551408163217743946489518744192740619135215573751308314887431766223505070, 376585102816326435487892979037488385481238270431147502616629774863532447010118, 753170205632652870975785958074976770962476540862295005233259549727064894020344, 1506340411265305741951571916149953541924953081724590010466519099454129788040580, 3012680822530611483903143832299907083849906163449180020933038198908259576081160, 6025361645061222967806287664599814167699812326898360041866076397816519152162452, 12050723290122445935612575329199628335399624653796720083732152795633038304324883, 24101446580244891871225150658399256670799249307593440167464305591266076608649853, 48202893160489783742450301316798513341598498615186880334928611182532153217299508, 96405786320979567484900602633597026683196997230373760669857222365064306434599262, 192811572641959134969801205267194053366393994460747521339714444730128612869198530, 385623145283918269939602410534388106732787988921495042679428889460257225738396863]

key_dict = {i: key[i] for i in range(len(key))}
tmp = [0] * len(key)
for index,i in enumerate(key[::-1]):
if c >= i:
tmp[index] = 1
c -= i
print(long_to_bytes(int(''.join(str(i) for i in tmp[::-1][:-1]),2)))

1z_RSA

题目描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from Crypto.Util.number import *
from sympy import *
import os
from secrets import flag

nbit =130
e = 3
l = getPrime(505)
m = bytes_to_long(flag + os.urandom(64))

assert len(flag) == 29

while True:
p, q = getPrime(nbit), getPrime(nbit)
PQ = int(str(p<<120)+str(q))
QP = int(str(q<<120)+str(p))
if isPrime(PQ) and isPrime(QP):
break

n = PQ * QP
PP = nextprime((PQ >> 190) * (QP & (2 ** 190 - 1)))
QQ = nextprime((QP >> 190) * (PQ & (2 ** 190 - 1)))
N = PP * QQ
M = pow(m,1,l)
c = pow(m,e,N)

print('n =', n)
print('M =', M)
print('l =', l)
print('c =', c)

'''
n = 18339446336492672809908730785358232636383625709800392830207979464962269419140428722248172110017576390002616004691759163126532392634394976712779777822451878822759056304050545622761060245812934467784888422790178920804822224673755691
M = 36208281423355218604990190624029584747447986456188203264389519699277658026754156377638444926063784368328407938562964768329134840563331354924365667733322
l = 56911058350450672322326236658556745353275014753768458552003425206272938093282425278193278997347671093622024933189270932102361261551908054703317369295189
c = 720286366572443009268610917990845759123049408295363966717060100862857351750759651979922104897091176824666482923148635058966589592286465060161271579501861264957611980854954664798904862706450723639237791023808177615189976108231923
'''

题目分析: \[ \begin{align*} &PQ = p * 2^{120} * 10^{40} + q\\ &QP = q * 2^{120} * 10^{39} + p\\ &n = PQ * QP = pq * (2^{240} * 10^{79} + 1) + (p^2 + 10 * q^2) * 2^{120} * 10^{39}\\ &可以知道(2^{240} * 10^{79} + 1) < (p^2 + 10 * q^2) * 2^{120} * 10^{39}\\ &不过它们相差并不大,((p^2 + 10 * q^2) * 2^{120} * 10^{39})//(2^{240} * 10^{79} + 1) = 一个很小的数a\\ &故pq = n // (2^{240} * 10^{79} + 1) - a\\ &爆破即可得到pq,得到pq后(p^2 + 10 * q^2)也就出来了\\ &之后解方程即可得到p,q,如此PQ和QP也就出来了 \end{align*} \]

PS:p,q的10进制位数可能是39,也可能是40 此处具体是什么可以通过n的位数来确定。(自行去测一测就知道了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# python
from sympy import *
n = 18339446336492672809908730785358232636383625709800392830207979464962269419140428722248172110017576390002616004691759163126532392634394976712779777822451878822759056304050545622761060245812934467784888422790178920804822224673755691

nn = n // (2 ** 240 * 10 ** 79 + 1)
cnt = 0
for i in range(nn - 500,nn + 500):
cnt += 1
print(cnt)
if (n - i * (2 ** 240 * 10 ** 79 + 1)) % (2 ** 120 * 10 ** 39) == 0:
leak = (n - i * (2 ** 240 * 10 ** 79 + 1)) // (2 ** 120 * 10 ** 39)
p,q = symbols('p q')
res = solve([p ** 2 + 10 * q ** 2 - leak, p * q - i],[p,q])
for pp,qq in res:
if pp > 0 and qq > 0:
PQ = int(str(int(pp) << 120) + str(int(qq)))
QP = int(str(int(qq) << 120) + str(int(pp)))
print(PQ)
print(QP)
break
break
'''
PQ = 1612551962023919669547657045404858968387328704389406190014139631069342728192855604426214387476576649090490109822073
QP = 11372933566416532007055156607134588768203078133513243807951567056424906260481213149261930568621267125437333569321667
'''

PQ,QP得到之后N也就得到了 \[ \begin{align*} &m的位数:(29 + 64) * 8 = 744\\ &可以知道m = M + k * l\\ &m-744bit,M-505bit,l-505bit\\ &=>k-239bit,那么copper一下\\ &f = (M + k * l)^3 \end{align*} \] 未知位数239

大概粗略算一下:\(N - 760bit,760 * (1/3 - 0.02) \approx 238\),接近239,那我们把eplison设成0.02就行

1
2
3
4
5
6
7
8
9
10
11
12
13
# sagemath
from Crypto.Util.number import *
N = 763933528218428362740063144747893290714655295576768532896029874141179804730143020017430379534079773751531037961074867132893544981605022026151484151321515584652838724809597675412676810669583078026377048734720511960708515190930979
M = 36208281423355218604990190624029584747447986456188203264389519699277658026754156377638444926063784368328407938562964768329134840563331354924365667733322
l = 56911058350450672322326236658556745353275014753768458552003425206272938093282425278193278997347671093622024933189270932102361261551908054703317369295189
c = 720286366572443009268610917990845759123049408295363966717060100862857351750759651979922104897091176824666482923148635058966589592286465060161271579501861264957611980854954664798904862706450723639237791023808177615189976108231923
PR.<k> = PolynomialRing(Zmod(N))
f = (M + k * l) ^ 3 - c
f = f.monic()
kk = f.small_roots(X = 2 ^ 239, epsilon = 0.02)[0]
m = M + kk * l
print(long_to_bytes(int(m)))
# DASCTF{Ar3_Y0u_Su93_Abt139??}

found

题目描述:

task.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from Crypto.Util.number import *
from random import *
from secret import flag
from sympy import *

bits = 1024
l = 138833858362699289505402947409766595473722379891580589518174731439613184249727659678966809301611194545239974736175752769503863392697421092435438747741790652435801956708356186578269272819715592752821497122516109657809748674185639254430403157877064556216401002688452227124543508128414591884297632663910714681207

assert isPrime(l)

def generate_prime(bits):
return randprime(2**(bits-1), 2**bits)

def fun(data,y,n):
return sum([data[i] * pow(y,i,n) for i in range(len(data))]) % n

def gen(x, y, z, w, n):
data = [randint(n // 4, n) for _ in range(10)]
leak1 = pow(x + pow(y, z, n), w, n)
leak2 = fun(data, y, n)
return data, leak1, leak2

def encrypt(l,m,n):
mm = bin(m)[2:].zfill((m.bit_length() // 8 + 1) * 8)
length = len(mm)
c = []
s = []
for i in range(length):
a = randint(1, n)
s.append(pow(a, length, n))
for j in range(length):
c.append(pow(a,int(mm[j]),n) * s[j] % n)
return c

p, q = [generate_prime(bits) for _ in range(2)]
r = generate_prime(bits // 4)
n = p ** 2 * q * r
e1 = generate_prime(128)
e2 = generate_prime(128)
phi1 = p * (p - 1) * (q - 1) * (r - 1)
phi2 = (p - 1) * (p - 2) * (q - 2) * (r - 2)
d1 = inverse(e1, phi1)
d2 = inverse(e2, phi2)

t = getRandomRange(n // 4, n)
data, leak1, leak2 = gen(r, t, e1, d1, n)
m = bytes_to_long(flag)
c = encrypt(l, m, n)

with open('output.txt','w') as f:
f.write(f'n = {n}\n')
f.write(f'e1 = {e1}\n')
f.write(f'ed = {e2 * d2}\n')
f.write(f'data = {data}\n')
f.write(f'leak1 = {leak1}\n')
f.write(f'leak2 = {leak2}\n')
f.write(f'c = {c}')

output.txt:

1
2
3
4
5
6
7
n = 214189098485907407681203562477141616514627803973812423866137712061520397412283304756125615530911730190509122275581663270324067756428063773995710185422014937638013530995658678484408224195008950739065869752467503449898424403807629035201754909341605483646512086652631108980705938767234014655512244203488129210213088484751842078315616338034946509581920246058635374657554442252420460618886159118637553788160140879059706396460523335509806462257352635091258764319929220939182156189941663585022210802535804264016891744621140144859992731921592420695928759275864955373537480452694672023754214092487216273962896544919015905264313446548396379618341043583032673900608611135254563997519445284222602183035105369017270389887769617942348731416370092842162632579589494341854993600540689280924183073089475208340685636482246115054414077320832052204722015428500812923185709772796221129375539131726373252482799298746655947376656143301849009181701495003174228813534439192414768762803822975277797520157025175837722175072241107
e1 = 228246137071395297228647198378234575667
ed = 8238783462304466047370608758999664260116370123313022088538091162770601739116628806460542503654403361322931229200817491683096695046254053538710523477982774850621979868926682997393573131262930645387042545807254462907502249936746101134745335780459335767976492133149192198880107516742633966664923533160167069625322094242414191994000927842976472080411237834215691897822371792754587587715760051582955795834883174474583440371035173351136370107484245425758954400434828144460697864191261513214008084848001467959369934964428291290009392620134215667173457413630882523557102057539902909381706460767916715499306316003286608457624713509816056636249181986636842368337873445101552453774405927824096616431732124001038586048766823358751593885500314021939046991953062562270782883182855487098328026196086288533138907969729187779739950764344200364360079479047132746676799216491472345637845220255139152063453462176656553357596450484408472263570570448409671724853674399060252094955913831086556844240273178815236110565265190938731402297513542863173575371193878977
data = [193603701385184594048276446297744737347844155455814199029229254370819095264220091974816768902119954926302801843118379533491441884584844862023717354363708931808754214591949274005116312602470266455224300745234378334739914442825957439676825816095286879671572856543573545412426697260350097106803125967045751538098379621554276706631902573968990932601545418908413611604795306678592420345368691508562784200191380882967774951366660610843674931403729350555093525384690652277519795623276235852980416858565358154003587878300208098528966832086239417979777391494681625422699075412054104555896375767200357780876214697482279539710617118624420492042212547431773629635909699586152943845737306422831568007133429913359996553231286016257371771084485222883699365371680464830578176541643800648575916368592100327219233106270736571096051012729364523664646596211619481067284511430638593710269523511115314879651675455928382531667709288358296983594144246374318217425898507659427332121250143906371370125596969310464798423126240249, 83232380612179085215826775913833896343479487597490293209447462059425432761467292984732079051574095682196847182332185514688509237497856017321217461683610482188959719499015629286095774176457491111653557957143999953334057852475101888350978943356388186642898590728812465940108330672190227928625421072749647024169559486983638480319685288547544296403054632634251404824205877193034192901652740716146996859596783202683876256251962212218890324498229265768330077077203057547593303563888024392129443843671073192707033672163475010779991178255053309612338324024330477838635221307103942083495150839612907917081589848058122439842094169468710994236662623064896345386689141107875109648711753412281754135052688257147784328999027173384430726870349245991383171344678832691432716926162465638492315682356063658116939771331253319156940745604345000062001181547782395699365598033029965876642506023695814759189319385499447252988850495864839083230318317981608453608237316346106115145618735235568065107952583780196118328790150668, 124029091531781837962028113090891229294114028863714189021516519574129047489034463881315547790172815327938355138914693838967798779443291333910534381361187962962211286653473935493258148348900967873113580541784043054246605269411211310480597957210474116510188315932965508355182797058421774750514302992909396649836444171237873614791492630901328222719225432769644902694765224307250768110734386675470368037103624198545718645570697628428375762234137964943035358096894458271219594556780565100705603065942562805910805066341463216433921785734441069232766996055943985958999873124870066787588298481039034434476751819151203006932390088920722328035663237500463244782778252107794331963770339097484572423150244547488177952379501831335246484556589748671930152229193892849375083425231974250212167003455883859682356631577573979316259041674248398278005715972754743850288109105734019931884984180815338839040427348281561428946450368116928309897833525540729557152994911327587253232221945691931715727233240239217766670302737797, 183843790887043402011598370503205679765096296266458133303727667969475876955550067091982110668362517989161075686937475587191630156303515396551552747395896439855271453014845870528495608475291770177930209914889772055798265588308998461073614393953301177130478090234899660317573598133689999452854596939233245447620411925677910051195341774760199462465323236659615328986387497112194938688648467440994427880524194706366507582972449860152444844726883830270055690915264386828203868698790531311672618879594353865799279708001022240970903686800926148905846427187554297638489620066186565413471680781555570353090800565169455785422276246128112933238219941576176045528857395489547919586696112825074357320009241545156387826567778313197682430812363865044448037674266021191342500951073854543139099758191759460732927377434328243127385966404963426977560325865114581829641002303741276624429925421529144276258595779792107410344907550974793123288477149591078697881754824614502477971850569510391169576115446384775760103371690229, 77181491333455945581964325242677895484087511641751638314025871031862188693342644422469926996751891933595312224562658710026977124351245625357567306610633026710034325228119776532079710870381262899079582973396369685760835988946858436651701992338270031045842329350320465948557706153142357507371547722657387245712169797514661857231296527340158271569274281050502803588443964415706473620778191218694301701995011516227595325346642614102935318547327371194448611519374355163992727724271920609636416752265268455625828475046309417411350641630824310335290833466766886410952996256873847584658405040284125564777295671150020378326447929383302767250744865021112478842971725353014525757485093025086515069618536327355110519111251250847040981340091015719687780422065271394384964197564928514715001571354599930804427809172147344985789390354365168200779032355336019869878365166731683726800165060752463551011275760601115775930309162497471542196168545689657524323611832924586057251037468277241392800206625479037786453164131995, 73205035147442530516214566541083478692362666963351034174641204890993061156341833361471382741487873993415218899233020829417422641475896996781945068981179750572071381475551179347015232091326075147030318977902658370163575233636401307304118105596868322641969122224481337149842240110750279029669943793523807188344793098836560729793248976539513619414902542761745226667216171972158652220051070681390437970409917700389687006847358602838776592534429644530645228108318238605302552858660163726279648930505220310801443744840742779282348562009764207578257256917013697781985201356590904691201881074465767578202400193526454559744215480337739543855294040255939855585220261434451321167296169707368494834534854246202066172245412926996804327758827974522254706927188752034945933413541030683585047306280808869310753485476053485102398055904623441252859333696664969196044181265131793421817842193722029204872190808835304869795476166974073284194940969149929858850315553170586579171931372841255653797967227240150024403686700318, 130922536449620721874430591834893344565723848082365964975014011192154824561533294364763636501156167569463116422347814651711098794556121000604933883961221890226068691344209984798909070560094790519968140590302350163451597933415038932984088770323319866954739644053901699360711398638558276166591969032158320702311949515391689147215823312531012728672496602856530523058425713194004118786776568670195495029709727771569268007731817731032818592168140535384065850014708458707271415054346637938854605806067654806771791955707476012409629452391154116323782276692248254897822717314913613684100590993004116312109008343947373009165942573493957812296495916988918921330041670596637737127687419791813256185588201214925999361831016131784946056151576400022233684255417352789020121504134033344037825435901589346081468061266546900318139206924847037632306967700883103715011898296806759649283235666950730021534650640616764140909410457672528061603571546896273073945589966941026845451260864816435395290788038177260424513262717147, 96020307736423653849681099694795070685318392824245445231848257362698325458566036467905776769825156536584712839602346179866978464981920356841237715655104343433403974116231994567630132803569400576444622531225108131322496097985483053317699953160469549824368749143254898694578961392541769475761696371400655038962884511045507167846158292753076394297765351578172464979038847441532742344288573442736399426813737731962675826287940983072154853450868147991567341729978830384900766355148407527995483455876179619037540839473665468552119956231652786409322560587534009434185272785914134531600273010117895225594128038118745517974999777061068383501122026199178725628075723534153891577896276333860794903571069058930821070459114902328164990286376387263324567783343401640370228177304680590970952056142474240123353904350590944037465570541270903463939790277478872854503844901980335251732525427700804955963610238700131824229633507486167186619924488205009021735744358474958921593273970059532393434485837844520676695250253818, 70179739856827882014533856258768933317172692318810033540306741590616707369209255146711184424982274791424446113402776415419489619900890685813416198088324683031475573905382337205219919194813095298781099206022303955476518699780836375262573969549719034778449632890439019791098837172928410660181948068014058495402879740138532367574756729124558973222555734037856119443124996050898550301911936236705827128102625880992585253317343783711017535277283723063735482936442251712028665628766822410874182346801488486349311864283205496069261051995801486733862085378587473487850400998268984959754900117535252200774455334314910199051566060772584757900692014336924837851470210768677685669414832993403833367649813099107659677783796393020061413738567093031888744434338562745357883186640322598165729511817308735087619672370347973626978927281950583105981796610501521512515754484015947888094170824846319485769273061345748077326435513773977764989015743820427944157836645251581638303303228323898709077613114299155476100313184864, 175652862673132475686135264158791277818478759588755931484235300532096345677648348588548215587849294084744263688721294017179822791852874995430439770093077380941242256704253340009646924105298769803641006601733958786682523820789623229457197488801223995838476613815010250443077607721307486493845540520896295758708091075424003453148901604173203609500517681152737967682849411739285402305515347569269249451853704828406093324891360458117496271442944605647179886014243335325177990618809463830971905827773785311843128136687528632548334476401223625520208122482489755175042406263025133251070642315226465801303000300019213393276150665866439726799770645200082982057683225700125654562928186376718742163294884560481313657925863409955867645132050087094728187550662632446842091403257126146302052277968469833986267484560410928566363881330254151524449882128468203017476574322404834981270285221728133785929308192500229958517894515501598313596447501741967442356143089865549390247424732308735417202543341648593495568759658573]
leak1 = 63782905210425530505481328470901215858602521952143268285063726975781165023862017491713165035148561758359744187691236004961476685244204729186881465294593870263295057863529224333542417669099353919134017169079021119796312127454942459097916913630160780015465159099215782449518378655317557377730943183040588156411578967503892807601657964531263531800827109319360771506028467872403505576255454079928964831924379679811693997670940970879328723956168008599678202445646778122559604109680197340923640067256165995420276085239676074114984790470621236336955442487022895961512902129409872825988384566511568931733560589196495514916064010319354972344856680662983166422683519534959690898549129176191205471975798892082872953657585129852579114400603842863919636216016448322273003250153436580085016262564726570590917521967949071809656413167808022466093370500545030093675230568578130810948637578959017259848848965235015851786609346028580181557524008598197188435907179498427167374290247239043475093622634785391672663701563780
leak2 = 164672413727166337721772866174120090001862616525169315969424174412610694486913567414752676879059000161543960191013302451482547492432115422013012298207836023164304846473827400728343336837942904216130312606263701738236734690810362403432673024164173553927215310314954308227523856745581991136694642282091216197557529027661009649424727525610143053300188875828126262928055570667149587498799717883989617748569211692521249022845364829999098999961242961288235871016302642964967134624027387692331993011337128668923750920957011101171731606359456882239434664044073802224898066537743795029258834874316830952385525877115357530711935126892113666494741955018064580597273121999829121331202610749992150039102390905826245578147065592557989341002712478086016329470790557522670767213438205465130632789767891535615426167314729003703510227816955522793268816231554088672856958206359854051313036334217540137808313082440476308616336781858361392907337038725576212779598635717453175121497869836504186991949457946397544924556583220
c = []

题目分析

通过 \(e_2d_2\)\(n\) 我们知道: \[ \begin{align*} &e_2d_2-1=k*phi_2\\ &e_2d_2-1=k(p - 1)(p - 2)(q - 2)(r - 2)\\ &e_2d_2-1=k(p^2qr - 2p^2q - 2p^2r - 3pqr + ...)\\ &目的是求k进而求phi2\\ &\frac{e_2d_2-1}{n}=k+\frac{k(- 2p^2q - 2p^2r - 3pqr + ...)}{n}\\ &显然k(- 2p^2q - 2p^2r - 3pqr + ...)<n\\ &而(- 2p^2q - 2p^2r - 3pqr + ...) < 0\\ &所以\frac{k(- 2p^2q - 2p^2r - 3pqr + ...)}{n}=-1\\ &\Rightarrow k = \frac{e_2d_2 - 1}{n} + 1\\ &\Rightarrow phi2 = \frac{e_2d_2 - 1}{k}\\ &so现在已知的是phi2和n,但是里面有3个未知数,所以还得求出一个东西来\\ \end{align*} \]

我们知道有: \[ \begin{align*} &leak_1 \equiv (r + t^{e_1})^{d_1} \pmod n \\ &leak_2 \equiv\sum_{i=0}^{9}data_i * t^i\pmod n\\ &两个式子,两个未知数,这里毫无疑问是求\ r \ 了\\ &看到的想法就是通过\ leak_2\ 把\ t \ 求出来,然后计算\ (leak_1^{e_1} - t^{e_1}) \ 就能得到\ r\ 了\\ &但是这个\ t \ 并不小,这种方式似乎求不出来\\ &那么能否消掉它呢 \end{align*}\\ \] 我们将式子变一下 \[ \begin{align*} &f(t,r) \equiv (r + t^{e_1}) - leak_1^{e_1} \pmod n\\ &g(t) \equiv \sum_{i=0}^{9}data_i * t^i - leak_2\pmod n\\ \end{align*}\\ \] 对两个式子做一个结式,把 t 给消掉,但是由于 \(e_1\) 太大,故我们需要优化一下,考虑到 \(g(t) \equiv \sum_{i=0}^{9}data_i * t^i - leak_2\pmod n\),即 \(g(t) = kn\),我们知道在模 \(kn\) 下满足的式子,在模 \(n\) 下一定成立,所以在求 \(t^{e_1}\) 的时候再模一下多项式 \(g(t)\),这样得到的 \(f(t,r)\) 的度就低于10,之后让 \(f(t,r)\)\(g(t)\) 做结式即可得到 \(r\)

(经过测试当调到 epsilon = 0.03 时我们能求出 \(r\) 来)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from Crypto.Util.number import * 
from random import *

with open('output.txt') as f:
exec(f.read())

R.<t,r>=PolynomialRing(Zmod(n))

g = sum([int(data[i]) * t ** i for i in range(len(data))]) - leak2

asist = t
t_e = 1
cnt = 1
for i in bin(e1)[2:][::-1]:
cnt += 1
print(cnt)
if i == '1':
t_e = (t_e * asist) % g
asist = (asist * asist) % g

f = r + t_e - pow(leak1,e1,n)

h = f.sylvester_matrix(g, t).det().univariate_polynomial().monic()
res = h.small_roots(X = 2 ** 256,epsilon = 0.03)
if res:
print(res[0])

\(如此r,phi_2,n均已知道,解个方程即可得到p,q\) \[ \begin{align*} &p,q求出后发现pow(l,\frac{p - 1}{2},p) = pow(l,\frac{q - 1}{2},q) = -1\\ &所以可以知道l是p和q的二次非剩余\\ &又s \equiv a^{len(mm)} \mod n,其中len(mm)为偶数\\ &c_i = \begin{cases} l * s^{len(mm)},j = 1\\ s^{len(mm)},j = 0 \end{cases}\\ &\Rightarrow(小费马)\\ &(l * s^{len(mm)})^\frac{p-1}{2} \equiv -1 \mod p\\ &\ \ \ \ \ (s^{len(mm)})^\frac{p-1}{2} \equiv \ \ \ 1 \mod p\\ &若pow(c_i,(p-1)//2,p) = -1,则x = 1\\ &若pow(c_i,(p-1)//2,p) = \ \ \ 1, 则x = 0\\ &由此得到flag\\ \end{align*}\\ \] exp2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from Crypto.Util.number import *
from z3 import *
with open('output.txt') as f:
exec(f.read())
r = 77477547161688496725906506626131775883966333151442864639104100690032824193233

k = (ed - 1) // n + 1
phi2 = (ed - 1) // k

# s = Solver()
# p, q= Ints('p q')
#
# s.add((p - 1) * (p - 2) * (q - 2) * (r - 2) == phi2)
# s.add(p ** 2 * q * r == n)
# if s.check() == sat:
# print(s.model())

p = 168207689659417173628607066039457820275276732311636007089001107530860513351122555769649031031435042743185528528881857626080873859026128498997148721030271703030768717788591275936600239642357340350598106488044312274746860587888105379606096757814370419770414183228756583472285941821276338279728115488001890742673
q = 97707929018805957546753225343143490125285071269910025402668681477127527381672117514147518538470060994557862749309042238326448721045026099601424607832524228224510318920129326794773863846005792678034679056020514793964664097594210383339219122809427128901179158534676129014329576699155669500220463663254504200451

flag = ''

for i in c:
if pow(i,(p - 1) // 2,p) == 1:
flag += '0'
else:
flag += '1'

print(long_to_bytes(int(flag,2)))
# DASCTF{c764ba09-b2aa-12ed-ab17-9408ad39ce84}

Finally:

赛后看到别人wp写的知道了令一种解法,直接求p,绕过了leak,这里贴一下: \[ \begin{align*} &ed \equiv 1\mod (p - 1)(p - 2)(q - 2)(r - 2)\\ &2^{ed} \equiv 2 + 2^{k(p - 1)(p - 2)(q - 2)(r - 2)} \equiv 2 \pmod p\\ &p = gcd(2^{ed} - 2, n) \end{align*} \]

EZshamir

题目描述:

task.sage

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import os
from random import getrandbits
from hashlib import sha256, md5
from Crypto.Util.number import *
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from secret import flag

class Shamir:
def __init__(self, pbits, noise_bit, n, m):
self.pbits = pbits
self.noise_bit = noise_bit
self.n = n
self.m = m
self.p = getPrime(pbits)
P.<x> = PolynomialRing(Zmod(self.p))
self.poly = P([bytes_to_long(sha256(os.urandom(32)).digest()) for i in range(self.n)])

def sample(self):
t = getrandbits(self.pbits)
y = int(self.poly(t))
noise = getrandbits(noise_bit)
return (t, y | noise)

def get_msg(self):
res = []
for i in range(self.m):
res.append(self.sample())
return res

pbits = 400
noise_bit = 32
n = 100
m = 75

shamir = Shamir(pbits, noise_bit, n, m)
coefficient = shamir.poly()
key = "".join([str(i) for i in list(coefficient)[1:]])
key = md5(key.encode()).digest()
aes = AES.new(key = key, mode = AES.MODE_ECB)
ct = aes.encrypt(pad(flag, 16))

with open("data.txt", "w") as f:
f.write(str(shamir.p)+'\n')
f.write(str(shamir.get_msg())+'\n')
f.write(str(bytes_to_long(ct))+'\n')

data.txt

1
2
3
p = 1914861180127910915217161496032452354459288330404267938814385633318816795789745430689392291853522228462459760259540145551
a = [(871685718803663381427930478762339134295053004512609923589551466783266783810259304828550374243064535763376291757646963959, 202160546047966750331912360731430418240633973593625005229082586127891061162361922677243409978233971196981357156050665207), (880630661134451484589856936400581718913135314681369937077374828269467594291354487238721693384105758714624990294669591318, 1095968002726348118037606681187141462053336336722142181092378890939072246257043346524710197351420437134900753767241347071), (2201481802919131040050333908088433208558917203945919199978631826943299343536825970006258238556122903076523292840756434743, 692254736946777374134144410762495005358360246411034340533738679554417430991182506230475828234351704793913692448647675007), (1378304382181829689586748896745391077371970833336011385982116414924775680216930605930619270704824436444608781376558454118, 1349836972600983636760377380443471914884359770040030987799061599827409370783772298884084190105572886840534075250106753145), (1353153805805015283526548792279508930383121644895000056925297797888893262990508466655386951026647093911241738634749231794, 708640659789589986759360580045421230914410242138084549192350870784628479597574645622638880069506009868145944996982225278), (1060943952101159814075555130286870049673510249558382992676797709837360932812847335287824269141102612270742087176360534041, 1039246257482395034113137526078027968667726416005827851568387262127498749146041230779139405404483176650987996444622585854), (2424118466972165402210232064008571072995878364648534891594437945505312271409808703384482184386252162745547514610618028336, 635156696412302837761915637951567688860519995373738062624916498633145442364997312202584276482319362616731324143180341246), (1772241931859851196567261257895529032033057998867860001437142889635454121520207911859978309001300625929738493595845855555, 500604911497932506773931452024208499570885483407547558939058205116845746585850868300414311672651970998734159786902749117), (187044491746709666918227023301039735707457548611767420757592410489694090421689472337383722846260140189038198219461031942, 227360883946968296249705407270310276359769497016888615738491818601296225309783611129587894811655567646792586796017233916), (698522560244433302990615272949028179635002687309158390959480083880213377867539289895143372657572453749378003459093150970, 1438446488346299625609140434323525340139617346663444436909013102079035123226801253230191914228775608263694160574643826415), (1314293541818269470008262253418684239221368418527916534392752287558240541875482130114787897305513520252998018265836595136, 933106402921508526957532367623168847119197804766985507707958985877339350054085035066950570021869141193740290685053960123), (1501745172784237049923522578654390251325669575513607134910901665808936517556360097769749957840258117848678845196676974438, 1516777488301366348170721193695469080262430948767494893352311177358850775942249045078694319757619073073088994542922628861), (1718313250889012550002734353486104431289067168806022987862850465345813017177898627414672453244745977044381286178413506161, 506057417158279773145112367533063233326190899630436097648290976200406049591277922238049560242268646574334872382933403615), (2574114678492270903282456732270950593394194358462333441160509514501148947640703147403802718744307473847235179125898798831, 1503310774908591444184865449721473627976722270933784408676574059139777045024294387334806494605277115228299871854598791166), (1770243408559044970812149306040976785192946281881654467315187543403793080522851914844996680381886937167658398949087446193, 1099237075950355774454839935750271630613513947414691912497783029355832037700530351594087156234712938075324990262460261245), (2166086041023587382902739106621961372440200378327129977520031042444044378994128764308981213008281610274832831816068579582, 662709908868241192557028160616176772511764390044399310771390622778705044736473497185759270701465132475627229112002146287), (2170463762878343673691652149382892550249493539913487563393294153717628928418073705621516968910372026548584895576642432967, 1413676394542378061807394780263485269329077458637078447074464881203630348193024572124672013567573482444837133106653543455), (1129266289804637843248865446624604876222278055268049666382746600434990532837254822384883357227875808573227656504651891817, 1535832745242864345604750984721590856572422259228943440577864210008688452305222147646810543026576688303372824677842288383), (2306555154959167883502684934268021903550464872811594873384525370627065323932167910172723635326929186844444801386870524867, 574207014379682600904001842474004352741607105704886122985304177072984415266547565043126591318153332317051149516485422972), (1724617341290962542300349861015192124473593787607849187241871123866653776294891983393875816012660538610025134685453770248, 1037506311823536647118763707562050051146414393535410677631530307480219373475166677371198285257502421566885284344997084663), (202616766252415923229841624622749382197002736241072130496684863225861466295470440453433729087043063339640795866357221636, 1486069111757435527648291199412538135459418727823506381342991481853059317128849411787275828115963269643450637901851750359), (782072578333357184532047183424922628763983310554137973249125608272717772586145583974361061586170067251618252434433193104, 283757911494107775111019950316083145592345149507512192994272372101655062364071745340414019692327679359235776555825852415), (2197595167942118116042253773798345585826387963460510458606977372991191820486797272252095468231729659915814456157670560486, 955293934596965502510872570415413020132164928134045802395033751487848017887015144832326371969637236306696054523237785589), (1098157283702819563820742199423754909028104781243946454418867995181539307551856844793857199640783377355282394025101300655, 635111390180648841537968959615311456853925067622053148053038395898914597955860998732345527697104011201693008366561317143), (1539369283131984995745859995105101736066475537281347948822432206665809508754710210661232887491808392388057664234877214907, 1873336536033306125287332317304933459481487853852475402907316652085126765046749618993624553154025815108827029610442783458), (2105684701096534411811602939870350859970761398331640507345513836997797916059406457337165075287082983610738904681969289045, 1070056100602518593988818068846549889380286647944194826819905043161724050669042969316031968306712388470995120352413349630), (142489011778634823488933340993644406251365634143001554672065147110660487229716505211502368066478460823953952289740995290, 1600505031347134429197259601839106217157515935077383802359036680943190353630112460191899585397343290624969344500745894703), (554711031900068277207319195022074787064807351540056727585559478009641245829914129658355024028140622126230477378977389537, 65339521639683012798947456976243744037602872322070608133060186211835711806848370610017017866030009537787109068192454654), (532900849979395683891747931991929993723658239680866376615001124559008204600725833769158798743570050012188528983307982345, 334144016771241488303216672075523455061388505657739817526966708251875900758813513342313135616513439456734341083743369135), (869702918099306179247127839502723535611690279734139047798433105147760657329410795136726045654330604238870805984709621246, 1169351283105013313749641940783038490083938869389146122787264490618765187367135121126934960933658038044552677868393266925), (786239400981081690761967926939692614214352370457999126682279606306346828244856149092806342991454830115357428173569519111, 341229317116770102168944480795910149567176593419165900124153031167345358788428115442807890687039322892597408592425778007), (2064213065995911617919315029041029121543167107287437882288959061187785048503282055451690399898250479932109432366548223997, 865205430622864313641681018820800198136329954993789609121686669624009340125228193996720833574248608603224773986947432415), (1996571933560681341081972550429260163713030332385776633835663546385508374790580854691775408939051083454291050879529580125, 559622002964744852554436566542525646157533309978763685146044798881793139644019170010343656282702809565334484141114392471), (1665201866056279622733275067329071022333699015026928761307123522986743452132023670960400981020146860918570153444345681972, 1206659985279999461070238583934930315667638779868565409888110141662803190569415230894181412146290317311945493517622418483), (1515824630378748853880547205191400487565887686063520538971380532161078510669610334484477786016989319170924543667026641318, 154768510600010010017326698396207970330238438685198973674456030784650112353692986269413531937661879315225602124927708924), (2400640362993011976891348699605911902016988451462173893625476704482508356176787307014920885489349704332546642981698540069, 1121421906118323024216284095711804126345276955926784522370067713782427318851230923383318334457757167182928811853910539965), (914679394823164487648957492231711749917619119979512000391828434330805091270968219541264417579001916453063785209093025303, 374627069056072738750323688310128739794138886219071824099120374559973078400286337012659440934169856150484268780102828020), (1021972013999414078223981430633642397558044349935082594710388870307835007718638824792649139809042384573145837264785258692, 102093917357525962153933641992946656421204665316272197308632790969421027148825374536157392412871816080580115446708002591), (1090613002154339666672492884775405717313689831457406446112184992081112549743653583926163772335048052650217605191460964064, 1013686859153230698540678410867250429548404782986370285534810877495709441098450523218264937019132584108142305563714746606), (2161046501022327990933396497482765893753709560942237251106031463450880235879988355009303131242535391464106086265266338474, 1842825126623549349236000977359585068860414649531034170142594564984327572182360450517454690000097975914639809219290654045), (734600260267770729123110997283110745757092649194443870464263775523592639286156519663230810008655565992062564338915033184, 1439472390868656814802271856900227714476824912359664972147156053839098765837149646453806800388007932953080250670815772651), (881335900275714936417588963897633003585264162416587081468620588101288614371107988322661634495058217226298025521720126634, 1438060177355585280770231938473797663421441580729795412881287946986577092068342750409767988724102261013424113586148457982), (876173729780067336779925806297809473013555554668200124165269741312909223647316933287442159368855433236050789576297672813, 584722637090302053439384198012199760324880317678105782762720083676914628942486088928409942979389876557255132127516159991), (1733558429089397683359597663185076627234549140640918522337597781379981378009350733554208954192805660163725305958818509205, 1010477387678444338602582972843701290504497269295430761287923107029938822433731115008623372768060580369747062615441406973), (1758000758086776729345325124199287880198692107697670885448853730203070351345566212118269510767350031899984650531292511829, 1484408939224604508966101404659297622265311898991708197399154932571955375325130297122648740841893311564144118335134464767), (1804131890436486866363129670875272535127829613109307224638927349502815652920038318044827248066297349084047126682198723537, 205851561043462971495790984180238782403371191306463313748537952075031757233102533087892093246459879467418213080624418525), (115055233675952369353652759916228030654313474433562820828539341357745365094094469880187786426435712648771454584499932530, 1176080864489594177205517592453183512444290818765306305520846987245653463202230068116379056777589684194022156652500590286), (2328185963017050382404641363914321749130815400658884925780323745763587492366183441185791654864416499947607965414839983680, 1886972372164945427290729032551681924723044624295253696412030824048931146570915452349880650169939511030432165431905079162), (1187461847839408713851221476312312384869325749843380494840008651043567024911068726332857155522639869883501560564590472502, 14245981570273560431111454126826341091354415427387740559245555665941487543601004914128539171516718107049427670791071455), (1275402030469087379247637832029139314437943507754693234009807154397029994354617242802931983091961356790463942774885431413, 1244618585414033483912499539268357193993901084573974055024618656871349876744646123907837743332137138284077968028988239205), (434412507816189969843251866894800201497317336949194643079967243932448367734854234524383921690504689272627248814185361829, 1193224411748734492892063266412070819051994764468021617840046995194588804893634149301845035319723286201666783735434959871), (967206800413690215868425566102618623559678834432686964828977512828919721907280699739833113197470139412151190023683313494, 1808530961381834386234136376719035780314110457320233165055990056489953593025409242256807470925700807422319096558572795309), (313624779412398332754376720890766035026328871037358868168298423270666735999144035960122672900278781994670311217953770375, 1686899500506262775384473022726677756466624697749756704659992441285341042856582261569357914257097304916151170085370461887), (2503049409019801269651799221722260539204050296212337202096008034125758666888245353212657377647881087341258220743220151950, 1805670425703721038437117454438319230600703158318099419770216013430708468787297957979021344350598998116788430512286857710), (542793615526234040152647477936504636873290026979804505200706031754909176961382452267207291751054204331474258583862955704, 137413216840404664240606423528330611923289618863367088636432169005845572010429296034368451334357274658088690084213739519), (1278727765228747216000039330509641392475448645848420065175572576050796418025108532539983143839105111868933395201633094022, 23388499359309984016274969787898858204391606769507546898645785064534114465222342746534462082168690576567031618802237437), (1012848580192164395816758294581574397534987673377799482227399907475636722043236850766024023620412517564680586256857352143, 1905214326869438439368196073362306288481014496204443072620153943726399155969870686475260450389360494546627630953811148739), (14681804970662677021409260234892378252555735233958673970664432299644093318314837872915339633110893420712659256185701001, 1011761630527797621590321605066946971053085037922024159289431337005985850853467103097812975363878048453898707806902513147), (1285297724752785338545033366325253262303128927017049271006754406539647664563391436762226286574374768602309413720192759993, 1493631305230939817393915729396076315723258260416123252804505906893714637325280535095299471289740565654113670071232495263), (1936455326607738910358536004445045468685935298243245355139607465446389473389575731412354107347767379820812067955096505581, 17221509529814003689149745147239645298120184452011530064684368807629510922529681925724732647573630702864807669020485630), (1712173121206746224826777847167590088908487771935061508185448418705799456315866273530139739504675597716276421618856320329, 863258960233895711001625204805338525869459949675833484269384656157104193362371966225031203968537041681324265578127949567), (122947819386929089053369455928546401519366926955589935482151285368760894784571110782585692673158533373827447719944343791, 1029102739229804972707735760530574223266205866939373652705629746591419564062928935797957680207632040596245681227704817914), (2385767142510533504647214446664898369383090132453476416454822794037991187237960157132343084153289103535309857420295111775, 1761624877069474386824225334992881109136596455709107320013742630575693526591737171363464568721656277644139593399384668014), (812771942753829583712722765469520203663717266127958627830326203252222513862479475416772893289895236549766564327139922612, 1400551965978757484763340299740157171921224208542574495162921941233365483529203665206398541892811136907423472715818784767), (1730447421466464570286474725493766890793606044225883792125770759375672642470742177732074062181325776806752255986611978352, 1227172422842784980554449107675660327741994737748190415035709694965213848256121533465275911556767542681543052337917439991), (884876570094879628298320898305798783174822422253214800767481822053599408285668812621687108791956015225332329856833897849, 753204920370187659065626153785437381083012604855618525406022085513242388007754850086113679887120336586260993544726445815), (2423878693124084232298267862648738136330397292982760413012437397441533882471872339001090243864079240084356627531832647422, 77986001656302970387684242942282141405916785932070787943262406584312194694807333266164831908062494860407574874622803959), (1290185371498453630061135665764650237444736789468400436115999443209964260044045414036036267228562648112405016415084034369, 68976337771940690010768399948574523361633543589446521911372413501313976435844421496476544211566756895340409483041171429), (534185007935476498632058534030834014275044346188926848916387521022740118957225895686427252642167800163347935460364558055, 731879744398464762194277983635893240035937844142280555568092822946046633080006561051406094554262898470573348173297417945), (2009543648096147223331131572743756103868310430657031922289948135024763757031731292638042205835167380178315151642456024876, 864568612425196666545678285566636785636433247142630432401391420609479878443671268150141447157212173236963221732165810175), (1757088643325711453646774590651240485497713141719261877086100356614624931730830270746024611221269656481354818801893802862, 974732470392774737526017597270025996122553373618728789664042196211840392818797860303355085148223560919202565975591828989), (288236986926014229269042124754978817491981631142567735873084199780621570926784314358694003281689620128867232148908447783, 1677180488607905300411659606081989540342864981198203708964066014660249657102993313228752304204059137461689367948628457454), (2357100534536251965755486926312170142467175578829851375102247846264889085384519286073305902768874043332485938824401972401, 701015346799246873651989606339191939588270778423404768025441929439466616345395882534334734331126078737835606277756551038), (361601359553041584651624082197420503156194921051661310152767809536879950298413026398079782027847432778044471125267794148, 338870184820594722235914590766168929044789583242319904735556030852263040707796808350885054449714833051229949699390437343), (437493113470125074131702090577490292225129373521518638964839429915294209870286662477332241046314129156199317300178856910, 304951333972637627160342487320016313244618388459742922018615396895218523409067458512473044675590109759792913998170528746)]
ct = 14058554635665083618818231958810639805770645952778992611953881143316377164307777281092527452513347998950720853358361

题目分析:

知道如下关系式:

\[ \begin{align*} x_1 + y_1 \equiv m_{99} * t_1^{99} + m_{98} * t_1^{98} + ... + m_0 \pmod p\\ x_2 + y_2 \equiv m_{99} * t_2^{99} + m_{98} * t_2^{98} + ... + m_0 \pmod p\\ ...\\ x_{75} + y_{75} \equiv m_{99} * t_{75}^{99} + m_{98} * t_{75}^{98} + ... + m_0 \pmod p\\ \end{align*} \]

构造如下格:

\[ M = \begin{pmatrix} 1&&&&&t_{1}^0&t_{2}^0&\cdots&t_{75}^0\\ &1&&&&t_{1}^1&t_{2}^1&\cdots&t_{75}^1\\ &&\ddots&&&&&\ddots\\ &&&1&&_{1}^{99}&t_{2}^{99}&\cdots&t_{75}^{99}\\ &&&&2^{256}&-y_1&-y_{2}&\cdots&-y_{75}\\ &&&&&p&&&&\\ &&&&&&p&&&\\ &&&&&&&\ddots&&\\ &&&&&&&&p\\ \end{pmatrix} \]

最后75列乘上A = \(2^{256}//2^{32}\)来平衡目标向量中的元素

得到下面对应的目标向量:

\[ (m_0,m_1,...,m_{99},1,k_1,k_2,...,k_{75}) * M = (m_0,m_1,...,m_{99},2^{256},Ax_1,Ax_2,...,Ax_{75}) \]

\(m_i\)即我们要得到的一系列系数项

最后将它们拼接一下即可得到最后的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from hashlib import *
from Crypto.Util.number import *
from Crypto.Cipher import AES

with open('data.txt', 'r') as f:
exec(f.read())# p, a, ct

T = [i[0] for i in a]
Y = [i[1] for i in a]

M = matrix(ZZ,100 + 75 + 1, 100 + 75 + 1)

for i in range(75):
for j in range(100):
M[j, i + 101] = pow(T[i], j, p)
M[100, i + 101] = Y[i]
M[100 + 1 + i, i + 101] = p

M *= 2 ** (256 - 32)

for i in range(100):
M[i, i] = 1
M[100, 100] = 2 ** 256

M = M.LLL()
print(M)
for i in M.list():
if i[100, 100] == 2 ** 256:
res = i[1:100]
key = "".join([str(i) for i in res])
key = md5(key.encode()).digest()
aes = AES.new(key = key, mode = AES.MODE_ECB)
print(aes.decrypt(long_to_bytes(int(ct))))

DAS_DSA

题目描述:

DDAASSSAA.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

from Crypto.Util.number import *
import hashlib

b2l=lambda x:bytes_to_long(x)
l2b=lambda x:long_to_bytes(x)
def xor(A,B):
return bytes([a ^ b for a, b in zip(A, B)])
class SimpleDSASigner:
def __init__(self, p, q, g, x,KEY):
self.p = p
self.q = q
self.g = g
self.x = x
self.y = pow(self.g, self.x, self.p)
self.KEY=KEY
def sign(self, message):
h = int(hashlib.sha256(message).hexdigest(), 16)
k = b2l(xor(message,self.KEY))
r = pow(self.g, k, self.p) % self.q
s = (inverse(k, self.q) * (h + self.x * r)) % self.q
if r != 0 and s != 0:
return (r, s)
def verify(self, message, r, s):
h = int(hashlib.sha256(message).hexdigest(), 16)
w = inverse(s, self.q)
u1 = (h * w) % self.q
u2 = (r * w) % self.q
v = ((pow(self.g, u1, self.p) * pow(self.y, u2, self.p)) % self.p) % self.q
return v == r
def give_gift(self):
return (self.p,self.q,self.g,self.y)

task.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import random
from DDAASSSAA import *
from Crypto.Util.Padding import pad
from flag import FLAG
ALPHABET = "DAS"
KEY_LENGTH = 32

def generate_random_string(length, chars):
return ''.join(random.choice(chars) for _ in range(length))

def get_message(num_messages):
return [generate_random_string(random.randint(20, 32), ALPHABET) for _ in range(num_messages)]

def get_key():
return generate_random_string(KEY_LENGTH, ALPHABET).encode()

def get_strong_prime(kbits):
while True:
q = getPrime(kbits)
p = q * 2 + 1
if isPrime(p):
return p, q

def write_to_file(filename, data, rwx="w"):
with open(filename, rwx) as file:
for item in data:
file.write(f"{item}\n")

if __name__ == "__main__":
num_messages = 2024 // 65
messages = get_message(num_messages)
p, q = get_strong_prime(256)
x = random.randrange(q)
key = get_key()

signer = SimpleDSASigner(p, q, 2, x, key)
write_to_file("GIFT.txt", messages)
signatures = [signer.sign(pad(msg.encode(), 32)) for msg in messages]
write_to_file("enc.txt", map(str, signatures))
write_to_file("enc.txt", [str(signer.give_gift())],"a")

assert FLAG==b"DASCTF{"+key+b"}"
GIFT.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SDSSDASSAAASSDADSASADASSSSADDS
SADADDAASSAASDSAAAAADS
SSASDDDSSSSDDSDAAAAAASAASDSA
SASSDSDSSSDSSDSDASADDA
SDDAAASASADDAADDSSSSDASAASADSA
AASADASADDSDDASADSAS
DASDDDDAASADDASADAAAAAADS
DSAAAASASDDDDDDSSASDADSASDDA
ADSSSSAADDSDDDADAADD
ASDDSADAASSASSDSDDSSD
SASSDDAASDDSADSDSSDAASSAD
DADSDAASAADDAAASASSSA
DADDADSSDADAADSSADDADDDSSDAS
AAASDSSDSAASDADDSADSDA
ASDASSDSDDADADSDSDDDDADSSAADAS
SDSASDADDASDASSDSAAASSASSDADA
AADDSSDSDADSASDDSASSDDD
SAADASAADAASDDDSASSDAASAAAS
SSDDADSAADSDSSADSADSAASASDSAS
DSDDAAASDDDSAASSDDDAASADSS
SASSAAAAAAADSDASSDASSDAS
DDDASAASDAADSSSASAAAADSDD
SASADSSSAADDASADDDADD
ASDDDDSDDSSSAASASDSSDDASA
DSAASDSDAADAAAAASADSDDDDAAA
ADSDADDDASASDSDADSADADDSASSSD
ADADDASSDSDASADDSADSD
SASAASDSDDASADASSSDSAAA
SASDDADSSDASDDSSDSDA
ADAASDSSDSDASSASADDSDDASAS
AADADDSAADDDSASADASSDAADADAA
enc.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
(59254487398967388114905667045028363843329923626238494813205814542210325221866, 38134152657262330507433713437784426184950965354807113354631630191330303144120)
(7272091585909282735283006759301331954064261183899338079418296410637263888770, 25499964678151126566605578540840513489434638253159604087981425065951344757164)
(6899645492048427857621143178962093646174799398991863666101058693217698732368, 9791582686238213337967141368906212036310014918808878260483336268832064128819)
(25004120896291255053237639070744331951278481119827357255754648579794346195560, 141512006531073436448016797005260994098008785866923890662245540709534244927)
(2970680424634969125510981613739745658897845410407912521400879068659540408508, 21793011307831199247000930716490000926029175766326909085969585420590222327264)
(54566000630497640561512172245143554745650114820675965968691149808463168361994, 14349862994826483344159692458388566295460798903541941504424537018216650283613)
(75159685495692974866291952764676724718763580667689472941977359299782008334398, 70458140884809949567915541063312538538372757595177423386408938073672211639375)
(20041025052466338500977838626769109456575569706600589389016534358968746705758, 65530083011107720400920780939345704754954869671333734672594688826098321351660)
(70127192435034402135747706941502224672808592757766109942714487474501491910214, 57063474646503909216126596725677068514339517777473453937098665282959018241139)
(9691674719110233709152049443866537766465800386755314400120771762265195237696, 62093763551744197212031574855244002702924782008725363963219173846480120194830)
(71705536377844454384479609516094364197930343317149881589774662842233960882414, 77374603032347186343803094100249733360600621594214414598796066240713702791608)
(52879693221782582945807231749976747516107564896599455986464226581743117039645, 1344584960351311598238142429846629993914377848692708811135221930719773821079)
(77382790022991362370508965243223326049308313776687214599186184000848696471646, 43641233828500431963081402892838426285406919342406723474664571883294369141394)
(56346141869522955969887972614456267251604757060687228073793419107933969328162, 76285674574149814839616688665569434237657824816977670694242559140508233840268)
(13673786393914569132256858604647869957632869873889606981549833789272316263013, 55327829510120473782794486945583818434703312785066895788282945944551470490709)
(64767740468987944636292946852714160626094908713011502873333251460983428727987, 13259490361346409766866273875042192439139048727072955549892484859673179719539)
(3957421961183318932163297455146838208380750250268324980567615749312524020603, 26882140137481455957383933013829466811327529673163422516945649296787438630196)
(26427922029900012253901950242265848521558605010629901777129266992870754082725, 69951840114040217998552588969628162605092507207522992695398095063314527794456)
(41377529326816743042387061355650636824586430044255853849728865473372840135697, 11219359019456290145545276763003725218855047474525360923001515509608652449000)
(25716607607446503241765016815241812755718791371526314953930748513731536667770, 28453782213087434330094261632474010077787574243224303728751260500450723227337)
(19800391798756020076641438144957219387739406397111495660920822320302304854123, 45451686690348328576376896082606976500453603983712180502700202971927238065259)
(38726290839677684687529233274549282905118675478275260942535144771737271586397, 40829316203033016996956478373044348905634931325393076578307296318880401948880)
(39209612764454560795450300186392582769693156243512973558204034254768849812055, 1354495451811853700039180690705948597695565424847801455594169929311025313998)
(65513712517147774905818288938959930101260466094015953149923879872714745367445, 15372704507991354781967074099137226451034611060413049367266363154832614415805)
(15729001560566023616632342669016214191974988848807788455841465085832368458445, 16327134664007312833089147621817036851276111964898734022794700122827444854947)
(42181696175119369852613642818168055609726913997313538977450877772345284116500, 9844926061501886811803369928846120575402269452312877926396348651872911440254)
(66136301537002842836817588252827389434354772150463143258637074246966542574050, 40179237579762663098604891208246052072476264271372972425562554108399403298795)
(28759447425094984124057238672075080352158483766211322160596339820824930247130, 31809179023991813094371890170356817265600467849999331763205655801654108159032)
(46713611880672324334213026166944979498146683097425440783760089321619754080806, 23270114877894114090584274918755188867365261145736710892185678426446455871613)
(57079205189933243387798430767693634017842334556643904914267966016857671112460, 18247249527866143497935092319901700668290600772967638096649240924154901762810)
(10688647176294432598580110142909961685073598720504815121442568862023227643325, 54331697420125697460151875535555752680845260504979536685075170636565355173106)
(156169498993837300941969389078565637464689185713213578550979549862042014984607, 78084749496918650470984694539282818732344592856606789275489774931021007492303, 2, 59080272611010540206200716660225398487916425104605746321153704646003914371135)

这题没看,赛后复现的

参考来源:https://tangcuxiaojikuai.xyz/post/83b88224.html#more

题目分析:

已知: \[ \begin{align*} &k_i \equiv s_i^{-1} * (h_i + x * r_i) \pmod q\\ &k_i \equiv s_i^{-1} * h_i + x * r_i * s_i^{-1}\pmod q\\ &k_i太大了,故爆破2字节\\ &k_{ih} * 256^{30} + k_{il} \equiv s_i^{-1} * h_i + x * r_i * s_i^{-1}\pmod q\\ &k_{il} \equiv s_i^{-1} * h_i + x * r_i * s_i^{-1} - k_{ih} * 256^{30}\pmod q\\ &k_{0l} \equiv s_0^{-1} * h_0 + x * r_0 * s_0^{-1} q - k_{0h} * 256^{30}\pmod q\\ &接下来消掉x\Rightarrow\\ &s_i * r_0 * k_{il} - s_0 * r_i * k_{0l} \equiv h_i * r_0 - h_0 * r_i + s_0 * r_i * k_{0h} - s_i * r_0 * k_{ih} \pmod q \end{align*} \]\(c_i = h_i * r_0 - h_0 * r_i + s_0 * r_i * k_{0h} - s_i * r_0 * k_{ih}\)

从而构造如下格: \[ M = \begin{pmatrix} 1&&&&&&s_0r_1&s_{0}r_2&\cdots&s_{0}r_{30}\\ &1&&&&&s_{1}r_0&&&\\ &&1&&&&&s_{2}r_0&&&\\ &&&\ddots&&&&&\ddots&\\ &&&&1&&&&&s_{30}r_0\\ &&&&&256^{30}&c_1&c_{2}&\cdots&c_{30}\\ &&&&&&q&&&&\\ &&&&&&&q&&&\\ &&&&&&&&\ddots&&\\ &&&&&&&&&q\\ \end{pmatrix}_{31 + 1 + 30} \] 最后30列乘上\(2^{256}\)使得到的最小向量和目标向量大小接近

得到目标向量:

\((k_0, -k_1, -k_2,...,-k_{30}, 1, l_1, l_2, ..., l_{30}) * M = (k_0, -k_1, -k_2,...,-k_{30}, 256^{30}, 0,0,...,0)\)

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from itertools import product
from Crypto.Util.Padding import pad
from hashlib import *
from Crypto.Util.number import *
from tqdm import tqdm

p, q, g, y = (156169498993837300941969389078565637464689185713213578550979549862042014984607, 78084749496918650470984694539282818732344592856606789275489774931021007492303, 2, 59080272611010540206200716660225398487916425104605746321153704646003914371135)
message = ['SDSSDASSAAASSDADSASADASSSSADDS', 'SADADDAASSAASDSAAAAADS', 'SSASDDDSSSSDDSDAAAAAASAASDSA', 'SASSDSDSSSDSSDSDASADDA', 'SDDAAASASADDAADDSSSSDASAASADSA', 'AASADASADDSDDASADSAS', 'DASDDDDAASADDASADAAAAAADS', 'DSAAAASASDDDDDDSSASDADSASDDA', 'ADSSSSAADDSDDDADAADD', 'ASDDSADAASSASSDSDDSSD', 'SASSDDAASDDSADSDSSDAASSAD', 'DADSDAASAADDAAASASSSA', 'DADDADSSDADAADSSADDADDDSSDAS', 'AAASDSSDSAASDADDSADSDA', 'ASDASSDSDDADADSDSDDDDADSSAADAS', 'SDSASDADDASDASSDSAAASSASSDADA', 'AADDSSDSDADSASDDSASSDDD', 'SAADASAADAASDDDSASSDAASAAAS', 'SSDDADSAADSDSSADSADSAASASDSAS', 'DSDDAAASDDDSAASSDDDAASADSS', 'SASSAAAAAAADSDASSDASSDAS', 'DDDASAASDAADSSSASAAAADSDD', 'SASADSSSAADDASADDDADD', 'ASDDDDSDDSSSAASASDSSDDASA', 'DSAASDSDAADAAAAASADSDDDDAAA', 'ADSDADDDASASDSDADSADADDSASSSD', 'ADADDASSDSDASADDSADSD', 'SASAASDSDDASADASSSDSAAA', 'SASDDADSSDASDDSSDSDA', 'ADAASDSSDSDASSASADDSDDASAS', 'AADADDSAADDDSASADASSDAADADAA']
r = [59254487398967388114905667045028363843329923626238494813205814542210325221866, 7272091585909282735283006759301331954064261183899338079418296410637263888770, 6899645492048427857621143178962093646174799398991863666101058693217698732368, 25004120896291255053237639070744331951278481119827357255754648579794346195560, 2970680424634969125510981613739745658897845410407912521400879068659540408508, 54566000630497640561512172245143554745650114820675965968691149808463168361994, 75159685495692974866291952764676724718763580667689472941977359299782008334398, 20041025052466338500977838626769109456575569706600589389016534358968746705758, 70127192435034402135747706941502224672808592757766109942714487474501491910214, 9691674719110233709152049443866537766465800386755314400120771762265195237696, 71705536377844454384479609516094364197930343317149881589774662842233960882414, 52879693221782582945807231749976747516107564896599455986464226581743117039645, 77382790022991362370508965243223326049308313776687214599186184000848696471646, 56346141869522955969887972614456267251604757060687228073793419107933969328162, 13673786393914569132256858604647869957632869873889606981549833789272316263013, 64767740468987944636292946852714160626094908713011502873333251460983428727987, 3957421961183318932163297455146838208380750250268324980567615749312524020603, 26427922029900012253901950242265848521558605010629901777129266992870754082725, 41377529326816743042387061355650636824586430044255853849728865473372840135697, 25716607607446503241765016815241812755718791371526314953930748513731536667770, 19800391798756020076641438144957219387739406397111495660920822320302304854123, 38726290839677684687529233274549282905118675478275260942535144771737271586397, 39209612764454560795450300186392582769693156243512973558204034254768849812055, 65513712517147774905818288938959930101260466094015953149923879872714745367445, 15729001560566023616632342669016214191974988848807788455841465085832368458445, 42181696175119369852613642818168055609726913997313538977450877772345284116500, 66136301537002842836817588252827389434354772150463143258637074246966542574050, 28759447425094984124057238672075080352158483766211322160596339820824930247130, 46713611880672324334213026166944979498146683097425440783760089321619754080806, 57079205189933243387798430767693634017842334556643904914267966016857671112460, 10688647176294432598580110142909961685073598720504815121442568862023227643325]
s = [38134152657262330507433713437784426184950965354807113354631630191330303144120, 25499964678151126566605578540840513489434638253159604087981425065951344757164, 9791582686238213337967141368906212036310014918808878260483336268832064128819, 141512006531073436448016797005260994098008785866923890662245540709534244927, 21793011307831199247000930716490000926029175766326909085969585420590222327264, 14349862994826483344159692458388566295460798903541941504424537018216650283613, 70458140884809949567915541063312538538372757595177423386408938073672211639375, 65530083011107720400920780939345704754954869671333734672594688826098321351660, 57063474646503909216126596725677068514339517777473453937098665282959018241139, 62093763551744197212031574855244002702924782008725363963219173846480120194830, 77374603032347186343803094100249733360600621594214414598796066240713702791608, 1344584960351311598238142429846629993914377848692708811135221930719773821079, 43641233828500431963081402892838426285406919342406723474664571883294369141394, 76285674574149814839616688665569434237657824816977670694242559140508233840268, 55327829510120473782794486945583818434703312785066895788282945944551470490709, 13259490361346409766866273875042192439139048727072955549892484859673179719539, 26882140137481455957383933013829466811327529673163422516945649296787438630196, 69951840114040217998552588969628162605092507207522992695398095063314527794456, 11219359019456290145545276763003725218855047474525360923001515509608652449000, 28453782213087434330094261632474010077787574243224303728751260500450723227337, 45451686690348328576376896082606976500453603983712180502700202971927238065259, 40829316203033016996956478373044348905634931325393076578307296318880401948880, 1354495451811853700039180690705948597695565424847801455594169929311025313998, 15372704507991354781967074099137226451034611060413049367266363154832614415805, 16327134664007312833089147621817036851276111964898734022794700122827444854947, 9844926061501886811803369928846120575402269452312877926396348651872911440254, 40179237579762663098604891208246052072476264271372972425562554108399403298795, 31809179023991813094371890170356817265600467849999331763205655801654108159032, 23270114877894114090584274918755188867365261145736710892185678426446455871613, 18247249527866143497935092319901700668290600772967638096649240924154901762810, 54331697420125697460151875535555752680845260504979536685075170636565355173106]

M = matrix(ZZ,33,31)
khigh = [''.join(bytes) for bytes in product("DAS", repeat=2)]
tmp_1 = matrix.identity(31 + 1)
tmp_1[-1, -1] = 256 ** 30
tmp_q = matrix.identity(31 - 1)
tmp_q *= q
tmp_0 = matrix.zero(31 - 1, 31 + 1)
M = tmp_1.stack(tmp_0)

A = matrix(ZZ, 31 + 1, 31 - 1)
h0 = int(sha256(pad(message[0].encode(), 32)).hexdigest(), 16)
for kh in tqdm(khigh):
print(kh)
k0h = bytes_to_long(bytes([a ^^ b for a, b in zip(kh.encode(), message[0][:2].encode())]))* 256 ** 30
for i in range(1, 31):
hi = int(sha256(pad(message[i].encode(), 32)).hexdigest(), 16)
kih = bytes_to_long(bytes([a ^^ b for a, b in zip(kh.encode(), message[i][:2].encode())])) * 256 ** 30
ci = hi * r[0] - h0 * r[i] + s[0] * r[i] * k0h - s[i] * r[0] * kih
A[0, i - 1] = s[0] * r[i] %q
A[i, i - 1] = s[i] * r[0] %q
A[-1,i - 1] = ci % q
tmp = A.stack(tmp_q)
tmp *= 2 ** 256
MM = M.augment(tmp)
res = MM.LLL()
k0l = abs(res[0][0])
k0 = k0h + k0l
key = long_to_bytes(k0 ^^ bytes_to_long(pad(message[0].encode(),32)))
if (all(j in b"DAS" for j in key)):
print(key)
break
# AADDAASAAASSSASSDSSASSDDDSDAAASS