ezzzecc

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
p = getPrime(256)
a = getPrime(256)
b = getPrime(256)
E = EllipticCurve(GF(p),[a,b])
m = E.random_point()
G = E.random_point()
k = getPrime(18)
K = k * G
r = getPrime(256)
c1 = m + r * K

c2 = r * G

cipher_left = s2n(flag[:len(flag)//2]) * m[0] #flag的前半部分乘m[0],所以只要用密文的除于m[0]即可得到flag前半部分
cipher_right = s2n(flag[len(flag)//2:]) * m[1] #flag的后半部分点乘m[1]


p = koZP3YQAklARRNrmYfjxoKIAXegOcG4jMOmKb08uESOkCCn72d6UM2NWgefYPEMq4EJ1M0jKaqt02Guo5Ubccjqg4QZaaHbScREx38UMLQKwG0LcDd8VFX1zkobc1ZQn4L3DhKQrgJZI55todgOdJuHN532bxScAvOF26gJyQclPtRHn3M6SHrRCEXzzmszd68PJlLB6HaabrRrCW9ZoAYSZetM5jDBtNCJLpR0CBZUUk3Oeh2MZQu2vk8DZ1QqNG49hlxGfawp1FXvAZPdMwixzkhEQnbCDcOKzYyT6BZF2Dfd940tazl7HNOswuIpLsqXQ2h56guGngMeYfMXEZV09fsB3TE0N934CLF8TbZnzFzEkOe8TPTK2mWPVSrgmbsGHnxgYWhaRQWg3yosgDfrEa5qfVl9De41PVtTw024gltovypMXK5XMhuhogs0EMN7hkLapLn6lMj
p的格式为p={p}

a = 87425770561190618633288232353256495656281438408946725202136726983601884085917
b = 107879772066707091306779801409109036008421651378615140327877558014536331974777
K = (49293150360761418309411209621405185437426003792008480206387047056777011104939 : 43598371886286324285673726736628847559547403221353820773139325027318579443479)
G = (34031022567935512558184471533035716554557378321289293120392294258731566673565 : 74331715224220154299708533566163247663094029276428146274456519014761122295496)
私钥k小于1000000
c1 = (3315847183153421424358678117707706758962521458183324187760613108746362414091 : 61422809633368910312843316855658127170184420570309973276760547643460231548014)
c2 = (12838481482175070256758359669437500951915904121998959094172291545942862161864 : 60841550842604234546787351747017749679783606696419878692095419214989669624971)
cipher_left = 75142205156781095042041227504637709079517729950375899059488581605798510465939
cipher_right = 61560856815190247060747741878070276409743228362585436028144398174723191051815

m,G,k,rK=kG,c1=m+rK,c2=rGc1=m+rkG,kc2=rkGm=c1kc2m,G,k,r\\ K=kG,c_1=m+rK,c_2=rG\\ c_1=m+rkG,kc_2=rkG\\ m=c_1-kc_2

给的pbase解码后没有得到有用信息,估计是个干扰项,因为所给的点多,完全可以用方程求出p,首先ecc上的点满足方程

y2x3+ax2+bmodpx3+ax2+by2=kpy^2\equiv x^3+ax^2+b\mod p\\ x^3+ax^2+b-y^2=kp

那么代入两个点求gcd就是p的整数倍,K,G两点代入运气好,正好是p,之后就是上面的推导

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
a = 87425770561190618633288232353256495656281438408946725202136726983601884085917
b = 107879772066707091306779801409109036008421651378615140327877558014536331974777
K = (49293150360761418309411209621405185437426003792008480206387047056777011104939, 43598371886286324285673726736628847559547403221353820773139325027318579443479)
G = (34031022567935512558184471533035716554557378321289293120392294258731566673565, 74331715224220154299708533566163247663094029276428146274456519014761122295496)
c1 = (3315847183153421424358678117707706758962521458183324187760613108746362414091, 61422809633368910312843316855658127170184420570309973276760547643460231548014)
c2 = (12838481482175070256758359669437500951915904121998959094172291545942862161864, 60841550842604234546787351747017749679783606696419878692095419214989669624971)
t1 = K[0]**3 + a*K[0] + b - K[1]**2
t2 = G[0]**3 + a*G[0] + b - G[1]**2
from Crypto.Util.number import *
p = GCD(t1, t2)
assert isPrime(p)

li = prime_range(2**17, 2**18)
for k in li:
if k * G == K:
print(k)
break

c1 = E(c1)
c2 = E(c2)
m = c1-k*c2
cipher_left = 75142205156781095042041227504637709079517729950375899059488581605798510465939
cipher_right = 61560856815190247060747741878070276409743228362585436028144398174723191051815
print(long_to_bytes(int(cipher_left//m[0]))+long_to_bytes(int(cipher_right//m[1])))

*happy2024

not2022but2024.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from Crypto.Util.number import *

CBC_key = b''

p,q = getPrime(512),getPrime(512)
n = p * q
N = n**2 + 2024
hint = (pow(3, 2022, N) * p**2 + pow(5, 2022, N) * q**2) % N
c = pow(bytes_to_long(CBC_key), 65537, n)

print('n =', n)
print('h =', hint)
print('c =', c)

'''
n = 104765768221225848380273603921218042896496091723683489832860494733817042387427987244507704052637674086899990536096984680534816330245712225302233334574349506189442333792630084535988347790345154447062755551340749218034086168589615547612330724516560147636445207363257849894676399157463355106007051823518400959497
h = 7203581190271819534576999256270240265858103390821370416379729376339409213191307296184376071456158994788217095325108037303267364174843305521536186849697944281211331950784736288318928189952361923036335642517461830877284034872063160219932835448208223363251605926402262620849157639653619475171619832019229733872640947057355464330411604345531944267500361035919621717525840267577958327357608976854255222991975382510311241178822169596614192650544883130279553265361702184320269130307457859444687753108345652674084307125199795884106515943296997989031669214605935426245922567625294388093837315021593478776527614942368270286385
c = 86362463246536854074326339688321361763048758911466531912202673672708237653371439192187048224837915338789792530365728395528053853409289475258767985600884209642922711705487919620655525967504514849941809227844374505134264182900183853244590113062802667305254224702526621210482746686566770681208335492189720633162
'''

h32022p2+52022q2modN52022h3202252022p2+q2modNh\equiv 3^{2022}p^2+5^{2022}q^2\mod N\\ 5^{-2022}h\equiv 3^{2022}*5^{-2022}p^2+q^2\mod N\\

D=21024[kp2q21][DN000D32022100D52022010Dh00D]=[0p2q2D]D=2^{1024}\\ \left[\begin{matrix}-k&p^2&q^2&1\end{matrix}\right] \left[\begin{matrix} DN&0&0&0\\D3^{2022}&1&0&0\\D5^{2022}&0&1&0\\Dh&0&0&D \end{matrix}\right]= \left[\begin{matrix}0&p^2&q^2&D\end{matrix}\right]

格约化后如下,鸡块师傅说要爆线性组合,将有用的一、二、四向量通过线性关系组合在一起,使得向量满足右侧的0,p2,q2,D0,p^2,q^2,D,第四组向量最后一个值就是DD,那么将一、二向量线性后与四相加即可,发现当取0,-1,1组合时,刚好第二个值与ngcd不是1,那么就能得到p,q

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[

0 -10829855882476309588095088960596108037048924398498800057364399621851344944416258375573181967644268808233961083085079299496021474141919708844558632250709922446263266578740642095457990441655630708958665184156844568729859238933338690602934189495036188164556018367960629267527624320040256247770188873247335295955 84357365335183669121068020628085055278993481271859547357293244085763993132687410726630860876303625475434362055082236374885680900076118930182120498435802725475765148711971534387343829087921267226923205885822174368431418127991130203994864614673129404486811760187347060102208153159854073964430263917209340268777


0]
[

0 123483071122488352474937054108972423925099278780902119505284712608921972325337670184723844903078951187931029975029992887635574546340850416853249606155161612152143118851548243470145461600380766499576688801904164474682148392667274317625567159630854506769530241356850895354458040119429740926502603600224168328649 51631310117262820262300998229797260027791325505545796038186782644765171791934312723164001613878718167098064170067987006846816885124509389058908309720489414235268424333501843276046655644630030183747818026098080897714817856153611567508181228175989622493369435842130613450682499236192006978130170792479425086872


0]
[179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216 26305109191698999835600458076613358926227665139398953433029597629978536346637643288750114414156815268493040227582477517589366606212907183102086560603369003272000910136925868730345364192975494201984877958062605755740513571137413491725819979367750727067793919302964482265979841579831786764078656737573852285964 -20956398366510309315283952121442395757409921755240591587131335275084206231659444480862539531807906535892327028245195913055593218615472486900248210748701213678298501910099160115824008751843443654705207096409023274871409795979275610958191382206884587512704812691049899100438138814136916709080970223159040760097


0]
[

0 -16868326395426488939143630798555497577478795659479383959393323067636029414782047049265438108166801129225704411997090401531164060503372265790655887432558900601986422244300131340388528052512205012552573488367239129594898012535433902628134740311492341181158971153860262996778425519995424115375075038951464682560 -26571446571231327996852645571424336393446318150719085157504167732013700226492987183712515531371311750273022543799402577108782327592236911342820151920640478352952541926842428532722566642617879565167641969497843858439216739463839752249370429637954379992624824271907260961780376503102641957991725090123771273329 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216]
1
2
3
4
5
6
7
from Crypto.Util.number import *
p = 11846999515401139806618780458482772585816656222161925595380112630854263318903047176862162285755281915011589524788709945023820217521669415569797208065004797
q = 8843232253452023198148910973171792528097625293390986776279717090408574023147147184296799017387195228226745620931200309526558703313140847991678439468175101
c = 86362463246536854074326339688321361763048758911466531912202673672708237653371439192187048224837915338789792530365728395528053853409289475258767985600884209642922711705487919620655525967504514849941809227844374505134264182900183853244590113062802667305254224702526621210482746686566770681208335492189720633162
e = 65537
m = pow(c, inverse(e, p-1), p)
print(long_to_bytes(m)) # b'mylove_in_summer'

happy2024.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
from not2022but2024 import CBC_key
from Crypto.Util.Padding import pad

flag = b'flag{}'
from Crypto.Cipher import AES
from hashlib import sha256
import random

n = 31
m = 80
M = random_prime(2^256)
As = [random.randrange(0,M) for i in range(n)]
xs = [random_vector(GF(2),m).change_ring(ZZ) for i in range(n)]
Bs = sum([As[_] * vector(Zmod(M),xs[_]) for _ in range(n)]).change_ring(ZZ)

IV = sha256(str(int(sum(As))).encode()).digest()[:16]
aes = AES.new(CBC_key,AES.MODE_CBC,iv=IV)
cipher = aes.encrypt(pad(flag,16))
print(cipher)
print(Bs)
print(M)

"""
b'%\x97\xf77\x16.\x83\x99\x06^\xf2h!k\xfaN6\xb0\x19vd]\x04B\x9e&\xc1V\xed\xa3\x08gX\xb2\xe3\x16\xc2y\xf5/\xb1\x1f>\xa1\xa0DO\xc6gy\xf2l\x1e\xe89\xaeU\xf7\x9d\x03\xe5\xcd*{'
(53844623749876439509532172750379183740225057481025870998212640851346598787721, 15997635878191801541643082619079049731736272496140550575431063625353775764393, 8139290345909123114252159496175044671899453388367371373602143061626515782577, 51711312485200750691269670849294877329277547032926376477569648356272564451730, 56779019321370476268059887897332998945445828655471373308510004694849181121902, 11921919583304047088765439181178800943487721824857435095500693388968302784145, 41777099661730437699539865937556780791076847595852026437683411014342825707752, 68066063799186134662272840678071052963223888567046888486717443388472263597588, 62347360130131268176184039659663746274596563636698473727487875097532115406559, 5552427086805474558842754960080936702720391900282118962928327391068474712240, 48174546926340119542515098715425118344495523250058429245324464327285482535849, 8793683612853105242264232876135147970346410658466322451040541263235700009570, 78872313670499828088921565348302137515276635926740431961166334829533274321063, 45986964918902932699857479987521822871519141147943250535680974229322816549720, 5539445840707805914548390575494054384665037598195811353312773359759245783130, 20826977782899762485848762121688687172338304931446040988601154085704702880401, 46412211529487215742337744878389285037116176985579657423264681199244501574725, 50741521861819713251561088062479658512988690918747542471827101566427731303416, 2657362476409491643067267745198536051013594201408763262228104521443406410606, 44328850588851214219220815931558890597249087261312360172796979417041192180750, 17240480010040498121198897919561403023278264974274103780966819232080038065027, 76464770903606818697905572779761942703446600798395362596698226797476804541350, 68085613496380272855135907856973365357126900379731050931749074863934645465000, 9526872466819179025323613184178423510032119770349155497772862700507205270355, 28561337010953007345414455535991538568670238712225998300322929406204673707677, 39182834208152122329027105134597748924433413223238510660062164011424607149326, 19600894094417831727934201861135428039216930531542618497625138063955073257655, 33328666355366104030800248593757531247937582259417117239494927842284231531315, 27309478993506749161736165865367616487993717640890015043768259212155864131357, 32466044572968154084881296026899630667525833604042642990295342316076396001186, 49980145403553319854613749104421978583845098879328180142454823188167202440531, 38902032967058543060885229430655776526806612465844770409338358289020456837934, 78745490507168848644435092323691842070096557975478968062804777954092505226481, 29262215059225133132435433010691828148944958395141222387754208495595513295896, 6511387460586172200641169204557875679554320457409786241141816573577911255491, 66384481485687195909117407019475796131750762463683904604078327730810293442381, 423759905526048383541413041558602466949757468395447771021215945027193456079, 22783408973585275782090957855992582495700723663661365548067357177569979041893, 68353193576625297253561095680880135893826094396013897100461325445097220567952, 43167069172003777333498030236780725018297276760410131777676641770086016833895, 64358541048274393300028483577573557871346089755363306971761786692679519831483, 21556895066359380729591004278007242407987861350911480029337345312081293559522, 44577165826706395273335181181407938788716768576602201516787959082367484270939, 78757778436852423927977028333940102206341452120720821559562765928972163293676, 44086875063535769349025637423479101247594814134304419072849625465484225865969, 14807706619359620049095657244485266549982349493285112282927264862821502986777, 43450687889967222089875050731849984583914520350091026482076939962301357700844, 1474778474197964170746922000689413626959960404877093741742022788928758658052, 79005121352540562329295808987757987563818908122338120731119811866179839023066, 47361429831079185336051370209844150786334814579472466274050224935364333043476, 8909641306798261411104006708035991379862284048887418817598377473145077145642, 44993528669446910461207972446344484798499156885515181685694150462051560323869, 60204243272925546012169935228277233636280408169577344559847112958669050860101, 66809206609934431859673802937592425152676610053648406215573441926481740948749, 48623757302381792245138496825183044619235050623516633984941208604059757210728, 74934019261870654132458355068539987475536823529848461398042458398130801089348, 81278897734052917585963333108338812132716202790194259021265555401046891572210, 41418370274745377550600009352057265922713132669834032188979684042175922204024, 73981010754794931896065529724613353453372905938901875720094092383581574259191, 11510558496830929812186594415924901190526760075439658941646537744390447056913, 12871197940932509721689273944282764851472299179520294551038550766143300003239, 13125880938267970248643653453332470640527994428672724309079849030361661332656, 54395419708886945822916038876690794705789028459055268227222784885329659953982, 61086065362549289820758257234061183781820530343096737751500151263095654158833, 82468574289042215923908109910435173164917593677419944115441863191433795206895, 74824772928304750096519403623184368585460834399443013973554958461695733158569, 62083272769549467370505302454770858941632031970595402929903886003242570089639, 32887658447648473554892464271221330218759930615421257444587260809741011575629, 61429802749826163386356730793012182546392982886506956044525858721859869425131, 5026334434650853992374810127604777276035123569907012144091150436739161826287, 45670628392162402176230172863069957038704667046592086395237022845943911838596, 75520245720261510582172547313413372786802547571090110489287163846652239401646, 58965653594414801363386215405590061806834352303047020261264473838037335631061, 58420763657138617301836404602193276258504426799372302098717637069900583548539, 59706321905964570794806865247363209194143775670139452625484601579677510881069, 58198559234141523043769073193017418608700536234755760366044515212056701655389, 63604949023865770163110419193113341020042474142600282131130750460724114084001, 83394429495100363085521124642271430199140318544724150468993097819105267094727, 69274794456073656789648159458959148992942789823222968847070524400609637893875, 46951397339712109206750633799342393646147684284310708226074432825222250739146)
83509079445737370227053838831594083102898723557726396235563637483818348136543
"""

鸡块师傅说是hssp问题,又是格问题,碰到格基本都是不会,直接在独奏文章里拿到脚本

Bs0i=0nAsixsiBs_0\equiv \sum_{i=0}^nAs_i*xs_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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
def ortholattice(h, M):
"""
生成一个在模M下与h正交的格L0,满足`L0*h%M==0`

参数:
h - 一个向量(vector)
M - 模数

返回值:
一个在ZZ域内的,在模M下与h正交的矩阵
"""
m = len(h)
L0 = identity_matrix(Zmod(M), m)
L0[1:, 0] = -h[1:] * inverse_mod(h[0], M)
L0 = L0.change_ring(ZZ)
L0[0, 0] = M

return L0

def kernelLLL(L_perp):
"""
求解$(L^\perp)^\perp$以找到$L$,同时使用LLL化简格
"""
n = L_perp.nrows()
m = L_perp.ncols()
if m < 2 * n:
# 不满足NS正交格攻击的条件
# 需要注意的是在multivariate攻击中条件有变
return L_perp.right_kernel_matrix()
# 乘以K是为了满足LLL算法的条件
K = 2 ** (m // 2) * L_perp.height()
L_l = block_matrix(2, 1, [K * L_perp, identity_matrix(ZZ, m)])
L = L_l.T.LLL().T

assert L[:n, :m-n] == 0, "理论上会压缩这部分向量"
Ke = L[n:, :m-n].T

return Ke

def allones(v):
"""
将合解的向量取绝对值,不合理的向量返回None

参数:
v - 解向量

返回值:
合解的向量或None
"""
if all(vi in [0, 1] for vi in v):
return v
elif all(vi in [0, -1] for vi in v):
return -v
return None

def recovery(Lx):
"""
恢复原始解向量组,顺序不一定

参数:
Lx - 通过BKZ算法恢复的基

返回值:
原始解向量组
"""
# 正确的解
Lv = [allones(v) for v in Lx if allones(v)]
for vi in Lv:
for vj in Lx:
# 如果vj-vi是解
v = allones(vj - vi)
if v and v not in Lv:
Lv.append(v)
# 如果vj+vi是解
v = allones(vj + vi)
if v and v not in Lv:
Lv.append(v)
return matrix(ZZ, Lv)

def NSAttack(n, h, p):
"""
NS攻击,`m=len(h)`

参数:
n - 向量组大小(权重维度)
h - 结果向量
p - 模数

返回值:
乱序的原始向量组
"""
h = vector(h)
m = len(h)
L0 = ortholattice(h, p)
# 格出向量u,向量u满足u*h%M==0
L1 = L0.LLL()
print('[+] LLL done.')
# 向量u组成新格Lx_perp
Lx_perp = L1[:m-n]
# 求解$(Lx^\perp)^\perp$
Lx = kernelLLL(Lx_perp)
print('[+] Lx solved.')
# 格规约Lx,化简格,便于运行BKZ算法
Lx_bar = Lx.LLL()
# 使用BKZ算法,获得更好的基
for beta in range(10, n, 10):
# 如果基都落在-1,0,1中,那么说明可以提前退出BKZ算法
if all(all(i in [-1, 0, 1] for i in vec) for vec in Lx_bar):
break
Lx_bar = Lx_bar.BKZ(block_size=beta)
print('[+] BKZ done.')

# 求解$(\bold{x}1,\cdots,\bold{x}_n)$
print('[+] recovery X.')
X = recovery(Lx_bar)

return X

调用NSAttack(n, h, p)恢复出xs

1
2
3
4
5
6
7
n = 31
m = 80
M = 83509079445737370227053838831594083102898723557726396235563637483818348136543
xs = NSAttack(n, Bs, M)
Bs = matrix(Zmod(M), Bs)
xs = matrix(Zmod(M), xs)
As = xs.solve_left(Bs)

得到的Assage里用sum函数自动取模,所以放python完成后序步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from hashlib import sha256
from Crypto.Util.number import *
from Crypto.Cipher import AES

CBC_key = b'mylove_in_summer'
As = sum([5875188077052480648232418600824969595720497866536009964666718026546377402659, 67999012738218701522977745292109516246796839155910592855105830602143310667902, 57069373872527795267207764660002470738840662888561030895771185521877196347825, 39971965328389179006201634509526724734245000895147926249125775373526091102708, 73103831846627154164474136146117846817277939030067244588920096997142184355333, 24971016647756767660198603093800996644347858001073386304943043863175784231084, 13437578070400039871447629276288782597377013054748122396902167721942284558085, 28393466379196565996737944366258699998436604896580168639374332657489975464601, 24109852473418884476019504643346847100268787657659745204234606030014282828985, 49167114207020052222521184151837367841356631663358176773402293991474159882092, 31428070075963288077422965654196305405378386092416488300386029039813403199212, 65958758207359528976256822298643817856263524606065102965597229913330035994172, 9410411882949099686377523275038221900647373498185543944914937627443580777895, 58567580672456602209669909439188074270723927891214333393676636128662696332054, 16065558341593994678278335676072994953750074623151334988183861626283964758705, 57926274006695718443248286140826994828819362097860891625687150766841503445227, 70138755870390268278868165128339271231922657556544777400641203083834855251118, 67885972767109670871569234926960013411787540132588293510655488187382461618010, 10681847555461399902210862175396453305202670534308493529688939268141672580198, 52681041949334573767794493491168964159221887007215214120559489821086961661278, 32693886981999180270054401707859285735740758568756949747151570025510492214617, 8925537770455527862314319644047361428098122679784046750260385465279524640758, 50677991534126079994158927773953299589065239762692927522732479082145177237596, 69578685261396434570248312667766841687942842366772423045805690348363579870605, 9818277845057785226128434266733702357140476441767426182691949404574739864471, 49134062274507301776274599170938642488704463744351451702654137784332525774376, 58654160939328990050906600214380469574397498119226424016406604809243380684046, 7424747337670606381224459936040537522272415300965552412233924440467013214929, 62191998503348002721549751412603698438420814449668296521249993454538200533849, 1711700737596942098141587005897001923467148527501577453789847339309231014017, 14688963368014138891742867302197417412347255697512170452902543642849457063220])
print(As)

IV = sha256(str(As).encode()).digest()[:16]
# IV = b'\x1c\x03\xd85k\xed\x05\xc2\xc6\x017(\xe7\x9e-x'
c = b'%\x97\xf77\x16.\x83\x99\x06^\xf2h!k\xfaN6\xb0\x19vd]\x04B\x9e&\xc1V\xed\xa3\x08gX\xb2\xe3\x16\xc2y\xf5/\xb1\x1f>\xa1\xa0DO\xc6gy\xf2l\x1e\xe89\xaeU\xf7\x9d\x03\xe5\xcd*{'


IV = sha256(str(As).encode()).digest()[:16]
aes = AES.new(CBC_key,AES.MODE_CBC,iv=IV)

print(aes.decrypt(c))

Signature

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import os
import hashlib
from Crypto.Util.number import *
from Crypto.PublicKey import DSA
import random
def gen_proof_key():
password = 'happy_the_year_of_loong'
getin = ''
for i in password:
if random.randint(0, 1):
getin += i.lower()
else:
getin += i.upper()
ans = hashlib.sha256(getin.encode()).hexdigest()
return getin,ans

def gen_key():
pri = random.randint(2,q - 2)
pub = pow(g,pri,p)
return pri,pub

def sign(m,pri):
k = int(hashlib.md5(os.urandom(20)).hexdigest(),16)
H = int(hashlib.sha256(m).hexdigest(),16)
r = pow(g,k,p) % q
s = pow(k,-1,q) * (H + pri * r) % q
return r,s

def verify(pub,m,signature):
r,s = signature
if r <= 0 or r >= q or s <= 0 or s >= q:
return False
w = pow(s,-1,q)
H = int(hashlib.sha256(m).hexdigest(),16)
u1 = H * w % q
u2 = r * w % q
v = (pow(g,u1,p) * pow(pub,u2,p) % p) % q
return v == r

def login():
print('Hello sir,Plz login first')
menu = '''
1.sign
2.verify
3.get my key
'''
times = 8
while True:
print(menu)
if times < 0:
print('Timeout!')
return False
choice = int(input('>'))
if choice == 1:
name = input('Username:').encode()
if b'admin' in name:
print('Get out!')
return False
r,s = sign(name,pri)
print(f'This is your signature -- > {r},{s}')
times -= 1
elif choice == 2:
print('Sure,Plz input your signature')
print(pri)
r = int(input('r:'))
s = int(input('s:'))
if verify(pub,b'admin',(r,s)) == True:
print('login success!')
return True
else:
print('you are not admin')
return False
elif choice == 3:
print(f'Oh,your key is {(p,q,g)}')
getin,ans = gen_proof_key()
print(f'Your gift --> {ans[:6]}')
your_token = input('Plz input your token\n>')
if your_token != getin:
print('Get out!')
exit(0)

key = DSA.generate(1024)
p, q, g = key.p, key.q, key.g
pri, pub = gen_key()
if login() == False:
exit(0)
print(open('/flag','r').read())

对于大小写遍历的情况,网上找个能用的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import hashlib
from itertools import permutations, product

password = 'happy_the_year_of_loong'
st = '4364b3'

def capitalize_char_permutation (string:str) -> str :
conditions = product((0,1), repeat=len(string))
for i in conditions:
result = ''
for j in range(len(i)):
if i[j]==0 :
result+= string[j].lower()
else:
result+= string[j].upper()
yield result

for i in capitalize_char_permutation(password):
if hashlib.sha256(i.encode()).hexdigest()[:6] == st:
print(i)
break

拿到后自己加密r,s回传,数据p,q,g与环境所给需要一致(ecc回传漏洞点的考察,已知明文任意加密的r,s用私钥都能解密)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from Crypto.Util.number import *
from gmpy2 import iroot
import os
import hashlib
from itertools import permutations, product
p = 105294529534467516464223423289507437836564831367195935000033932953615307259659740481883975551543684565832769599267976148551780503145722899356540910351859773805410303136194885751891356847307545013994867888872222768962474136333778468469159623102903361104727438301784848883034319694933632726324819903405141347079
q = 841826375923205112477900043847491664804222824057
g = 12828547090629188577463195108487328011640278999761266728351653657524572056646602801946556644754618772857483626904231876473422960254959550965539061289209301328695168646498279225102450352299342844707962240495274356005440896433232740468092112847883696324884692932096358224082029986210327650376215676872012982483
pri = 271687401558970967751236067402355577491834778600

def sign(m, pri):
k = int(hashlib.md5(os.urandom(20)).hexdigest(), 16)
H = int(hashlib.sha256(m).hexdigest(), 16)
r = pow(g, k, p) % q
s = pow(k, -1, q) * (H + pri * r) % q
return r, s

print(sign(b'admin', pri))