BaseCTF高校联合新生赛crypto复现


十七倍

题目描述:

1
2
只是把每个字符乘了 17 而已。
这题有四种预期解法❤

附件

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
#include <stdio.h>

int main() {
unsigned char flag[] = "BaseCTF{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}";

/**
* 由 (unsigned) char 决定,每个元素在内存中占 1 字节,即 8 位(8 个 0 或 1)
* 在内存中,“字符”保存的是其在“字母表”中是第几个字符
* 例如:
* B 即 66 在内存中存的是 01000010
* a 即 97 在内存中存的是 01100001
* s 即 115 在内存中存的是 01110011
* e 即 101 在内存中存的是 01100101
*/

int i;
for (i = 0; i < 40; i++) {
flag[i] = flag[i] * 17;
}
if (flag[0] != 98) { /* 下标是从 0 开始的 */
printf("CPU Error???\n");
return 1;
}

/**
* 66 * 17 = 1122
* 如果在内存中保存 1122,会是 00000100 01100010
* 但是 unsigned char 决定了只能存 8 位,CPU 硬件会自动取低 8 位,即 01100010
* 01100010 即 98,所以 66 * 17 = 98
*
* 注意到 8 个 0 或 1 有 256 种可能,即 0~255
* 且取低 8 位即取模(取余数)256
* 你可以验证:1122 除以 256 商为 4 余数为 98
*/

unsigned char cipher[] = {
98, 113, 163, 181, 115, 148, 166, 43, 9, 95,
165, 146, 79, 115, 146, 233, 112, 180, 48, 79,
65, 181, 113, 146, 46, 249, 78, 183, 79, 133,
180, 113, 146, 148, 163, 79, 78, 48, 231, 77
};
for (i = 0; i < 40; i++) {
if (flag[i] != cipher[i]) {
printf("flag[%d] is wrong, expect %d, got %d.\n", i, cipher[i], flag[i]);
return 1;
}
}

/**
* 如果 flag 是正确的,运算后会得到上面的数据。
* 如果是实数域运算,flag[i] * 17 = cipher[i],那么 flag[i] = cipher[i] / 17
* 模了 256 后又是怎么样呢?学一下“模运算乘法逆元”吧。
*/

return 0;
}

解法一:乘法逆元

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main() {
unsigned char flag[] = {
98, 113, 163, 181, 115, 148, 166, 43, 9, 95,
165, 146, 79, 115, 146, 233, 112, 180, 48, 79,
65, 181, 113, 146, 46, 249, 78, 183, 79, 133,
180, 113, 146, 148, 163, 79, 78, 48, 231, 77, 0
};
int i;
for (i = 0; i < 40; i++) {
flag[i] = flag[i] * 241;
}
printf("%s\n", flag);
return 0;
}

运行得到

解法二:位运算

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main() {
unsigned char flag[] = {
98, 113, 163, 181, 115, 148, 166, 43, 9, 95,
165, 146, 79, 115, 146, 233, 112, 180, 48, 79,
65, 181, 113, 146, 46, 249, 78, 183, 79, 133,
180, 113, 146, 148, 163, 79, 78, 48, 231, 77, 0
};
int i;
for (i = 0; i < 40; i++) {
unsigned char low = flag[i] & 15;
unsigned char high = (flag[i] >> 4) - low;
flag[i] = (high << 4) | low;
}
printf("%s\n", flag);
return 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
#include <stdio.h>

int main() {
unsigned char flag[] = {
98, 113, 163, 181, 115, 148, 166, 43, 9, 95,
165, 146, 79, 115, 146, 233, 112, 180, 48, 79,
65, 181, 113, 146, 46, 249, 78, 183, 79, 133,
180, 113, 146, 148, 163, 79, 78, 48, 231, 77, 0
};
int i;
for (i = 0; i < 40; i++) {
unsigned char j;
for (j = 32; j < 127; j++) {
if ((j * 17) % 256 == flag[i]) {
/* C 语言常见坑!这里写 % 256 是考虑整数提升 */
flag[i] = j;
break;
}
}
}
printf("%s\n", flag);
return 0;
}

运行得到

解法四:约束求解

exp:

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

s = z3.Solver()
flag = [z3.BitVec(f'flag_{i}', 8) for i in range(40)]

cipher = [
98, 113, 163, 181, 115, 148, 166, 43, 9, 95,
165, 146, 79, 115, 146, 233, 112, 180, 48, 79,
65, 181, 113, 146, 46, 249, 78, 183, 79, 133,
180, 113, 146, 148, 163, 79, 78, 48, 231, 77
]

for i in range(40):
s.add(32 <= flag[i], flag[i] <= 126)
s.add(flag[i] * 17 == cipher[i])

if s.check() == z3.sat:
m = s.model()
print(''.join(chr(m[f].as_long()) for f in flag))

运行得到

最后flag为

1
BaseCTF{yoUr_CrYpt0_1earNinG_5tarTs_n0w}

ez_math

题目描述:

1
可以陪我学一辈子数学吗?

附件

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
import numpy as np
from Crypto.Util.number import *

a, b, c, d = [getPrime(128) for _ in range(4)]
point1 = a * d
point2 = b * c
matrix2 = [[0, a, b], [0, c, d]]

flag = b"flag{test_flag}"
flag = bytes_to_long(flag)


def randomArray():
upper = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
low = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
for i in range(3):
for j in range(i+1, 3):
upper[i][j] = getPrime(128)
low[j][i] = getPrime(128)
result = np.array(upper) @ np.array(low)
return result

A = np.array([[flag, 0, 0]] + matrix2)
B = randomArray()
MAT = A @ B

print(point1)
print(point2)
print(MAT)

'''
85763755029292607594055805804755756282473763031524911851356658672180185707477
70470862191594893036733540494554536608294230603070251013536189798304544579643
[[73595299897883318809385485549070133693240974831930302408429664709375267345973630251242462442287906226820558620868020093702204534513147710406187365838820773200509683489479230005270823245
46106113894293637419638880781044700751458754728940339402825975283562443072980134956975133603010158365617690455079648357103963721564427583836974868790823082218575195867647267322046726830
161159443444728507357705839523372181165265338895748546250868368998015829266587881868060439602487400399254839839711192069105943123376622497847079185]
[13874395612510317401724273626815493897470313869776776437748145979913315379889260408106588331541371806148807844847909
17025249852164087827929313934411832021160463738288565876371918871371314930048841650464137478757581505369909723030523
59510107422473463833740668736202898422777415868238817665123293560097821015330]
[11314088133820151155755028207579196628679021106024798818326096960197933616112389017957501267749946871903275867785729
13883500421020573457778249958402264688539607625195400103961001780695107955462968883861677871644577542226749179056659
48528427402189936709203219516777784993195743269405968907408051071264464132448]]
'''

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
44
45
46
47
48
49
50
import numpy as np
from math import gcd
from Crypto.Util.number import long_to_bytes

# Given data
point1 = 85763755029292607594055805804755756282473763031524911851356658672180185707477
point2 = 70470862191594893036733540494554536608294230603070251013536189798304544579643
MAT = [
[73595299897883318809385485549070133693240974831930302408429664709375267345973630251242462442287906226820558620868020093702204534513147710406187365838820773200509683489479230005270823245,
46106113894293637419638880781044700751458754728940339402825975283562443072980134956975133603010158365617690455079648357103963721564427583836974868790823082218575195867647267322046726830,
161159443444728507357705839523372181165265338895748546250868368998015829266587881868060439602487400399254839839711192069105943123376622497847079185],
[13874395612510317401724273626815493897470313869776776437748145979913315379889260408106588331541371806148807844847909,
17025249852164087827929313934411832021160463738288565876371918871371314930048841650464137478757581505369909723030523,
59510107422473463833740668736202898422777415868238817665123293560097821015330],
[11314088133820151155755028207579196628679021106024798818326096960197933616112389017957501267749946871903275867785729,
13883500421020573457778249958402264688539607625195400103961001780695107955462968883861677871644577542226749179056659,
48528427402189936709203219516777784993195743269405968907408051071264464132448]
]

# Extract columns for the homogeneous system
col1 = [MAT[0][1], MAT[1][1], MAT[2][1]]
col2 = [MAT[0][2], MAT[1][2], MAT[2][2]]

# Solve the homogeneous system: v0 * x1 + v1 * y1 + v2 * z1 = 0 and v0 * x2 + v1 * y2 + v2 * z2 = 0
# We have two equations and three variables, so we find a non-trivial solution.
# The system is:
# v0 * col1[0] + v1 * col1[1] + v2 * col1[2] = 0
# v0 * col2[0] + v1 * col2[1] + v2 * col2[2] = 0
# We can set v0 = 1 and solve for v1 and v2 using one equation, then verify with the other.

# Using the first equation: col1[0] + v1 * col1[1] + v2 * col1[2] = 0
# Using the second equation: col2[0] + v1 * col2[1] + v2 * col2[2] = 0
# But we need a common solution. We can use the cross product of the two vectors.

A = np.array([col1, col2])
# The solution is the cross product of the two rows of A
v = np.cross(A[0], A[1])
v0, v1, v2 = v

# If v0 is zero, we need to adjust, but in this case it should be non-zero.
# Compute w0 = v0 * MAT[0][0] + v1 * MAT[1][0] + v2 * MAT[2][0]
w0 = v0 * MAT[0][0] + v1 * MAT[1][0] + v2 * MAT[2][0]

# Now, w0 should be a multiple of the flag. Also, the first element of the first row of MAT, MAT[0][0], is also a multiple of the flag.
# Therefore, the flag is the GCD of w0 and MAT[0][0], but note that w0 might be negative.
flag_candidate = gcd(abs(w0), abs(MAT[0][0]))

# Convert to bytes
flag = long_to_bytes(flag_candidate)
print(flag)

运行得到

最后flag为

1
BaseCTF{7E9328AF-784C-8AF5-AC10-D6A8FC0977A8}

mid_math

题目描述:

1
2
3
本题与 ez_math 同解,不过稍微严格了一些,用于标准解的补偿分。

矩阵乘法是一种变换

附件

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
import numpy as np
from Crypto.Util.number import *

a, b, c, d = [getPrime(128) for _ in range(4)]
point1 = a * d
point2 = b * c
matrix2 = [[0, a, b], [0, c, d]]

flag = b"flag{test_flag}"
flag = bytes_to_long(flag)

def randomArray():
upper = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
low = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
for i in range(3):
for j in range(i+1, 3):
upper[i][j] = getPrime(128)
low[j][i] = getPrime(128)
result = np.array(upper) @ np.array(low)
return result

A = np.array([[flag, 0, 0]] + matrix2)
B = randomArray()
C = randomArray()
MAT = C @ A @ B


print(point1)
print(point2)
print(MAT)

'''
65540596822333029826884315503808996273733737079814345540607878287618419734231
45151244176940366132774311848077675849486332018843894072137609985463616792271
[[9259505595451159514948336330303511539525155092949382077995385373332083424570340733825203563332256599256361679775371565817159463557158551820090084800254999338417057682355404780422980119717238594927467956675771042145306399815569005775907169857728757334979422594358
3700462282298785820527479428312072678870010244861115107206951164684911761755437333209293039456840068340334559453608012512177623936248784897843503284633804083281388001236742261832974291349480314135560368365574114042082002559069958228523318326290833422846224288247
20791012146351643571145217310876690226642338279942557085580439219377325884045305279931904540467264182713135410067252835618936836675270813727053937054168296298149405902638242278868020381541490973458957704137657413376043351193]
[3802535350808074374431476757195874789213113083310705049856269457737583463559458126494122484246497049005001474007088865512110432486291568737501434666990689483191924384489484665070592656641925905986397402822195880143437724155134584374613878027218950975919679551229
1519642544380087919293814751485424198320747098741960781639133554268321708273309194651985562222274023623071346914239982055028526526058064787882720065775210796950963778381575914964024929110539407721461321785325399699126116201001806816030960662346173275101476487421
8538097185709421082644083672229287227818939415260987123718318427750267353075860559170390896769087600458156859498331152566368881938040799840806164389020986990994328370205184734637870147251004626759120887684269603636183629300]
[17987668490992083132878642797176089621188858356259455169173987325310681186627844776077058221612169421636403546746899152917309634315569997105261046388995579843528014810244648968375990949478033964619008761814039733347955609163
7188579142941521685422767412932555782658469950638690886255638896617687421517941457682493542615460990114218059246938237257830976937359020731335958068934235967457123039874441635435388736524907036941379695243043923900290273902
40388963560266769813551191613694768219344365780650048155838802242681775019274045964917142477325170274191702615504062392461666558731638338001971723737440974198823443420018559746335727687]]
'''

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
import numpy as np
from Crypto.Util.number import long_to_bytes

# Given data
point1 = 65540596822333029826884315503808996273733737079814345540607878287618419734231
point2 = 45151244176940366132774311848077675849486332018843894072137609985463616792271
MAT = [
[9259505595451159514948336330303511539525155092949382077995385373332083424570340733825203563332256599256361679775371565817159463557158551820090084800254999338417057682355404780422980119717238594927467956675771042145306399815569005775907169857728757334979422594358,
3700462282298785820527479428312072678870010244861115107206951164684911761755437333209293039456840068340334559453608012512177623936248784897843503284633804083281388001236742261832974291349480314135560368365574114042082002559069958228523318326290833422846224288247,
20791012146351643571145217310876690226642338279942557085580439219377325884045305279931904540467264182713135410067252835618936836675270813727053937054168296298149405902638242278868020381541490973458957704137657413376043351193],
[3802535350808074374431476757195874789213113083310705049856269457737583463559458126494122484246497049005001474007088865512110432486291568737501434666990689483191924384489484665070592656641925905986397402822195880143437724155134584374613878027218950975919679551229,
1519642544380087919293814751485424198320747098741960781639133554268321708273309194651985562222274023623071346914239982055028526526058064787882720065775210796950963778381575914964024929110539407721461321785325399699126116201001806816030960662346173275101476487421,
8538097185709421082644083672229287227818939415260987123718318427750267353075860559170390896769087600458156859498331152566368881938040799840806164389020986990994328370205184734637870147251004626759120887684269603636183629300],
[17987668490992083132878642797176089621188858356259455169173987325310681186627844776077058221612169421636403546746899152917309634315569997105261046388995579843528014810244648968375990949478033964619008761814039733347955609163,
7188579142941521685422767412932555782658469950638690886255638896617687421517941457682493542615460990114218059246938237257830976937359020731335958068934235967457123039874441635435388736524907036941379695243043923900290273902,
40388963560266769813551191613694768219344365780650048155838802242681775019274045964917142477325170274191702615504062392461666558731638338001971723737440974198823443420018559746335727687]
]

# Convert MAT to a NumPy array for determinant calculation
matrix_np = np.array(MAT, dtype=object)

# Calculate the determinant of the 3x3 matrix
def det_3x3(matrix):
a, b, c = matrix[0]
d, e, f = matrix[1]
g, h, i = matrix[2]
return a*(e*i - f*h) - b*(d*i - f*g) + c*(d*h - e*g)

determinant = det_3x3(matrix_np)

# Compute the difference between point1 and point2
base = point1 - point2

# Calculate the flag
flag_value = abs(determinant) // base

# Convert the flag to bytes
flag = long_to_bytes(flag_value)
print(flag)

运行得到

最后flag为

1
BaseCTF{E439646E-1768-18B3-DC4B-483C40C5340C}

babypack

附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from Crypto.Util.number import *
import random
flag=b'BaseCTF{}'
m=bytes_to_long(flag)
bin_m=bin(m)[2:]
length=len(bin_m)

a=[1]
sum=1
for i in range(length-1):
temp=random.randint(2*sum+1,4*sum)
sum=sum+temp
a.append(temp)

a=a[::-1]
c=0
for i in range(length):
if bin_m[i]=='1':
c=c+a[i]
print("a=",a)
print("c=",c)

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
a = [2487264674516612702148381262059366937897201508455413114345031288894980789076145147579418259432661232747375904997965581530362268904008339124626472045717075482791021095030019783589425299870946373246221582957232862473515, 491733695728183987781854883946776199363545034763223630648303216239781071808983441788738994635864262288104702316190256147614095355462666760091586746521889127102395089946736744234701020777747486645716679961505355358205, 110323038758283816811655397189354730775114318542406507944678995133064353922234139010858233544980338693080719766808774615216332973443076471838385315798081800456260331047745824029902641504699030254172864776140503685719, 21329601123439484788549839891633989762344638209267595412456647269024794605613697213699096256470155035750114059504925376661660484839061252258268241386676023785213539005867805566800471943519247336183762390966700950019, 7146972597944713271040951137457604863561388249875746261956055482229418349264570561740906104126974792505856583850338097727129246644471065603435449813884941071413766137227119139128098345457922432088128969598942863267, 1346101131622672931978096423414991055086097907048045187836881598919564312718270178534519827267497280433625574785132174894812908583233359458000469975702103413693480199742325839719191134247009906270778775450756715188, 431832097768527518676165198802192386603746291434967601504548859319580699889723090943427634867984592194172569910901514799190511020246917662162535632202054961537707269684557393598823535364874075052250490284484829188, 140385263282271996264759155211641776877746297983736897311922733831813190094504225023609340831846735540994403916688230922925129855025970272950216444321463493579227283703118512150491635819942098587286980862817753505, 34223371325515207445588748757581712557393912157235932688701226001484995652561037930828670928779595410194265999875772181711329727812185265441887453894003309876654082495957062628413923487565276953961953102939899664, 11277905223110088306111589808536546872836546320235997789453098291242971723694602770076671423955063276020078678714571127064308764611705435202479293805661470178917099557275252963592432838615626750886647727435412727, 2615533435460831263145388899927800470846179005257762751742107113431800042995970550154282940437470113325491219189765587324789634252029440596113709555932091761129000675863727140738692649309833681187804499985953136, 936680841170458882946412959909966575946011948314629933325082014426837165501136249855420901858482634295013806361789689361684904674438042695516337484436348646919308417999556756779144910987756875858573687134864914, 240803995584844951172124454225548986410808735949094019867567366838810221297826531921690948148961695516283629928962961745839887826049348862278548294987215333063020792491250359616172365439958324315638641990190536, 74980313650452416147684959971591530004150916322659108850519926847892455755211157414650129501071119906261853154503022754482691495645170933619292755026582075009055897885581671027043347130782615603358690889357969, 17373734350550516610959609643239951947839958095899981508834140825450716407631617618229082722622331706459216379319570540046133821392793975119423828799726656124807834541043219269949459907314628636546219059231483, 4383939698435145446949414991318424065438281430941348230548310095735465803169460840233678696507780083107318568406471009158126616954496458697727524252433591785759305622568557705826283690985480130620325779855269, 1070435075033499499988967771003353861621342562651011567215908784740129578236135452228720299864117045007232989018924013752836270314752592099997410344317383430641687448457000377071747633795773722163076615405153, 354613024399513291150023928129989293929227226203084151945112636505041432337820329935805740802403361855625313123094613318180050195219366366832494130593248906011113600242755768635094775633827342114020854687801, 82597124584081826710375601757684765457467298282386480837692933784824657535317108286212691529276214884031365269733862817274058538453459456296256548913748615606422415053313052283494323168620576805637766138197, 26135834190257866104316629323550052649627679758726229473294221139854796563641126471998920211481501156701889782668173105315082084500683017294728437322818254222939692828669475566191154442279318530752996234399, 5321914533271631715766698346734309258597941523919808971175049357994196078126479079595401724485236733828962687678778457409546781470810737250537642200901652790857563365204935103019528537962033407161035692676, 1401112116815344363602973427355047116358185953451255358550792547953394603648490800732761959337994181037602301212276448178218413428984435465643957862122433848889149559184391769249005008972240636924677483332, 340703164964920022751406615239919113589733348338271455697386514814772581315065581482054968704086006813510346859307625729162886049905513425065578320526943584411252201523709613325050800852296078315276309498, 87840565476176074750781589683807196881040923233689789764972859007886298300522765664170224177346224637510402223797751637511990096677274023769380478419759017880813713095034065541851821136431753956971681001, 19670793194720557916718563116693476958260133378839723765611437953301903581689095646338017322208705125479649557618768892326788688569445543579968049624743997901012938768052637463357937838813048475700143702, 4813717864536159278344281889539442680460787707429632446095662166356039450500759565004728794684170823084248242129657936118206321365817871353015182900801593481805141407218121604733002829781487535789180828, 1042206069053701098495071546906704343612504895408542932593774355364200288153617940373728364353536406373351075906293793845088075847011440543341941529120830192687505151588415115374221938124244686599669458, 194044946903756616103043562433809500007183272927392950867023951726626302681204141127037211903589021504233703959475286805099197368181117710043885464503673129287184477006142067195426098588591382748102539, 57242060503628134854797583503415516863794342630010325140908044397602380211468806869876771678223543893631961137313994861319272460663638480876700367769402916003571424012128837346480997355093988632012775, 10220201967005002779370447788097151915347020902180766203690278038856770790331091587750957262611786369059831723020056245241984653662463224025520044810966000669665537134571188694822388194379280786606327, 3267926212173074655716273983885176036956276231571067023300127600981173234474770474267538130720791055154389260987137327011230845199160118826368874310750622421181065045300794979970673152630315803973451, 664310922264744733608679352162235206229153782441085066286192469594499932348386155418089005696350197905438895173077254739918594652439993237866669330317791070351667267902119216464673735535997917820053, 157621450510303034999027157498529810254434467859123877137482107910574969124384732028159729373548578204828393076100787322321913754468400698891584836797607004658385107761645961934718993971913922689493, 39332477720879659647769207180648194166511069149312182714850691343807294060027257884701895063257342090729165323939249852666973310856943035346466688523098612569329263778095249692454805322913109933451, 8981431226314577645818078061310516067058739244501260778838272265495867618491462415652789974290152305589437388668252286740099675804549931870318361834902625342381411139234786285243806607019356580655, 2112396066721715241251602227199629841249291526749264633946336472170358658345723532373776051582626845585398413757777914886165302637471620129930025840435283626998895529130832700898103592084193587990, 469796330799746978963007177579525242476491475859713462679382870110198758612531699613499280185379426640464846165230615898408348461001941619050157303936273348173453633557613625134687931175489772308, 115039894603762374765072518903656214032673578314477265152318302986985809844170481821167559173999270345678822988509361838537021290790266729339932399789571955857561187896624119148469524606927195502, 29664847413037439140755929162295500789926130685594096951097063583886105875553862215342779333568726148068998390489061260679772397420854474310952173916283562144502155749545173676547095974974938801, 6556839835049647931901086051581445260744766665407776927047263448383041272915616955807464961262297820118065353994454969038345182131864552405100904248845811998006038518360062998811216993218123317, 1777902487663062541759851155686901732751487652837314110752529657038468352750515100993079307083868172100714925159868062197729467104948375724637901426300367514987134187716080043905739938236648704, 496319028827230065370808145407239788641593404351668605447266421139929451476993248197319730317200648698252327668625409509842367526798038085336803728242097138638139634601057690936621540950362878, 91859873982601930765698107766946424315968932113724973875252752520495744658349166435087906664763198237819106317321871232725285852613201351155535304791295392982339051653723048621713854087558299, 27416797198170440695880404003135961426335900780086489077063102228234854286849577430053665684665123525576025865136178905344946412182398068100227278108238228179476948006111402146551358956042173, 6618792570596090569883178232621713030844697317972184177900266954498675602890666553071207714570183352868264445779550306428622314821163774496224109073830696331713973117656394498431868066547419, 2170402078990376080093979069174241330730093169079857263825716044536454255816623476318486713531051261924372354329543376436907081387161693951811518904258013624768207438418761774847657241464116, 444068419739995022918617734805868711289130441640491361059833564963918508148289061718666452354434057970227476744547047349557417149242164606932560068546338531971271707670031796603537502372902, 116657711114961473575551110004924695540253659208616449841332120251303948007722209463493630964437083428655981974738051994193994806043789586554127478932520376572981058192629163539170482099439, 26060438230704097273528583087224964538829526126764669880723211182150736154082956489319587015488424248074673973497150602509972124276820315641896501503925719577821672512750083923483639733416, 6312791407424911633066282842976932623335914208291314848182683302453777089215292160945721990083867179076948154652506406356338815828714441906485780965753668277560566183244931348859397184996, 1692738421964980687206278894671327723911704272751755954222196367628340111939187266884312772028554097537058570911615150944663230388612366056826914851034642492298594744849153229556190046330, 467525048501123667461709936020772038812998605707446973687794928398759672463134111033796530786478727006399722869173671763892936977996495279695995929887621412909042553923445043307978487073, 100524774903368088338735495212617525628101069016243368191042349062731422745652851141040067275932170134907320208205726289799197848585810532178559348960204294517902672414604810447030596048, 27814678376250636475963101212563090069738325215292874239553841311037561288624279025540601779796471707609056593491462913915467359662214011975515860736192625178250236017806638891058352841, 6146583639189016851959336110111529802617165794295583668085087256400497268514196451801697302172354876150306785802188833007655768181472221094475392274540015787948511952367768046413009035, 1972647620592074216061102097901025152958921034850117568363055778941629490654706191168761681590445732321415108675787531563680577749629570660705072798303247953275401784690900022657739322, 371444236734952267365204917912482218024760669256564601735746557802172061599306636753624221981211002583971063750448869544186339158302695225083644994003958727288476784454648096424712122, 122254251587569792335530528509722911970032904171801982862469794399827245263786995733489731913997837358853070479769024383526380208988565918719151600653752397319872277146128837497328015, 37286085540618400296289156352820709922577362907484951458689730829327977274283958429361031670068907334172105855310654077662912181145565822690393824208950538512990718744603086462751297, 8960386121829638279311227577342777825734976587843199435094340053720338004424184197136819101116475086084110882985205105967675766957208204488229410580925549838579346975088433058825112, 2276020215301107373585539745757682715066838555468744061772014192384015274014672056309929648681686089838637957127768944113418121587630588726390948566064269910008396907056486696440621, 607349939368134408551415861865227396073824635286316486245465114777775395388058059102705505424561001490318248134384090100571125911216424062773005875309952406284203774537367839133285, 119036276576206703263155095063111697848826207711313825926870015597766389307963670003146886377762517538032971265642879985310317695973899218804472784113163457901422724084711780785647, 42030777748108550530459203444475857940945563824576240738615672332753050069206966495014628929275783847295884969372071131041457167837216841146848083118096773135990284469263324779443, 7801996642301319152692691810553695688255137357013588495692283033031549008190374987427339686278893185224986120367594016951691992507271905708595080902010159659368839867860433342236, 2208574074019210752518459502962754515153645798717698412888529548015314931730564928870825878207969197632997431492713572137381185806543942907257429896476484304820878553303138599159, 768875672280773738301803816415515519067859985949784777815605972358140605222957399855931295900483405997209014872309627261455336173608212560504792804732406159988744626008190591642, 213430837881757766520777720690227709564760977311522001626864091515991137423909703305978776728094360822736833235760061066314816749758660033547207607953805341923438394772222356568, 82360211831711259567147082155555818156999516949891879514305397375226376936714506922756403002876731807095740268483307937613566131364594612432398098476300712735589147781570183292, 17749505352232170648277795567698933594199437689182764405380407013992895289676270195878470798816715217377777574478356564936400974585960088437473753598924064324383361905659789789, 3427214394932046144638723931330597473316067571098072662894954825121393877991928319931449114219100671521983554547487355301825989691873309784465316768877146988849237541879345997, 1033902507229521469775736346351634090020261583833297661608844489398831364552754846127512235344097362890795464047384509362185144853214501000183283440093026203459311568816825264, 224896235915885231383021605802223120291823571580780275950317681857821908865357784480256946962966353978144999197255874549242776446126658379098611152585008158970159741029928166, 46029158819241197707530664166476597494824578315547299718547883731820892091315435238631987346971891025923179798692039448953613556744177038196467650472219486883115951311114343, 11947866502696456680811378187645438096064991719463034800178755900009558951200835612294081250719346343143340755576335021624771970543003065673188450976052831967872919086392740, 2920182352645954475250456149302161189384947754266138653194940049989939156554780361528842542799077656577372777863627070726368904843252451856963117841700429655465449705784298, 641622426678020294248348183140299041659157650855760105808225416711044677800278294044700367798760043786235745613510792462327964867426046011657009528106413572140156175050547, 139954746021857963632941471710740997948822448809029403690252968784849647633362222415971470082427919553489814062772632095710992183657541577740542585479640231081279442703729, 26951287563812328009402867445459718346022404035671471571180747182520664735617063468580188663385794364598479725800534646437082877207222254951262061856164914161401031069085, 7533585444288704788707326472044821719148563540561950589462107215132713320228676563974287003223326227564110259498308322080055316439031345783355395296729881160340610419798, 2276681583409260736395242645263289467585348662731848036224090877214770286189504748163492790260653720049576572250410962278647838121717162502347694787530301107754917965930, 474556448905745036966775435479094252142291985759634322576584740921367165655972599891226896859675668151114091970232772247346351748955558953513984653925641106869750480713, 127434337967780172994097939061090682233760718060985516805855544997040535343689397647620215878303719159525314116562161004671399396862283153119456440081266677387394513825, 26958440398830097157570752848820597974607321452122682350667898050790790872944229259301257843111978215025542048968699222294492807645241856446964337776714971381969501071, 5543555284065922229007474385783130130141655633965977061928013317537397727717406514000700955159647395591026117082092382033235800387850239860460046217510413778741145568, 1234762639172810584930296374422356813288496696923257612102992994614585199225028932857122231293467541131628736229833789522239025569090130126077017761481761935075168095, 355466248406445302867530536283270751070714127588124044114582631609659246249339560304163152323418724390561360227173698743244037301264764126798143323643968965204937509, 72700233281268425015457883799224003903351225804106120865021630177680188790291132871915896124460090399131402188231983457135950533458784941828330878270977967060216148, 17316325779212303492370685449752299828026183539683998725619992507954441121758510621171086796417805607101134043617316264832615245565516418608812080799316990851625705, 4045793926070659592750134404331599438619282956075192844401269281007613550701517318190039173492631001707043977026685514125253560526115949503328595814800145874763660, 711093850172488751248536015688936346283846062295071944527029992467516277719725837096755918337587878576030222851749327532666344838291776707230618144013255672878802, 265627118033654696712457079751401631255125309014812639375295118794146799198801006240800873274048170518660448221821727034749291649708953722421725907035286053353872, 56397799026942637682063511042055387061218525595156363606895648399263418939712512484112089481484737116602512227228360835774657959685026627558074305176995845647003, 14485314789957973511455116454157965523985421493897618644045918045972073878396047755360530791556364199120111093825046698573687446383611922050184839529827282440392, 3550955573839595298078922255066479093374448121222507459840552079059417076208499387361330875700156148993662311858100125881757983588374422578671684157194578005699, 845394743568277367630651838202283372116209637644259875312243046465466486130071115873693547193074995290146894807692302774606698607144257685615262061054213977420, 157730148886711208861332893525227881346167845596707482474187376786153504516831765170538422967044056418676212271368775137847308449974344069982254963969728576186, 54972881967813310263623651713923315210166704822071760933248319000133464676004646169143078394020203091841106960137380702725337793156762085219469872257140065395, 10729618624425932454603285350456338562675184367958955898413107388221142096410983819404349570576694967179369846493834859543515755779034404675292796271503098978, 2442709998183758153870663320358670148543830566673551209180788899834647749860789589565309923762896818608005296106561164431377898506019097822580641263331814899, 651590036376284619471743663785818577107718418313829721360265583261583596100827943422638184205536113868285291626431841044058974804223249221103868269005376657, 114607798091152645971169174208076386390725220406372401915445980825934238917993417913942451617626679858301802459311641056076814238046173194524157303256038150, 39902529162554510030314089494503111747276505091248405060746015077422014506338256115473236342993594864048856417342484086620483648018566663638691082167406896, 7696036409658331229292571646244718273466046087174912598857625566056708582171413470987556822776798859431848832604237853020082821687940873973792941059899704, 2124793715529138812294972358553948624813291392446651644830711957681124971135340690294893448419315140942986852615187098678211216431027229098600530178187333, 658384832743376570742078380839633081933064245096557997421967190397377225701314189557712470669358349072689322858650074777626830988174808516744296032918846, 207441722934708037755237631720378642887937120813748348023809687455047615244353892880515039372882445336126456679753369371480841621878413386189854105557570, 46120989258570141716198175239164426659655378133453203231982537688000264558364343582463401621127725393877459942514087061448921695021828660135004811441077, 8188249463851855339650372248928765967441086033339032675901168172673586603869217763697984051550480433177801759541580074823902608731330486865652085135044, 2937142904794524692633847174299189664745670816742834573158221153146769098153095208026269794290966633578370921776670433893125934429015973900770183068397, 733124926365921400367689082582974550222406734787055535605162687013854196685186803977001257147200683812867023143593280536908792623212121135546302252718, 163278402453599131564496240174531690514528227885644439879148727669198836851619817419582703102053351987308732391369947772790306377652049104175405389057, 30247650270830046327693354982611104496891052070130966758534212809812843335592964533296290766840765263207385481421035739473846342013342141171267959427, 10078130422940933339521748812234495734268808180137214319132992860890442263439248960992021699437860319479050323778157839338656439168670198619111143719, 2468880502161574512996214909253394046701372930781084997897282377444297398943413058653731620475409298189864459900922031063170285510529204509174601472, 607074026100427506196023135076433955199278835550407310798426497629249872001552107547116229667872950481628543662982580322754725261269013849906534673, 132740473918237042219883376937810235079740145884708583638955667277623190279830437900121550989480157388767941856419463040395910600481643868918183256, 31718510456640085593521631697634193356173604238387825664787000835659167411973149050707246808351118400835035866343214347384616969135648635282147931, 7013023279079169100512494613396045516189395791014739872279083083144940194186933569894993097804928064121695159201540587912810973411497923430308118, 1771185586112090213616219590319917086599723206748079096836927259082387415598439340193771966567407719988569555116938671184047274203791682665544114, 397374970256811388188624914624139083024782079917643579178513419907217677561151325006437923068157587425558261984085274694860016959461272906962347, 79357052331733760410996870451429462826990142415371259214931967883012213322689987714484368914655142353136743730816759493623445282698964105194007, 18024995037150399824560351471574943556440673595591374226442857720036395804619368162299007566488606118476181051500800792556435843369345814420200, 3672082813534614033824027501205682677746304198256311647201407880518658491065244877413146229442328563967205873649123895823789401080903874966058, 884390448367024106697977520994089114652140177186827650340642302821550463666402143376715117683073225822100147575051185094558637911933790548300, 188239732756327819809744123998273956373038631188535307108080455432157193929576323356894115167616675699250266852372722398883063108283627629142, 33288603989729116913271536956952173835445978966530730095436444955036538722332958231617041802341417062090911709863572792283326143337721274355, 11485733967829072841907653505652765367596185911550254707130569392647462332893031105105058197515848740962693154105512628726167266984356020289, 2403399291804759683718697201628718853672014990022411946032431974098338948608647899389041474778909482165700212670301626696886803147288043249, 511319889754958068650171413169799880502913743237143323338990019288960892229714861654882544537650773480294037968794797914167989453965720824, 108151236227275669723663372909233127249406930188286111418173641508503812685900937356143956513296377001193855340520507635261983173020133040, 29238304319413057053313068686030250753447165587962843793828466785518433534702764546822180884428461976687744929459281379124786742084937021, 8710806082582848713173281808121766793059207164795295196447513451552342446919958461280536897422363560410120915054864290671091109422830007, 2960745852030782790607427333914261375033099283529370879973360161495226124203100530063141357601421786632355173585713266548540973431376582, 604226789553326438591187728019722484152820159976600984629527520901554123057786334839341626845330699593003318860611284025243121271706983, 182601602703012851376129630760230344746014108213070190831158648995503303041568836468914587260292443510296580408749988987988496769980026, 45452114165544367630569931330797239179068892066478030202246828842399491816831847850747717090783448434947452983100492335497009639567888, 17121905765418035275547423058447462707899580001255272989656046701474401090015657327101125412277786884745764423250530487272209339058447, 3774603297652275052121496733944137560240160153708941233671122697937317529256966828765637412706299259386179629160090242954994907929332, 1060720547441758622170146447289706124200025617853186951481807263542360257370083864882158715152433273118314629121456220166038646613297, 221968014150998259820244482577203245639303312867709655818056071267607816968641371724863025295597993367786164837699315327363092768373, 48882714266352303994499906166362680249387918980441207673706748487810074857456907593421757139320785593117603391693650930762966455968, 16202448926627445820838961561455164462246910065772244580677765363543397691542726082412061203163218760307389834156275979660359394394, 2956163682419868606126264117158250029934298756926288053091609992334385653684466888852763393290616941805759810929196668548734379973, 947743414350088412833104395509485078494688169216314527117041568424743421788079617145817207736081707175649820823460623353469499129, 184945524926843220565904193572688427321550948207655453104873607656563645624884025013598624332554709507217938881998831490973926770, 56091241819606834802888641120709675472905317085277369060569812131174812302014447128355020686805930142925377568700991226583887786, 11342476554725825973899273577573419030806527097049265365675861670559660391106730894000199354064208522140305551746468882526930218, 2402177443476249504669747634772796049517512708172380623039160322117732888388776939986309881254003733945369109368480598991083692, 779694676467776330674778030069618028430247798034244061629255618166403221248637754838157860401196252119142530084615889227008718, 279805151354990313327069866270353558845137298807826578854001581649814949600343606775647790956175906533124785285484676594205727, 71475104043185673882357779032282210215441549654529833915666511795774890652222328738683786126978390540777959958334867072773903, 17943539235945014339231354558742830502206047263873390682998140665294407299445224663761111928004278268665005924991145357190559, 4644026442647371851471373522652996931494883964189143247893482852205071445064380253582641516905658082237627505163407862645664, 1409644155578077661014560265925065735043498896729842671302999827395230787557009605337358883198670470099670153973385533319619, 323096734145812043063935925026236730750028036642046031570292345040624480525514361785469029998625026693350812690921739556759, 66490109788591511799221912380563668027716398810544644123382175383682357229245468554339935745239347569290928368121481198120, 12656292548243054261915436732277320096081079272327419007058490559709461117024442299280829706525636594720337557745657188367, 3391681366475824837488092758715214360838073187075047614113065989329609613896833473414068502642149439870471691863634629122, 1171517421153263625675697419132009454686117107914679030403775353063155717395912120634642665620725468223446139999071277507, 283703308943571467555327320427163735194765821724187323544643973406396459830945519805247147967066979142358739388094356677, 68051202286065965847502158995164914066216566669074127539650532219749577216638549042842244710379907101440823172129217941, 13657391854992511108591836048816405373941724899814769682716923188133130484869138365241075289816576384008939639840185236, 2883783693644859186835460708048379333567917588026714123591585397758887606304693027342351097912118721134282551369664243, 799049413981621014519709854919842048905323519892313665984919603393072653972864233067257746232644641382453549991205564, 167323486728516981799615013230008131717839880066330604897780052101994505570227406902019168715315935265773326851501787, 36720821966367632835200966450053402442515187808387796741238632349642200514749124280117021313827183586060369692397742, 9231349669963900651759770670625059190403421490616649578654575717995018536450416781815824036250202148465899261409814, 1782108859562682583955834770956766771890605266822317978330465547356702234978432274339716401371413673051273821401047, 403558799957529775306903388246707975744649346938130151765107472774892029713724284184220469230250620098654222513187, 113610170795802770344935864787382347027936273326387062416574602249889635787754346617875788451115772661826280534521, 32055073799513070460127524930885397197257512625854036561086683809899754909243064094359316603350553060664792782962, 9032924934526196049960770072668776382612241442724751839457302023155061259650364280524549081144893790536494565021, 2017862790729520323724155794794272872202696299996991444268875260039652843714149080734888358373743815054699872032, 641989462295283575733593919337192523868529607267791351139020713122159499889249625918896534847416953951571198300, 128576036185681041874919451733195397084174018792730182604376427967040903314850718633946179141568345684439398601, 40372047007036282320578970360805818319565465833073029617047122562052782556856211341854983376957243551410081742, 12690329041364261531787667832647179962305068888653710915257119208086200721695307184639464428289081103144163044, 3561839882694824398822284966776610177573484210494611237706713481725365094327241161248699081978241602830178596, 1199938132534089466501994820759235969832300222872622731608847912038243599132645129289586987692172765041057363, 324263436138121201088338125064781061780131145213294921711639118717892670326681104392825089385185080492440484, 68312903907509568411987755477707268100466381276451833349595552008166402404491773244111478626617324226539375, 17644820024620964580235818915132121042107943132825887368503777072488644953818352369186661300059264368686602, 3506176982938427175993147412444392161707218066658168782915638022559988465482121419504891010260766228901318, 1066127911891872518349397911557440606663336809214920827134975446907327509548040800613223772158827103310018, 226192414853873324160991825316404956087309825251607871786471768482769238181939189651359979648153657144702, 45868481610678874924581859998825662511897619432776149300471637861901025934649825592930301843850526560482, 13790618957198333318923230203705633437848971510707911225277092048085966476634360389032477412386316672075, 2577037700547459915849817513069936580425167358802123937052546118913600453224885074049561249688358836828, 907316011507113096967526321014989153923826069305244388586962072152306166058795915708345202709057953005, 257655812504204080571300921288974779044004152926402846615682864861219686480771224251979519937398150021, 49251062839756470728155099947305937498531111600022908848098152154867828870296984401906907127621922967, 18003086576459067165101290934987020831800807030229687007784917512221091664668503037255416369751058381, 3931602604129427365537886268681901399659904652265314628365560645602702305389347981284422957262198925, 1024271243554288667730540660664163792950639594042380266463713922650987059456833218457318808946966091, 264399551848126394660403560510401104363977298239470868728218368941030448200247464958990623172466340, 91991457278474569364064153570190123603908094841658212918408559703533962838464377716405517361239718, 22400319343956127928389329988299680966797095025488025868862978943959831082472834977311350142227326, 4054933925260064992644878588484342847457594792015796931877255389193313381697255433801823807489993, 1563931191287550417926830376062569859269361644002382824954373333292013041945346281280805769011292, 343600935590550484460351833584964172817805330710096798788745676605896512317351762955463013247649, 63176100013413022744650607325631187438860827337150751513958540819158680919377176592820951694123, 21461895060447171957232560518498142689748550789857829420960180353599240337920080298104122001920, 5835166770039346718590125171268445418773015279002775708686914119655634953623824713817863325421, 1583080965885530423876853196443645139416147803583378489670913938148126388391843537295818940207, 392027882718889629138666367076395194013822284370187648811904450742968357888850048132707951624, 84773060845038628419287336751649666625561226450930810787040749330985148718455599359011719538, 20913329354023188439880157138010537207897970146456506518137268768176475768733880753458923347, 4311750805563893138689876217833463788577851583828477282279295599052168675043703275872499679, 853899685398867377607396879875326827128843982112866203167371936104484725330862023846437598, 177330267045126383717093581983187474779454406408201086941455408963372790398670000549267776, 53143647775046286515978817675952110384368487980955438888997975610432428251415059859228454, 10991259161865360146194812310045803635018376660538575719261554366173833834812335245373835, 4056765217542521288464908532309700817396778995632736813131981648221349714370388148127516, 804624166261647601714189486709310419472244009530705820922420809512944365943834561839229, 221209387838524016717980366851546408106123634464083126244578703480033718962945353384984, 44893426704852156297812963470050296993434463573414592728231358819460836492051444088309, 15097276880249572944791099185953982641176811310343688646744220558627388586126270884093, 3177547688411513827329112344846258118128928380413096551275296685970663730887380521208, 707854681966281587817169996379236533896940250761506339446186239585936846532007717960, 123430766712269269314015844444108981877839453341743217081639119599583069918979135631, 42727196484340883716428235074652898935106385756024360939020725643288512665432787419, 9795023686113954751639542218587813833546340682044130681106706094735594753449446343, 3333589652095912448402556417544763364674016013042330262047943676041390880358346180, 947455010581251264347248926744940190279860580467728251791365397084078291899564124, 268670018298046298594544067046438306285322924770238391595093977430279476868065240, 78094390422018068485749659108183366278694042747549744891971134188665400412950020, 18124918094760916369648633132238959364840331932070152769613739914614309846704031, 4241888706533610079212359644998015902376872441583028817350629704555219530448753, 1292864973632566395230008219224138571254648896695439011761255646000025705327047, 268748278858999280597005392622004242197468731403889200124673378952297248513604, 88509143938000904019404561563568039020388387086033088264015176342184836107961, 20193371122440969904693011623640235956008535236609083989796068753247319156032, 4038600180280215891988824178178278280373636611246918842044528278230564207261, 1107150907782944887892399335890628523766269912586346493641592121812091723247, 210625186186013434779241292600805721380717453215450496819990522919652412749, 52953910211550391007013147620224873533688473472101985821194501496064403298, 9097555221706291288743269232756819233000414675958515393645941994120605160, 3429649093597174301305755373533641028744892761855146399462989664052400884, 741640028601865737636894538300654069448568041784703865806900024636263858, 137111267993711698795554790044192357770629382096307382022924712860324239, 38616149627736424773611788634842959989120382193171456026729095563767415, 9431485520373346422889960992205054090491173749526200420980321805553690, 1992952778532071559000019699416705938136688490627773967637839059076015, 574194788106589082411518870360486672683587224354718671901248024476268, 102609620640057348696515220693089742351613040750651566890644962920462, 36268823254475267212915191076327557136209959811616783925907478300982, 7567999544690811975942075962292580482677577353162367723788797894980, 1874140527739488453786828468118120241481575966337619572680165251377, 453914446353792760975691426663914252084437914832347163629988619705, 165150650733410175597931630292861667062273243834275274945484646602, 34566163119600685975060339689452757045437083897698838710019239494, 7694148541008402030841753047537726531717215585386379181283251145, 1697576884850411658454847805622249167935227079092758267244556419, 472437807783179983228633641986010243354676995634705949446120356, 119409918075506001971427759705853133156186846892920587610723175, 25613263424766799565203791718547119460962423676387668942984591, 7805142960598461841091346841458786166600096726425068620929337, 2767230135693902128766236987544547378777436388091785064756910, 689644486314086496286093830416975206144754872092432108597436, 138642086125227682870831666630271950088954885603515871632201, 30047434693445231347602467117028303851832764185641774643468, 6851801387424175873694354145711254327404855789285230103013, 2120042874205307146695207067554609162977513984517631857617, 490320105846897857421254356104910632681008002313418940471, 126323731373804665276167034060996983366300068355660603173, 21699921539905324453875345006818945922412432384306278913, 7939681050823987735942326816454304705408373515598927024, 1704054406000164917101338955641076586996654015897777293, 674629720702507360892410918497513853241707768110535720, 130116804903893330957629746403630277914984408897684191, 36586674897705341032938585410676119549859764313014514, 6820517853488553816157069373430435510514248629408934, 1940615831245060580576779381334292194461763717429719, 486407487540373443078130965659847688641455681092783, 115503902548715291215146001384729209189201342203617, 20726453501406140054607926221786392225949497849620, 5795586010156766459954451266198423523738902544440, 1894126095992857664160110316211206136427948391401, 400235284644456465531456917507977101554184036138, 96821039379669584765064498053975819680674844391, 23003305579401059533778299981921977893360385917, 5228073966664279351555893540080524011514115962, 1242198234479925081489833339665036257581784830, 412185918978837707936146917867270887000813745, 100133634343775138722999743130814482251294603, 26059544917887755330857182088221243972088111, 5139528748995372887990321340679356174733638, 1253542354308041615766358708614160342158058, 255695244303425264981809526736239333102982, 61808370933695923699986081041674755242751, 12426096507290278206573602748929564597975, 2986453750810080523307169404271220297061, 642144302488057714162005557670195083334, 130361391592026886001154254666792730817, 38722902212652057786773086799878934378, 7692285091800305362911294817569041066, 2668441901840977427307689562983863761, 627879703191450992712744583653335581, 143466848278452388635765854137055267, 40114449315047293082657646359855538, 9604649217508319090540717981276261, 2160954625898663094838587676686854, 663518655289550974870054172122371, 165231181091826810616798470843406, 32017505733146837917121936265672, 6710170503572414769550988030906, 2193907060628154300461720427652, 655138594818423378286082953437, 128372286376670762441323321515, 34081674525017606572942142473, 9410152783640368288366142632, 2828735859241558188208098320, 551007171562149788272788426, 123790351812017402954987183, 26171709615346256252881994, 5974406115827778237616062, 1129305631130982975444977, 309305180419035303006618, 63076647774929269450546, 17802308053095636943505, 5708739899619810440888, 1717642617243788103954, 487452007321104273269, 128040514304008259695, 22395338754966061650, 6980614247696882509, 1954726203330249242, 521378690601084559, 136837526017031961, 29173740577404415, 7191768065683254, 1621292657659019, 549037231011822, 141224784287699, 28266584508619, 8568210839573, 1730361037440, 343914088335, 79692432578, 29986725790, 6384194185, 1319027283, 483793159, 103505140, 22103086, 7280487, 2401760, 411716, 143073, 37097, 10436, 1884, 649, 134, 40, 14, 3, 1]  # 这里替换为实际的序列 a
c=2488656295807929935404316556194747314175977860755594014838879551525915558042003735363919054632036359039039831854134957725034750353847782168033537523854288427613513938991943920607437000388885418821419115067060003426834 # 这里替换为实际的 c

# 解密过程
bin_m = ''
for num in a:
if c >= num:
bin_m += '1'
c -= num
else:
bin_m += '0'

# 将二进制字符串转换为整数,再转换为字节
m = int(bin_m, 2)
flag = m.to_bytes((m.bit_length() + 7) // 8, 'big')

print(flag.decode())

运行得到

最后flag为

1
BaseCTF{2c4b0c15-3bee-4e4a-be6e-0f21e44bd4c9}

babyrsa

附件

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

flag=b'BaseCTF{}'
m=bytes_to_long(flag)

n=getPrime(1024)
e=65537
c=pow(m,e,n)

print("n =",n)
print("e =",e)
print("c =",c)
"""
n = 104183228088542215832586853960545770129432455017084922666863784677429101830081296092160577385504119992684465370064078111180392569428724567004127219404823572026223436862745730173139986492602477713885542326870467400963852118869315846751389455454901156056052615838896369328997848311481063843872424140860836988323
e = 65537
c = 82196463059676486575535008370915456813185183463924294571176174789532397479953946434034716719910791511862636560490018194366403813871056990901867869218620209108897605739690399997114809024111921392073218916312505618204406951839504667533298180440796183056408632017397568390899568498216649685642586091862054119832
"""

exp:

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

# 给定参数
n = 104183228088542215832586853960545770129432455017084922666863784677429101830081296092160577385504119992684465370064078111180392569428724567004127219404823572026223436862745730173139986492602477713885542326870467400963852118869315846751389455454901156056052615838896369328997848311481063843872424140860836988323
e = 65537
c = 82196463059676486575535008370915456813185183463924294571176174789532397479953946434034716719910791511862636560490018194366403813871056990901867869218620209108897605739690399997114809024111921392073218916312505618204406951839504667533298180440796183056408632017397568390899568498216649685642586091862054119832

# 计算 φ(n) = n - 1 (因为 n 是素数)
phi = n - 1

# 计算模逆元 d = e^{-1} mod phi
d = pow(e, -1, phi)

# 解密 m = c^d mod n
m = pow(c, d, n)

# 将整数转换为字节
flag = long_to_bytes(m)

print("Decrypted flag:", flag.decode())

运行得到

最后flag为

1
BaseCTF{7d7c90ae-1127-4170-9e0d-d796efcd305b}

helloCrypto

题目描述:

1
第一步,装好python;第二步,学会装库。

附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from Crypto.Util.number import *
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import random

flag=b'BaseCTF{}'

key=random.randbytes(16)
print(bytes_to_long(key))

my_aes=AES.new(key=key,mode=AES.MODE_ECB)
print(my_aes.encrypt(pad(flag,AES.block_size)))

# key1 = 208797759953288399620324890930572736628
# c = b'U\xcd\xf3\xb1 r\xa1\x8e\x88\x92Sf\x8a`Sk],\xa3(i\xcd\x11\xd0D\x1edd\x16[&\x92@^\xfc\xa9(\xee\xfd\xfb\x07\x7f:\x9b\x88\xfe{\xae'

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from Crypto.Util.number import long_to_bytes
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

# 给定参数
key1 = 208797759953288399620324890930572736628
c = b'U\xcd\xf3\xb1 r\xa1\x8e\x88\x92Sf\x8a`Sk],\xa3(i\xcd\x11\xd0D\x1edd\x16[&\x92@^\xfc\xa9(\xee\xfd\xfb\x07\x7f:\x9b\x88\xfe{\xae'

# 将整数密钥转换为16字节
key = long_to_bytes(key1)

# 创建AES解密器(ECB模式)
cipher = AES.new(key, AES.MODE_ECB)

# 解密密文
padded_flag = cipher.decrypt(c)

# 去除PKCS#7填充
flag = unpad(padded_flag, AES.block_size)

print("Decrypted flag:", flag.decode())

运行得到

最后flag为

1
BaseCTF{b80bf679-1869-4fde-b3f9-d51b872d31fb}

你会算md5吗

附件

1
2
3
4
5
6
7
8
9
10
11
12
13
import hashlib

flag='BaseCTF{}'

output=[]
for i in flag:
my_md5=hashlib.md5()
my_md5.update(i.encode())
output.append(my_md5.hexdigest())
print("output =",output)
'''
output = ['9d5ed678fe57bcca610140957afab571', '0cc175b9c0f1b6a831c399e269772661', '03c7c0ace395d80182db07ae2c30f034', 'e1671797c52e15f763380b45e841ec32', '0d61f8370cad1d412f80b84d143e1257', 'b9ece18c950afbfa6b0fdbfa4ff731d3', '800618943025315f869e4e1f09471012', 'f95b70fdc3088560732a5ac135644506', '0cc175b9c0f1b6a831c399e269772661', 'a87ff679a2f3e71d9181a67b7542122c', '92eb5ffee6ae2fec3ad71c777531578f', '8fa14cdd754f91cc6554c9e71929cce7', 'a87ff679a2f3e71d9181a67b7542122c', 'eccbc87e4b5ce2fe28308fd9f2a7baf3', '0cc175b9c0f1b6a831c399e269772661', 'e4da3b7fbbce2345d7772b0674a318d5', '336d5ebc5436534e61d16e63ddfca327', 'eccbc87e4b5ce2fe28308fd9f2a7baf3', '8fa14cdd754f91cc6554c9e71929cce7', '8fa14cdd754f91cc6554c9e71929cce7', '45c48cce2e2d7fbdea1afc51c7c6ad26', '336d5ebc5436534e61d16e63ddfca327', 'a87ff679a2f3e71d9181a67b7542122c', '8f14e45fceea167a5a36dedd4bea2543', '1679091c5a880faf6fb5e6087eb1b2dc', 'a87ff679a2f3e71d9181a67b7542122c', '336d5ebc5436534e61d16e63ddfca327', '92eb5ffee6ae2fec3ad71c777531578f', '8277e0910d750195b448797616e091ad', '0cc175b9c0f1b6a831c399e269772661', 'c81e728d9d4c2f636f067f89cc14862c', '336d5ebc5436534e61d16e63ddfca327', '0cc175b9c0f1b6a831c399e269772661', '8fa14cdd754f91cc6554c9e71929cce7', 'c9f0f895fb98ab9159f51fd0297e236d', 'e1671797c52e15f763380b45e841ec32', 'e1671797c52e15f763380b45e841ec32', 'a87ff679a2f3e71d9181a67b7542122c', '8277e0910d750195b448797616e091ad', '92eb5ffee6ae2fec3ad71c777531578f', '45c48cce2e2d7fbdea1afc51c7c6ad26', '0cc175b9c0f1b6a831c399e269772661', 'c9f0f895fb98ab9159f51fd0297e236d', '0cc175b9c0f1b6a831c399e269772661', 'cbb184dd8e05c9709e5dcaedaa0495cf']
'''

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
44
45
46
import hashlib

output = [
'9d5ed678fe57bcca610140957afab571', '0cc175b9c0f1b6a831c399e269772661',
'03c7c0ace395d80182db07ae2c30f034', 'e1671797c52e15f763380b45e841ec32',
'0d61f8370cad1d412f80b84d143e1257', 'b9ece18c950afbfa6b0fdbfa4ff731d3',
'800618943025315f869e4e1f09471012', 'f95b70fdc3088560732a5ac135644506',
'0cc175b9c0f1b6a831c399e269772661', 'a87ff679a2f3e71d9181a67b7542122c',
'92eb5ffee6ae2fec3ad71c777531578f', '8fa14cdd754f91cc6554c9e71929cce7',
'a87ff679a2f3e71d9181a67b7542122c', 'eccbc87e4b5ce2fe28308fd9f2a7baf3',
'0cc175b9c0f1b6a831c399e269772661', 'e4da3b7fbbce2345d7772b0674a318d5',
'336d5ebc5436534e61d16e63ddfca327', 'eccbc87e4b5ce2fe28308fd9f2a7baf3',
'8fa14cdd754f91cc6554c9e71929cce7', '8fa14cdd754f91cc6554c9e71929cce7',
'45c48cce2e2d7fbdea1afc51c7c6ad26', '336d5ebc5436534e61d16e63ddfca327',
'a87ff679a2f3e71d9181a67b7542122c', '8f14e45fceea167a5a36dedd4bea2543',
'1679091c5a880faf6fb5e6087eb1b2dc', 'a87ff679a2f3e71d9181a67b7542122c',
'336d5ebc5436534e61d16e63ddfca327', '92eb5ffee6ae2fec3ad71c777531578f',
'8277e0910d750195b448797616e091ad', '0cc175b9c0f1b6a831c399e269772661',
'c81e728d9d4c2f636f067f89cc14862c', '336d5ebc5436534e61d16e63ddfca327',
'0cc175b9c0f1b6a831c399e269772661', '8fa14cdd754f91cc6554c9e71929cce7',
'c9f0f895fb98ab9159f51fd0297e236d', 'e1671797c52e15f763380b45e841ec32',
'e1671797c52e15f763380b45e841ec32', 'a87ff679a2f3e71d9181a67b7542122c',
'8277e0910d750195b448797616e091ad', '92eb5ffee6ae2fec3ad71c777531578f',
'45c48cce2e2d7fbdea1afc51c7c6ad26', '0cc175b9c0f1b6a831c399e269772661',
'c9f0f895fb98ab9159f51fd0297e236d', '0cc175b9c0f1b6a831c399e269772661',
'cbb184dd8e05c9709e5dcaedaa0495cf'
]

# 创建MD5哈希值到字符的映射
md5_to_char = {}
for char_code in range(32, 127): # ASCII可打印字符
char = chr(char_code)
md5_hash = hashlib.md5(char.encode()).hexdigest()
md5_to_char[md5_hash] = char

# 通过映射恢复原始字符
flag_chars = []
for md5_hash in output:
if md5_hash in md5_to_char:
flag_chars.append(md5_to_char[md5_hash])
else:
flag_chars.append('?') # 未知字符占位符

# 组合字符形成flag
flag = ''.join(flag_chars)
print("Recovered flag:", flag)

运行得到

最后flag为

1
BaseCTF{a4bf43a5-3ff9-4764-bda2-af8ee4db9a8a}

ez_rsa

附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from Crypto.Util.number import *
import gmpy2
m=bytes_to_long(b'BaseCTF{th1s_is_fake_fl4g}')
e=65537
p=getPrime(512)
q=getPrime(512)
n=p*q
not_phi=(p+2)*(q+2)
c=pow(m,e,n)

print(n)
print(not_phi)
print(c)


'''
96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790344897976690691139671461342896437428086142262969360560293350630096355947291129943172939923835317907954465556018515239228081131167407674558849860647237317421
96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790384900615665394180812810697286554008262030049280213663390855887077502992804805794388166197820395507600028816810471093163466639673142482751115353389655533205
37077223015399348092851894372646658604740267343644217689655405286963638119001805842457783136228509659145024536105346167019011411567936952592106648947994192469223516127472421779354488529147931251709280386948262922098480060585438392212246591935850115718989480740299246709231437138646467532794139869741318202945
'''

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
from gmpy2 import isqrt
from Crypto.Util.number import long_to_bytes

n = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790344897976690691139671461342896437428086142262969360560293350630096355947291129943172939923835317907954465556018515239228081131167407674558849860647237317421
not_phi = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790384900615665394180812810697286554008262030049280213663390855887077502992804805794388166197820395507600028816810471093163466639673142482751115353389655533205
c = 37077223015399348092851894372646658604740267343644217689655405286963638119001805842457783136228509659145024536105346167019011411567936952592106648947994192469223516127472421779354488529147931251709280386948262922098480060585438392212246591935850115718989480740299246709231437138646467532794139869741318202945
e = 65537

# 1. 计算 p + q
s = (not_phi - n - 4) // 2

# 2. 求解 p 和 q
D = s*s - 4*n
p = (s + isqrt(D)) // 2
q = (s - isqrt(D)) // 2

# 验证
assert p * q == n

# 3. 计算真正的欧拉函数
phi = (p-1)*(q-1)

# 4. 计算私钥并解密
d = pow(e, -1, phi)
m = pow(c, d, n)

# 转换为字节
flag = long_to_bytes(m)
print(flag.decode())

运行得到

最后flag为

1
BaseCTF{it_1s_ez!!}

two_squares

题目描述:

1
2
3
你装好sage了吗?

你之前考数学的时候就没有因为审题不认真而导致丢分的情况嘛?

附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from Crypto.Util.number import *
flag=b'BaseCTF{}'
m=bytes_to_long(flag)
p=getPrime(128)
q=getPrime(128)
n=p*q
e=65537
c=pow(m,e,n)
x=p^2+q^2
print("e =",e)
print("c =",c)
print("x =",x)

"""
e = 65537
c = 42330675787206041757903427737108553993012805007294570657461042152628982126538
x = 209479773119142584969854470862023704936857416491817498021871883305658177375498
"""

exp:

1
2
3
4
5
6
7
8
9
10
11
12
from Crypto.Util.number import *
import gmpy2
e = 65537
c = 42330675787206041757903427737108553993012805007294570657461042152628982126538
x = 209479773119142584969854470862023704936857416491817498021871883305658177375498
p,q=two_squares(x)
p,q=int(p),int(q)
n=p*q
phin=(p-1)*(q-1)
d=gmpy2.invert(e,phin)
a=long_to_bytes(int(pow(c,d,n)))
print(a)

运行得到

最后flag为

1
BaseCTF{0760becd-cefaab0b094d}

铜匠

附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from Crypto.Util.number import getPrime, bytes_to_long
#from secret import flag
flag=b'XXXX'

p = getPrime(1024)
q = getPrime(1024)
n = p * q
e = 65537
hint1 = p >> 721
hint2 = q % (2 ** 266)
ct = pow(bytes_to_long(flag), e, n)
print(hint1)
print(hint2)
print(n)
print(ct)
'''
hint1 = 14439249591349619691972392177790365247490839237199085979433418493254022567815148979672690178
hint2 = 90063199151369157959005663017593053931871580139169245885113098598755909124764417
n = 18347545778876678838092757800261556931131930866012101566000425608407193858675622059415995283684230959320874387944052648148677918542763633503231962873204645415818139345588988936580526094727943067102768943117592654029397879665312089518191052154267343886226820785206334238961064175118262578895847281575656290248049404047727756356910896332939145136942219317065063060070725033146788186604738271846183709127655298440696824683099637827282095133642324657860714680107691622056420045091586609974536644773286992447027164350612852922016376888380895187804771279035652496676089183636450028327097084911908336202253562671798012457461
ct = 15659576879410368237140555530527974801613150473447768911067611094143466009251385693099110691602954207905029692682380253595062935017486879899242785756448973466690818942065250284891341066578689696180061755610538867770441139827574063212967027249650509215685566103350688284041405586915563454117672061141919712416360596137520514412607512596079964611672166435592936417138352662031529414118312166411150736015788925026636845744110093161894267707446937939130745326244186579516665160036229715964182962542836836457885170975474737620430886449029488829662146456489724775166105816909257516908496172172266375617868819982791477888289
'''

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from sage.all import *
import sys

# 给定参数
hint1 = 14439249591349619691972392177790365247490839237199085979433418493254022567815148979672690178
hint2 = 90063199151369157959005663017593053931871580139169245885113098598755909124764417
n = 18347545778876678838092757800261556931131930866012101566000425608407193858675622059415995283684230959320874387944052648148677918542763633503231962873204645415818139345588988936580526094727943067102768943117592654029397879665312089518191052154267343886226820785206334238961064175118262578895847281575656290248049404047727756356910896332939145136942219317065063060070725033146788186604738271846183709127655298440696824683099637827282095133642324657860714680107691622056420045091586609974536644773286992447027164350612852922016376888380895187804771279035652496676089183636450028327097084911908336202253562671798012457461
ct = 15659576879410368237140555530527974801613150473447768911067611094143466009251385693099110691602954207905029692682380253595062935017486879899242785756448973466690818942065250284891341066578689696180061755610538867770441139827574063212967027249650509215685566103350688284041405586915563454117672061141919712416360596137520514412607512596079964611672166435592936417138352662031529414118312166411150736015788925026636845744110093161894267707446937939130745326244186579516665160036229715964182962542836836457885170975474737620430886449029488829662146456489724775166105816909257516908496172172266375617868819982791477888289
e = 65537

# 1. 计算 p 的低 266 位
R = Zmod(2^266)
q_low = R(hint2)
n_low = R(n)
p_low = n_low / q_low # 等价于 n_low * inverse_mod(q_low, 2^266)
p_low = int(p_low)

# 2. 构造 p 的已知部分
p_high = hint1 << 721
p_known_part = p_high + p_low

# 3. 计算 2^266 在模 n 下的逆元
inv_2_266 = inverse_mod(2^266, n)

# 4. 构造首一多项式
C = (p_known_part * inv_2_266) % n
P.<x> = PolynomialRing(Zmod(n))
f = x + C # 首一多项式

# 5. 使用 small_roots 方法求解 (X=2^455, beta=0.5)
roots = f.small_roots(X=2^455, beta=0.5, epsilon=0.05)

if roots:
x0 = int(roots[0])
# 6. 计算候选 p
candidate = int(f(x0)) # f(x0) = x0 + C
p_candidate = gcd(candidate, n)

if 1 < p_candidate < n and n % p_candidate == 0:
p = p_candidate
q = n // p_candidate

# 7. 计算私钥并解密
phi = (p-1)*(q-1)
d = pow(e, -1, phi)
m = pow(ct, d, n)

# 8. 转换为字节
flag_bytes = int(m).to_bytes((m.bit_length() + 7) // 8, 'big')

# 检查标志格式
if b'BaseCTF' in flag_bytes:
print("Flag:", flag_bytes.decode())
else:
print("Decrypted but flag not found:", flag_bytes)
else:
print("Failed to factor n with candidate:", p_candidate)
else:
print("No roots found")

运行得到

最后flag为

1
BaseCTF{7074ddc3e006810688241196414e49e2}

random_primes

题目描述:

1
结果为0的给我好好检查你干了什么(严肃

附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from Crypto.Util.number import *
import random
def gen_n():
primes=[getPrime(128) for _ in range(256)]
n = 1
for i in range(100):
n *= primes[random.randint(0,127)]
return primes,n

flag=b'BaseCTF{}'
m=bytes_to_long(flag)

assert len(flag)==45

primes,n = gen_n()
e = 0x010001

c=pow(m,e,n)

print("n =",n)
print("e =",e)
print("c =",c)
print("primes =",primes)

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from Crypto.Util.number import *
from gmpy2 import *
n =78300669134090137852678272985826748552135227276632141248987049792032006306302216838913764274866303353208450204056303587307590215658369546155011362928706987241738494219541640893624036978156512506828463680671263486243620357332029975262649036988429673099480612452108805474703908926666372276084227948945557265663478215385708377783788570365632616043692339165126905185780780266966306548390661933964569191558132570743049563034138454687784280737515786647554373002062073506433019576711216881997114922882459590300118573321037403610889041169358378723253785685185468195113769538654602557963324567374538144099228383454092513581001676844948371535253876783418313588527754932166605066901072445123419390582818421290114496685300926300428214457517990285819930164112928731952543551128353453115448896272534889430898972420106066951673716649898254901175990616932072274131352817500432771246120044877003878221635833566879303044541045834038388997926347179939044765998585225912825579716411592564742018931576637831147018364052669287568321730785094397048548966924521616592554123755297954204221563101170233500051950508111908253332306439556638016218903032470713009804240601585082087048162066169084662644707376647151608352036058459491394516846894878416951958668053255135013274125427380981145860643060541753558111657169642936860264070256441807766713460296249602643758686033797758071121020245797758472562524923801634553187959279204425077723939301840341779998492203869115635533331664608105795918593153796830400602836307602218542060655621724654663459491663959746624660378618696497713505280314029154654750144247111545203758654611758984447921004347657793617842564871769622784844341157861486787088384957424536581508067582989224734241742351249915951485225249670040001204171856547596397427658888879993013652971335861824416084725435327931256774534973698438003593122194474117269397752225948596514379988893089239094703410940035417268946100231522267605729519374566776171026410423486906556493370843386314649478106704968479881781695360132024826936593194324539644886241562342997299649076507105518992946223028855705189458007533521138703343150937158114114218932400728424949936286443583797118636171187082834662757985896337364138817400612718422265665198024836586611857266616428913152399750688461692677751727389476785588380514444593900569311496880422405988762554852121131345538798688587092154717384294801026132314002251890156123191210398076704434510182202143578810771596233936298462366674592585338029819643973999567268938697218329734244529139548760101393715777276776940762681748317493543343685273831243829694914274003574509516149595004243952747746644961308054952235256037171151695870643020625268635139422461824974663101258586488528601193378268634713686606488503649923013225514905688326248009253372769118830036659383418890729585564557376820890036155588551064419189532686009173215470250197488274429655669070803391973941917017493224972246331391152287082983301776505925295294164201606063028946348118492358755684668733095242911870636074134633575423928967453742150728552560370847186174905012586984090885433727025000206871702482359563400504600567763564582739694873656581728461491373440639163666040518508819641244084238867282549191870081112768586762540287977817548140346798817430775010275964061529114139424317686620296832033309265702409802876815255731607798400127673166880859281784259402995434972992131101158600882460475931695668710417351337637612478180964570698492610372677176847071937542439765750578751925220375723373827393178629810215549480885217514819316424426943459039642952096990941480059597449017550988311939357225101582029418355438775525606571176735588489070335070244453533520858832311313682516805060002632168734723995449881138047136306876918900826798316113276424022400544205104057777588615149030045126315192448561606146254432070045197349283823967140032987449249831755565764939530383006495743
e = 65537
c = 1093256121418811691349633884423021356633978134292966489553874542781791238358295335426668415023166027954996625051420577493667824501649432869528057686451750288316816910397382629774298441937547233956753065529097877191699918039115202957337087658469098304374696277563020457331278140075969310150315715843020746656167994646063024677105714238622574336597601173953997036582942407796229805377339006787815702404915271846770376106312644390819144016155830513829761647568620243654068928415623802444953011361211378013499713469372806125474734994287518083907329841838337717556241874324440340626885553763322954232400855565339807071892321582386180978536483407197865884342435897670134641970372091590178581326892854820705050227840462139458418313478056939546089488178689697927788133612008061739961796780717135680690059059843521460548943400440075072549263642778142322553681107266326899389399400224420049958868630481920741293895509509786744023698063926664818702849276103941412666213912301512015982875337927624885673329513416992222855651023180889148449319496283772492522626881480405730489310544315066415406419791190663101607618436762339809465699249346219280236246798494923574248758432354732450859901402315454165220861852940020724189284384978436094976303046718818115920223875761763369205054892082583399430768426962644539683767683622215674622364530161306440520074932775203726898254313918302918158338893115967835907921400822151110065285755016823481526036112086877396184474779772672777884312990976267562132296839364269838737667955289273381304280292531609850947774380025541448760290985029328831136155532030110660328741793152955524993218772392841301083853407843632521944959421101063922926408630857942155173553265649994782728054809833578075255522763473867570242922191690258610960429527917825954799350243215320860648845823888406079144360733120892758516436394283721941074591992068709056978434144249946370176209580261992712491146585486352865467853012283982569783829897373148685163663183813646084064010686825626422454984021416402862127889251773565118407053577546260937996800783904867497317512257427384881412920876851185681901360445996414854617735746124849305097724462381788049919520369827437945533718238301976608693210822883549849346914749712641177399278642094159972818771839223940037362062271618565492364129165948546330822175641999869293182574801410909568799887485687799830413460992606782188190161078789803079204468693865791568886757702397226751678303106993202727687413409748299454409517072068313199302592993167348776456703605936302216362148170559954097296263965296226759555059786981274338884349876203756741105449671416827010661253266421028866463837188482523849379185098341631154586750782372250753953789082447013115491415875557484766163997419331193733180948335725001700381759888109481542481560084404144004112246764995544553798311119720361550478239142333177065617369951724788288789091898104014990085985609531302672876148454755584802296948087896190960286862545509803680907635139069769773489974690789281850253441901658186053827023495071972754442328786102677924620742574365171969462047797683507872502560411636054630326651806741191565960549277521714122075001246821117983391397806797612028499867676071294152880791421912694378781390703123405056446531600817818157671340725736220061182015810279092548335683818151707498767164622121926625237321182816937233802267205025138008023815746402851176062360192537976175702542328058732539514446727425707394730057315691659046002877368113680075447504177622678838170749340265685373340874438362777036176293805138792214226140580946132386530852126980325547324038761178186444019589823730620635017784138099601753640268173837644549341739416563571709247391327046697023194351531203111048984847048754457714313305254115325718812624677601983165234723923006394872649966184045387413721873049174098054565879297120256469204258468893249797880459716409176351490537
primes =[255675877315683439181791416047922719357, 180461111025833129025002455435975940971, 337490274732450824975483083220272824199, 304456281514261901091507788207898547903, 254797576342247974393400562686432925229, 183131976400038388097951032415099792851, 187104898097787470482482874168168046723, 300625339408843701719323023799725058313, 293895810597575199851257228961757849961, 197370673648293754589174456296168807801, 214231100175566513755789399545798257027, 299940533764670809123600295354236009687, 329911008919678926860313614132444450849, 292789028093982326052555296040896616647, 267992025172569093811940290026790452689, 192120589915828510906490323831586947847, 208470412662206941915861109996165224771, 195723355777376859063723356742829282943, 195479450259644250739997899829659598467, 225273608271867864202603965232709350643, 297983612753980801299047698668400172129, 289863711883286870918208567358762217117, 320181619705477005993614485764800027801, 274756647552045078797369358162815740121, 208678800821922117897086572764543689257, 274510151199776127157320013074195989531, 270061041585244138305865647463819178071, 231693016600939448457585159254864460211, 221276763231716810367704255896280432977, 284588387935614601031451184436365997027, 190107678698149330362585520776807817237, 244360771516251060479861295353775315223, 184597108435320085388683362929647254859, 214993743235105601056961433866767506839, 319622401044815459679561340300419077137, 312048738778225034570138647462191322423, 192343262692325176379644178905323471293, 217411522139037534713431287902356703153, 203269104665429435826852242437943175799, 197694542080431775212389192687346023837, 170754527923440727794804968936874697237, 199565850096248778954713726823038799169, 329479041983980219266962570620791190271, 336543942677902368237166971184411120319, 296349049540412710059375861980880864529, 276958785496368109105253052397588113011, 236061938563845834433725013690718000077, 175132351377019405283465079997063887583, 210382170435243156571657554946080029177, 179295658173078371976938970235081809653, 221499702407155816778095037176350210511, 273750615951477382944958796366722325273, 215400010676152024850087488645214675509, 242104770580865606729511928881839588399, 237832832377832763447973839385045714547, 240569613888482344825828531593242970283, 188780850815328211058185207879562258749, 236351101956411494065697625496351792553, 234848091988225252588700833488573195973, 216111241348931999833159262144497816823, 248635261568172677022024655836676274851, 175169438550312686771927355949990675153, 222945249317916941175129207081724296809, 272123250140823727659430614318422459467, 321040760103571995807993446246308239643, 244443756627073674223172405572152750757, 231281757931881868821441147678670578293, 212608548905981265953338769409211557953, 262334849743113291736207517444943890093, 221968375825210657749121344978372971509, 284590253068157230941830678792449649633, 300977729071492709020945132474829506297, 305429273614180801706392853095181679257, 335939257455017842008237083398243135951, 294393337682220551877311202846160164539, 300751607582285572452649226924384213987, 177342562402002655670186066181715938647, 314293624358674993004107306426510931177, 192176341797009660053769692734114433539, 219685065300219568101641511794459670373, 311600604660297404708381142674858758433, 189258688382892886748712093669349354607, 265765352209342630144326504781080544103, 233694355945946803066419059858430846563, 223443907562486442160842066195579310831, 182987294835928563972108625144731142337, 214137187246441738588307243392955884313, 251175687278238637206326829923211055529, 280606397834257483599650477170805542213, 233315167891969517243554909836441514543, 189298893622248669462727814260415085983, 248568957395290350328195179867090245057, 292645643756069284722532228739967572339, 179447399460747583275629697319304390429, 179645924152591342445122478862459911921, 332356391092472452305991116186146584177, 245901581082639772431455170863897420347, 205817781083003905754490509387056092343, 240380627852067724273161876175750141361, 268700167965406311300179029348879484383, 213345040113356686319409599805587957227, 251674200978198716465773971152251242983, 179180641720352444750737502831482762429, 306320532661676131438858609804319013343, 256526510096408769263055362633154848279, 205959060854084755092268947433148347151, 291927192797043538420569211955680836527, 204978877621419749982721876460562600659, 332399656527167823296930534887330184167, 280595736375324905544725725979456898547, 300213915091486506011056425480272542643, 318558817334795356700066397524785435681, 319436460864579377450478049744976231249, 243133148342749788432705330633449318989, 322207542584548294558453923911981520623, 320850760899167598764295789802781069077, 319881693868123342340868542828982909581, 206495732343577870213482544631201066371, 242791194590408310278390962600348350913, 251698935174714138851501858575403291023, 336741296937713120832285756167770151171, 315930741679982320652758472398428972349, 308738538640639393614807292598596283683, 242935142876894679332147837418000898919, 320412254452324446540182603262368766623, 244141238875170898148081089385979949403, 213402860730186872545578995830820087021, 257839149567099022202819187898373109541, 205790643921760418513647126480621419031, 198756405484996593521220520853141427989, 294805620517257214889752595599972901633, 255265348017204260362764409566933677153, 274956788729771493245467759809121243433, 207307664273912902821847768063880326327, 228782470653856387114481087524374601589, 327491405235009262853431015300186498577, 173419211471119738399569200317219003511, 266492438299975532333886393820275910943, 276688137488059756944807773426416608851, 189140053313243747387509835884240226891, 184847492345401269770088588442458737119, 333210953053056282315216794932763359439, 214889588455292527477541347807824233317, 215229626238372443203352172982941095611, 321221012891336284787614820604143303369, 199400757934809114495211412464158118397, 178651685535715756785532928453093603903, 220776757717693008935011794749825325367, 303675938617156800143972318322678387193, 327088681522055240658148530499087069577, 335783766579434559780651762543581106409, 259404300424171457987268194257725139933, 179840475811181163398944717514437142491, 297175485665739288479300848974745531391, 237485053681467543059304786336620370377, 297758270183402970750961370350920892967, 287801215974478613717591686806352676563, 310730027586487200761300572073383664977, 276935537099897424875065059267639595933, 251308797428280999427269663339682237319, 217181290779624781624389434069663308189, 278483889173395237559970658394075421689, 204589549925569581630736863023597052269, 226032820526239722979885626335569166693, 307616487066170583892695494367464641267, 222259520009563764167811735543215104543, 264617923645991453974534495741056598021, 300871024629133281254211035867737539223, 170303240421348821459663263562155031807, 194456703515031789312329705897177851253, 327369717787718586651743316493134914089, 313093229847313153837631186419773330871, 224824444829441039679277741769033772991, 224589292446640473576473771583959436463, 214868884335325091682110394113205785173, 281852933308534953139887124628766315043, 225661596373287038911910532148417025369, 197435393688129783450788260536037003399, 266167151841181488476394288675916455947, 179215005575751890101294918245131012843, 181845510055827963079718687867786713537, 257637102334933109362889675555405989789, 211635849392838491382106919488103885767, 186185061420106956824801515596528043351, 285418977308105637920637161558618377271, 333320927697115374794556799401253359593, 188501857269628483380021948001960729951, 333805438111531260206119448902819218463, 207203219305023873959844954660799240249, 243125622633677038874854389025310242579, 216464412848635515952075334791481048513, 215209416857176076836597526059188595229, 214612926530046226231879587951703041239, 211839237456343309131155436452991652823, 243378322702585683775212046627894119463, 300569560524099180847101362636309727649, 277442530432004673254582623587364635427, 264039335285085705456044566498360689059, 336941745040225044220256680095943361963, 294351957900120820634469984437616730183, 193397784957516885417425615607279607259, 172625665034500456784052580259369183617, 171214762299612221823796960282578324943, 194792374409055048312123241531481499583, 214020514849615741103085838425694524869, 217152285242353248407824271751534124093, 310504460995069986330272047239018516719, 257283037178296965441561511618312400677, 196379023990504203398232036900292068109, 208338219265141175146204974249461481119, 180313228114558484028748815066535513471, 293814076002148382129879416847624489347, 217981245083649644743701945778358819867, 198894611219128734462943250308461071371, 190754795019022912784187412387261424293, 273263914687122798746013275553691541621, 319875887014797059887738138214903974573, 280433942775269696096083027024527213553, 339832090471957335839878188583478605273, 245482340001475388718217992653932933781, 195945871414379770821529324478394520901, 203621853598394319877751491201563422297, 285527901432745514886361613743984147931, 284721811618834957831167749970526496317, 327215978662725442740036051250620691291, 221299321558362891869402561537662340987, 252585072729486722478056993406814970147, 280264567326332248237425051940201458271, 241027648066340372998036400876879511133, 209093079608768177230455678431608454539, 340235244837800791530469709812216931327, 318370869089270734010914463566452904391, 218007259061353959833958121965586715759, 320702628326860753372843359167209806577, 280574097974570759348625351607802595079, 228292038707075332622237132594473246261, 246482905608669854259984848561724759323, 281771843261446623855706740146832822043, 241444581355719829115072364769273312223, 309029268537775236744873599480649785803, 293169195958605701684834829075351077843, 240056552101889027428780330876207267181, 206667506718454166578882634113592471317, 295377459264316749259598713099825801289, 334341534141831513237527215426279900591, 263440016933436744959242384953581131709, 327921668846632014434297416582771393151, 179743859120339282852666034250891124503, 212172965192102954961276830300925726343, 325170702322845184523697390427992449689, 271105603309076479942153666379400527383, 271642757529104184378772507234018239527, 244844048330592276234702305193952823371, 270007525941420385852467420335121485863, 290899364033417721623974853950097454643, 279919385326960469749295500025219756669]
for i in primes:
for j in primes:
for k in primes:
tn=i*j*k
phi=(i-1)*(j-1)*(k-1)
m=long_to_bytes(pow(c,invert(e,phi),tn))
if b'BaseCTF' in m:
print(m)
exit()

运行得到

最后flag为

1
BaseCTF{7cf4eedb-8b2d-406f-83bf-b2cb70882832}

basic

题目描述:

1
密码手也需要会pwntools

附件

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
from Crypto.Util.number import *
import socketserver
import os
import random
import base64
import string

flag = os.getenv('GZCTF_FLAG').encode()


class Task(socketserver.BaseRequestHandler):
def _recvall(self):
BUFF_SIZE = 2048
data = b''
while True:
part = self.request.recv(BUFF_SIZE)
data += part
if len(part) < BUFF_SIZE:
break
return data.strip()

def send(self, msg, newline=True):
try:
if newline:
msg += b'\n'
self.request.sendall(msg)
except:
pass

def recv(self):
return self._recvall()

def handle(self):
printable_chars = string.ascii_letters + string.digits + string.punctuation
optional=[b'A',b'B',b'C',b'D']
for _ in range(100):
secret= ''.join(random.choices(printable_chars, k=16)).encode()
select=random.choice(optional)
self.send(select)
enc=b''
if select==b'A':
enc=base64.b64encode(secret)
elif select==b'B':
enc=secret.hex().encode()
elif select==b'C':
enc=bytes_to_long(secret)
enc=str(enc).encode()
elif select==b'D':
enc=[i for i in secret]
enc=str(enc).encode()
self.send(enc)
client_send=self.recv()
if client_send!=secret:
self.send("\nYou wrong!!!!!")
exit()

self.send(flag)
self.send(b"\nConnection has been closed =.= ")
self.request.close()


class ThreadedServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass


class ForkedServer(socketserver.ForkingMixIn, socketserver.TCPServer):
pass


if __name__ == "__main__":
HOST, PORT = '0.0.0.0', 9999
server = ForkedServer((HOST, PORT), Task)
server.allow_reuse_address = True
server.serve_forever()

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
44
45
46
47
48
49
50
import socket
import base64
from Crypto.Util.number import long_to_bytes
import ast

def main():
host = 'gz.imxbt.cn' # 替换为实际服务器IP
port = 20965

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))

for _ in range(100):
# 接收选项 (A, B, C, D)
option = s.recv(1024).strip()

# 接收编码数据
data = s.recv(4096).strip()

# 根据选项解码数据
if option == b'A':
# Base64 解码
decoded = base64.b64decode(data)
elif option == b'B':
# 十六进制解码
decoded = bytes.fromhex(data.decode())
elif option == b'C':
# 大整数解码
num = int(data.decode())
decoded = long_to_bytes(num)
# 确保长度为16字节
if len(decoded) < 16:
decoded = b'\x00' * (16 - len(decoded)) + decoded
elif option == b'D':
# 字节列表解码
lst = ast.literal_eval(data.decode())
decoded = bytes(lst)
else:
print(f"未知选项: {option}")
return

# 发送解码后的数据
s.sendall(decoded + b'\n')

# 接收并打印flag
flag = s.recv(1024).strip()
print(f"Flag: {flag.decode()}")

if __name__ == '__main__':
main()

运行得到

最后flag为

1
BaseCTF{bfa12f96-8365-4f20-9603-81656bb8add9}

try_to_factor

题目描述:

1
2
3
4
不难,建议多思考一下
ps: 如果不成功可以多试几次

https://link.springer.com/content/pdf/10.1007/3-540-36492-7_25.pdf

附件

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 Crypto.Util.number import *
import random

flag=b'BaseCTF{}'+random.randbytes(64)
m=bytes_to_long(flag)

p,q,r,s,t=[getStrongPrime(512) for _ in range(5)]
N=p*q*r*s*t

n=p*q
e=65537
c=pow(m,e,n)


gift=random.randint(2,n)*(p-1)*(q-1)*(r-1)*(s-1)*(t-1)
while gift%2==0:
gift//=2

print("N =",N)
print("c =",c)
print("gift =",gift)

"""
N = 162692163428762295773992659007654377270271126313772302197255271375236131917158614424426498628778734679898165422129699410934825650141972454562350664161510689489443251515884304101827584411577749250383438126881931889798597627663578045519256806107514170414321556291545302688028088470848270636776466672843710163017531472049823632822203461654253767303314505996071453898533003519236112138591066133289040889933161978131399309340741554076140734156174295730180874473301361701867633594222054688204666518058106672165786417002466165926062199279674267145233283545524775943767021416906072142236079753359492846480515376121887507681663761713445807717270089017438999615422884163666812016989696908657065537508715229685120221307021151610089917537155165897740417480127289719971512938348936259
c = 113962118676826667648935023618252851875440854724310328843964819392166304653581141146631375503931008732348730639629174670963727399860571217264854300057305570824097216782800531930906801885967717639795643406206813677461127762087560021634738167845077869308515223303820469892552545806179267969169748886980836435095
gift = 863514692222931709925579242743251211976114217396765747601042357918763818732391790491059528595917786523674732369068315533549380754409535403506339052401422249684188032949680148055803474336983973622610403448963752802490806614810077181934627694570685722842963961551889267501616799757825675192653489096007790143775773378495299981666657347802233798206597104474595281241837323214457344961462510183726339545608046357281265026013496037522835659867389206279894057481600882665189079672009577651494435000349624334685832217586703242422260870866432379257259316411280539845741932725104662417642890238587876489774492067722351467773093391502588019563488688309892102039611978767690653206664257400163618467825666105966072942726011447079204869750153256054140924951306811971422635104088608275908232688385437145325481792836532453258784103533536292492138405929815964841772656055397705840797739586953744563989819811944946916720655079908564653686456283647030055622241840292127096994325415897266379446446435164189216562921252341705747891518007710533906231225283309180960546212899099652226954393826875
"""

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
44
45
46
47
48
49
from random import randrange
from gmpy2 import *
from Crypto.Util.number import *
import itertools
def my_factors(N, gift):
ans=[]
factors=[N]
while len(factors)>0:
N=factors[0]
w = randrange(2, N - 1)

s = 0
a_1 = pow(w, gift * pow(2,s), N)
while a_1!=1:
s=s+1
a_1 = pow(w, gift * pow(2,s), N)

if s!=0:
a_2 = pow(w, gift * pow(2,s-1), N)
if a_2!=N-1:
p = gcd(N, a_2 + 1)
if p!=1:
q=N//p
factors=factors[1:]
if isPrime(p):
ans.append(p)
else:
factors.append(p)
if isPrime(q):
ans.append(q)
else:
factors.append(q)
return ans
N = 162692163428762295773992659007654377270271126313772302197255271375236131917158614424426498628778734679898165422129699410934825650141972454562350664161510689489443251515884304101827584411577749250383438126881931889798597627663578045519256806107514170414321556291545302688028088470848270636776466672843710163017531472049823632822203461654253767303314505996071453898533003519236112138591066133289040889933161978131399309340741554076140734156174295730180874473301361701867633594222054688204666518058106672165786417002466165926062199279674267145233283545524775943767021416906072142236079753359492846480515376121887507681663761713445807717270089017438999615422884163666812016989696908657065537508715229685120221307021151610089917537155165897740417480127289719971512938348936259
c = 113962118676826667648935023618252851875440854724310328843964819392166304653581141146631375503931008732348730639629174670963727399860571217264854300057305570824097216782800531930906801885967717639795643406206813677461127762087560021634738167845077869308515223303820469892552545806179267969169748886980836435095
gift = 863514692222931709925579242743251211976114217396765747601042357918763818732391790491059528595917786523674732369068315533549380754409535403506339052401422249684188032949680148055803474336983973622610403448963752802490806614810077181934627694570685722842963961551889267501616799757825675192653489096007790143775773378495299981666657347802233798206597104474595281241837323214457344961462510183726339545608046357281265026013496037522835659867389206279894057481600882665189079672009577651494435000349624334685832217586703242422260870866432379257259316411280539845741932725104662417642890238587876489774492067722351467773093391502588019563488688309892102039611978767690653206664257400163618467825666105966072942726011447079204869750153256054140924951306811971422635104088608275908232688385437145325481792836532453258784103533536292492138405929815964841772656055397705840797739586953744563989819811944946916720655079908564653686456283647030055622241840292127096994325415897266379446446435164189216562921252341705747891518007710533906231225283309180960546212899099652226954393826875


primes=my_factors(N,gift)
print(primes)
permutation=itertools.combinations(primes,2)
for i in permutation:
p,q=i
p,q=int(p),int(q)
flag=long_to_bytes(pow(c,inverse(65537,(p-1)*(q-1)),p*q))
if b'BaseCTF' in flag:
print(flag)
break
#b'BaseCTF{ed4bff90-d1f4-4f0f-a3bd-999c54d9eeb7};\xef\xd7"X\xceglz\xc2l\xc3\xf0\x04\n$I\x00\xda\rT\xc5\xef\xc9t]\x0c\xae@\xdcO5\x02\xa8\xd6/{5\xacD5\xda\x11{\x80\x80\xa3\t#\x97\x871L\x10\r\x122z\xe1\x89%\x85\xdb\x94'

mid_math2

题目描述:

1
2
3
4
5
可以陪我学一辈子代数吗?

施密特大法好

聊一下这题本身, 是在研究向量还原困难过程中试错出的产物, 出题思路和mid_math是很像的, 大家可以大胆地试用各种密码攻击方式, 其实这题还是挺简单的

附件

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
import numpy as np
from Crypto.Util.number import *

a, b, c = [getPrime(128) for _ in range(3)]
d, e, f, h, i, j = [getPrime(1024) for _ in range(6)]
A = [[a, b, c], [d, e, f], [h, i, j]]

flag = b"flag{test_flag}"
flag = bytes_to_long(flag)

def prod(myList):
result = 1
for i in myList:
result = result * i
return result

def randomArray():
upper = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
low = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
for i in range(3):
for j in range(i+1, 3):
upper[i][j] = getPrime(128)
low[j][i] = getPrime(128)
result = np.array(upper) @ np.array(low)
return result

e = getPrime(18)
N = getPrime(1024)
C = randomArray()
#MAT = C @ A @ B
MAT = C @ A
c = pow(flag, e, prod(A[0]))

print(MAT)
print(f'c = {c}')
print(f'e = {e}')

'''
[[9194428734244577957135736828947112370812209206819996917633266069359894211949655026549592464237531352518967649750275097282532736237822915630766535634248987628113137246739472264614337707439494149796414126558156060870508338278038269649101921703583149322486905552569052814106532234864028314925118581658029792157851338427975728108000711353532410024128431635933014226306706319591106081211872
7052600738698435126221697697810087514520765619736355003187836563546493264420232197860875416948961661231812045406188307561458872254314061097960625042149316957446344556490001927621879295417925720004568332344856366002394724202261454916368122811414228043610804718983599804179657247820737462743875143882925818085495573474169110616761320858675303922740882169073395416895304752909979711051264
13094262565727554986668133240216117564284263232131011542877585146452802164148464500319291219458081531317231044962383872061004846788004747813785963603455919882739054992075130196548494850105124430477756818974520035883861936342117869122455996838023977818945511119955390136020375974150407580576040034808588694313922810340598787633148909527275716235390356737099830131958338026891256778602432]
[7291452286171544741377496447735677778433522048452394999757158120018504601116506253897733192493798837108269469756414516913436198353934250444263790689101779479157541198872731006007031448329354826004420971505929629537584453480285628607579031078497417101681028600589030661495031531644755072500393418929237208836713910921969937998825721580514845395852889662758886414966066733340052235985735
5592919719754926663830816961667268104316637431189640788304536404157195458040686322901848820171568258023938724485177544141303597034389473064509506247034833050568643394732003598890104462382321956436508366359718039669456303596542945687737870352569084995858128262046585579724537002100295978230177579835256681774512205534970583421138287684468047290246482431883957170924203400422234299829407
10384135162743100269852365857770153822630076412853981379757028821332622753962517667857057209221058533163475030678127399042436975886694593504673386134198042731671320468065688239424934644173240507619471360908786669070898288638067852779718549009532013299792474712979659423962779677856135791013599792822988457540442172903145046394648862567656330868441373023488569784114231877910285319620037]
[34946383530632295853235791100380055176686898072752599942691162027311662041417740482507624946631032260410440329949488242706004902881977357811370156793240362927747354453547446315050117795844866771053429455608334265986953931753411938119703800489233043034369650346216548318254326462336573090313788936967898128977445514764945671848611612198443909056919
26805677375585831510259621878357023272222175103906204143689109861471123435549853025410319713500257027420994041712736040084303902812241806295302385126726161281240831030434347236854521776375408982352155894199700974681768432734155312616453345950508256035721377179651166114898547487082749355033867559583905997404388549346221139007108462958001461826337
49768956277664050500387501949373949828589012443212214016088015478826178759698946452495063308332332373728223252613132611904477061717762261927498754849913008747980442098787524359755695519989286304445175440218168145037681791003471134417445542856715034633656861298596197935068562189476201463465706711744838395255326376049859058504891392128431832044455]]
c = 11781599055433308033432930805524658061560499523533841161297213162869735414528038973998414585008473948613388691447093
e = 160907
'''

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
44
45
46
47
48
49
50
51
52
from sage.all import *
from Crypto.Util.number import *

# Given data
MAT = [
[9194428734244577957135736828947112370812209206819996917633266069359894211949655026549592464237531352518967649750275097282532736237822915630766535634248987628113137246739472264614337707439494149796414126558156060870508338278038269649101921703583149322486905552569052814106532234864028314925118581658029792157851338427975728108000711353532410024128431635933014226306706319591106081211872,
7052600738698435126221697697810087514520765619736355003187836563546493264420232197860875416948961661231812045406188307561458872254314061097960625042149316957446344556490001927621879295417925720004568332344856366002394724202261454916368122811414228043610804718983599804179657247820737462743875143882925818085495573474169110616761320858675303922740882169073395416895304752909979711051264,
13094262565727554986668133240216117564284263232131011542877585146452802164148464500319291219458081531317231044962383872061004846788004747813785963603455919882739054992075130196548494850105124430477756818974520035883861936342117869122455996838023977818945511119955390136020375974150407580576040034808588694313922810340598787633148909527275716235390356737099830131958338026891256778602432],
[7291452286171544741377496447735677778433522048452394999757158120018504601116506253897733192493798837108269469756414516913436198353934250444263790689101779479157541198872731006007031448329354826004420971505929629537584453480285628607579031078497417101681028600589030661495031531644755072500393418929237208836713910921969937998825721580514845395852889662758886414966066733340052235985735,
5592919719754926663830816961667268104316637431189640788304536404157195458040686322901848820171568258023938724485177544141303597034389473064509506247034833050568643394732003598890104462382321956436508366359718039669456303596542945687737870352569084995858128262046585579724537002100295978230177579835256681774512205534970583421138287684468047290246482431883957170924203400422234299829407,
10384135162743100269852365857770153822630076412853981379757028821332622753962517667857057209221058533163475030678127399042436975886694593504673386134198042731671320468065688239424934644173240507619471360908786669070898288638067852779718549009532013299792474712979659423962779677856135791013599792822988457540442172903145046394648862567656330868441373023488569784114231877910285319620037],
[34946383530632295853235791100380055176686898072752599942691162027311662041417740482507624946631032260410440329949488242706004902881977357811370156793240362927747354453547446315050117795844866771053429455608334265986953931753411938119703800489233043034369650346216548318254326462336573090313788936967898128977445514764945671848611612198443909056919,
26805677375585831510259621878357023272222175103906204143689109861471123435549853025410319713500257027420994041712736040084303902812241806295302385126726161281240831030434347236854521776375408982352155894199700974681768432734155312616453345950508256035721377179651166114898547487082749355033867559583905997404388549346221139007108462958001461826337,
49768956277664050500387501949373949828589012443212214016088015478826178759698946452495063308332332373728223252613132611904477061717762261927498754849913008747980442098787524359755695519989286304445175440218168145037681791003471134417445542856715034633656861298596197935068562189476201463465706711744838395255326376049859058504891392128431832044455]
]
c_val = 11781599055433308033432930805524658061560499523533841161297213162869735414528038973998414585008473948613388691447093
e_val = 160907

# Convert to Sage matrix
M = Matrix(ZZ, MAT)

# Apply LLL reduction
L = M.LLL()

# Extract the first vector (should be [a, b, c])
v = L[0]
a, b, c = [abs(x) for x in v] # Take absolute values

# Verify primes and decrypt
if all(is_prime(p) for p in [a, b, c]):
n = a * b * c
phi_n = (a-1)*(b-1)*(c-1)
d = pow(e_val, -1, phi_n)

# Convert to Python int before decryption
flag_num = pow(c_val, int(d), int(n))
flag = long_to_bytes(int(flag_num))
print("Flag:", flag.decode())
else:
print("Failed to recover primes. Trying other vectors...")
for i, vec in enumerate(L):
a, b, c = [abs(x) for x in vec]
if all(is_prime(p) for p in [a, b, c]):
n = a * b * c
phi_n = (a-1)*(b-1)*(c-1)
d = pow(e_val, -1, phi_n)
flag_num = pow(c_val, int(d), int(n))
flag = long_to_bytes(int(flag_num))
print(f"Flag (from vector {i}):", flag.decode())
break
else:
print("All vectors failed to yield primes")

运行得到

最后flag为

1
BaseCTF{8E2BD73F-9C10-F813-2CA4-B4B2DED4E961}

ez_log

题目描述:

1
什么, 我打对数, 真的假的?

附件

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
from Crypto.Util.number import bytes_to_long as b2l, long_to_bytes as l2b, getPrime
from Crypto.Cipher import AES
from random import randint


flag = b"flag{test_flag}"

pad = lambda x: x+b'\x00'*(16-len(x)%16)

def encrypt(KEY):
cipher= AES.new(KEY,AES.MODE_ECB)
encrypted =cipher.encrypt(flag)
return encrypted
def decrypt(KEY):
cipher= AES.new(KEY,AES.MODE_ECB)
decrypted =cipher.decrypt(enc)
return decrypted

flag = pad(flag)
x = randint(10 ** 7, 10 ** 8)
y = randint(10 ** 7, 10 ** 8)
n = getPrime(28)
z = pow(y, x, n)

enc = encrypt(pad(l2b(x)))
print(f'enc = {b2l(enc)}')
print(f'y = {y}')
print(f'n = {n}')
print(f'z = {z}')

'''
enc = 33416570913716503492297352041317858420349510954381249751537743898024527101872454706181188441210166165803904185550746
y = 82941012
n = 228338567
z = 51306718
'''

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
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
from Crypto.Util.number import long_to_bytes as l2b, bytes_to_long as b2l
from Crypto.Cipher import AES
from math import ceil, sqrt

# Given data
enc_int = 33416570913716503492297352041317858420349510954381249751537743898024527101872454706181188441210166165803904185550746
y_val = 82941012
n_val = 228338567
z_val = 51306718

# Define pad function
pad = lambda x: x + b'\x00' * (16 - len(x) % 16)

# BSGS algorithm to find x in [a, b]
def bsgs(y, z, n, a, b):
m = int(ceil(sqrt(b - a)))
# Precompute baby steps
baby_steps = {}
base = pow(y, a, n) # y^a mod n

current = base
for j in range(m):
# Compute temp = y^(a+j) mod n
temp = current
inv_temp = pow(temp, n-2, n) # Fermat's little theorem for modular inverse
value = (z * inv_temp) % n
# Store value with j
if value not in baby_steps:
baby_steps[value] = []
baby_steps[value].append(j)
# Update current for next j: multiply by y
current = (current * y) % n

# Precompute giant steps base: y^m mod n
y_m = pow(y, m, n)
current = 1 # will be y^(i*m) mod n

# Search through giant steps
for i in range(0, (b - a) // m + 2):
if current in baby_steps:
for j in baby_steps[current]:
x_candidate = a + i * m + j
if a <= x_candidate <= b:
return x_candidate
# Update current for next i: multiply by y_m
current = (current * y_m) % n
return None

# Find x using BSGS
a_low = 10**7
a_high = 10**8
x = bsgs(y_val, z_val, n_val, a_low, a_high)
print(f"Recovered x = {x}")

# Generate AES key from x
key = pad(l2b(x)) # Pad to 16 bytes
print(f"AES Key = {key}")

# Convert enc_int to bytes
enc_bytes = l2b(enc_int)
print(f"Encrypted text length = {len(enc_bytes)} bytes")

# Decrypt using AES-ECB
cipher = AES.new(key, AES.MODE_ECB)
flag_bytes = cipher.decrypt(enc_bytes)

# Remove trailing zeros (padding)
flag = flag_bytes.rstrip(b'\x00')
print(f"Flag = {flag.decode()}")

运行得到

最后flag为

1
BaseCTF{BF3DCONZ-67FE-ENZU-385S-CSNI13B2}

没有n啊

题目描述:

1
你真的了解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
from Crypto.Util.number import *
import gmpy2

flag=b'BaseCTF{}'
m=bytes_to_long(flag)

p=getPrime(512)
q=getPrime(512)

n=p*q
e=65537

phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)

c=pow(m,e,n)
x=pow(n,e,c)
print("c =",c)
print("e =",e)
print("d =",d)
print("x =",x)
'''
c = 52453423663797600504896811946820841317615798875871627840172711423749946998217916744135290476795328543876098295227017753117609268701786914053599060330837226980969490439739651088710549890669593587642238827462108900683237797139569260570711611781514337884756698142193277516649805710242748531658979160170193283558
e = 65537
d = 54297831548863701092644190086258072883163378307246681513317422545902442650340916001357605211715836911877651782099787873046987096258918495734824011752504203578982947618784736181975847356304742402103468329660346526185908618978851982007496096394151821403282347897417590596861323293706611997134962231129075032641
x = 40635864473997460751766935373772107585133301579524000836637683731949939348171187931595274511243052505604832873086269554842194695737052043633079044688826020656068356561856848814530947955429343483847291398607359454851926470168457852479044154798114087493843073091985855839008222762224952503563764527380033064437
'''

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from Crypto.Util.number import long_to_bytes
from gmpy2 import invert
11015260047934780052747294376733821095287179138785591145017290559502196403082643165843965160935284779466935313070299057142775556894470097468695819752254792507921123107002935788077406049952740095685723668194899869965191737455279007950292408390923302696060771579231969440445447866191691818829900264135305035739551749
c = 52453423663797600504896811946820841317615798875871627840172711423749946998217916744135290476795328543876098295227017753117609268701786914053599060330837226980969490439739651088710549890669593587642238827462108900683237797139569260570711611781514337884756698142193277516649805710242748531658979160170193283558
e = 65537
d = 54297831548863701092644190086258072883163378307246681513317422545902442650340916001357605211715836911877651782099787873046987096258918495734824011752504203578982947618784736181975847356304742402103468329660346526185908618978851982007496096394151821403282347897417590596861323293706611997134962231129075032641
x = 40635864473997460751766935373772107585133301579524000836637683731949939348171187931595274511243052505604832873086269554842194695737052043633079044688826020656068356561856848814530947955429343483847291398607359454851926470168457852479044154798114087493843073091985855839008222762224952503563764527380033064437

c_list = [2 , 3 , 73 , 3967 , 6373 , 95592293 , 216465863 , 4744823012787277141 ,48245998253859255581546561942142167304434549996919484957120717763726325509833409296170471619434291990255044694414983821250538266717293535917534918221352198192885071310932646412147737114561229291373456448363184353049796801297876664512630305475226391199481032049429] #先去 factordb.com 分解c,从而计算c的phi
c_phi = 1
for i in range(len(c_list)):
c_phi *= c_list[i] - 1
d_c = invert(e, c_phi)
n = int(pow(x, d_c, c)+c)
print(n)
print("n=",n)
print(x==pow(n,e,c))

m = pow(c, d, n)
print(m==608975871998468334256789566495307620134871095774360271136884525677002770227977521307197556863857539091282045)
flag = long_to_bytes(int(m))
print(flag)

运行得到

最后flag为

1
BaseCTF{2eefa8ef-ba57-4bed-9230-d280ac2273d8}

exgcd

题目描述:

1
你们想要的题咩。

附件

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
from Crypto.Util.number import *

flag=b'BaseCTF{}'
m=bytes_to_long(flag)

p=getPrime(1024)
q=getPrime(1024)

n=p*q
e1=3747
e2=2991

c1=pow(m,e1,n)
c2=pow(m,e2,n)

print("n =",n)
print("e1 =",e1)
print("e2 =",e2)
print("c1 =",c1)
print("c2 =",c2)

"""
n = 27855350163093443890983002241607629119744539643165776358993469078731521668677421483556132628708836721737685936980427467856642738196111748018522018598646125626995613169001111504706363742194664774823604738939411512861441742683157275818500991834651769368178320088982759626122029956515159435424882855075032400667120376075618896752694718491438251810609878021717559466498493103257912108879328270813061231904227056671621363669388496383136964549879459562004569059185078204867346250733489663015417879915436157806942021693920206071715538430633494012923651469196048546309592946901609803631751035364478773126967010589504275776307
e1 = 3747
e2 = 2991
c1 = 24426579024062518665031958216110619832653602343205488454298659533869220501923184793828421371206493659949730138867555889074137026401207985428160803910695088081370233571905915349589146504374710444468715701305061060934519410886010929009297226496448218819742287990364436349188987723637449590579092391100714056589967894609950537021838172987840638735592599678186555961654312442380755963257875487240962193060914793587712733601168204859917001269928487633954556221987632934190217367502677285906521385169669644977192556145782303526375491484736352799180747403161343130663661867413380222714012960607473395828938694285120527085083
c2 = 6932145147126610816836065944280934160173362059462927112752295077225965836502881335565881607385328990881865436690904056577675885697508058289570333933837515526915707121125766720407153139160751343352211421901876051228566093038929625042619250168565502734932197817082848506826847112949495527533238122893297049985517280574646627011986403578166952789317461581409161873814203023736604394085875778774834314777046086921852377348590998381648241629124408514875110073073851913857329679268519229436092660959841766848676678740851087184214283196544821779336090434587905158006710112461778939184327386306992082433561460542130441825293
"""

exp:

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

n = 27855350163093443890983002241607629119744539643165776358993469078731521668677421483556132628708836721737685936980427467856642738196111748018522018598646125626995613169001111504706363742194664774823604738939411512861441742683157275818500991834651769368178320088982759626122029956515159435424882855075032400667120376075618896752694718491438251810609878021717559466498493103257912108879328270813061231904227056671621363669388496383136964549879459562004569059185078204867346250733489663015417879915436157806942021693920206071715538430633494012923651469196048546309592946901609803631751035364478773126967010589504275776307
e1 = 3747
e2 = 2991
c1 = 24426579024062518665031958216110619832653602343205488454298659533869220501923184793828421371206493659949730138867555889074137026401207985428160803910695088081370233571905915349589146504374710444468715701305061060934519410886010929009297226496448218819742287990364436349188987723637449590579092391100714056589967894609950537021838172987840638735592599678186555961654312442380755963257875487240962193060914793587712733601168204859917001269928487633954556221987632934190217367502677285906521385169669644977192556145782303526375491484736352799180747403161343130663661867413380222714012960607473395828938694285120527085083
c2 = 6932145147126610816836065944280934160173362059462927112752295077225965836502881335565881607385328990881865436690904056577675885697508058289570333933837515526915707121125766720407153139160751343352211421901876051228566093038929625042619250168565502734932197817082848506826847112949495527533238122893297049985517280574646627011986403578166952789317461581409161873814203023736604394085875778774834314777046086921852377348590998381648241629124408514875110073073851913857329679268519229436092660959841766848676678740851087184214283196544821779336090434587905158006710112461778939184327386306992082433561460542130441825293

# 计算扩展欧几里得
s, s1, s2 = gcdext(e1, e2)

# 计算 m^3 mod n
m3 = (pow(c1, s1, n) * pow(c2, s2, n)) % n

# 对 m3 开立方根
m = iroot(m3, s)[0]

# 转换为字节串
flag = long_to_bytes(m)
print(flag)

运行得到

最后flag为

1
BaseCTF{feb7e1ae-a8f7-4fc4-8d6d-945a45cc3f6d}

wiener?

附件

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 Crypto.Util.number import *
import decimal
flag=b"BaseCTF{}"
m = bytes_to_long(flag)


p = getPrime(1024)
q = getPrime(1024)
n=p*q

e=65537
c=pow(m,e,n)

print("e =",e)
print("c =",c)

decimal.getcontext().prec = 648
P=decimal.Decimal(p)
Q=decimal.Decimal(q)
leak=decimal.Decimal((3*P*Q-1)/(3*Q*Q))
print("leak =",leak)

"""
e = 65537
c = 11032748573623426359632659657114807044712138586316710250985606809252700461490504487308849626514319062562557448839550994242999334882617031487618174168038491566640081840111747765753878087564318833273878755416584962921669911444225959335274753391800995531023212276838665202257007640354237043291129197348884914956663597240094662207929658519596987351984403258345205873566463643624175318315064440456858013874962784792564480286904620663695194689839431808082976248378509181327101557380978849545906691903896662095520288964101796965095129861467059775556110616007889846240936219381379219605528051627402300580239311202137582442057
leak = 0.829374344780877053838760251345359097311540811993463349625630085472892814959843248358036249898871908548743719153319438638517170060651237635838827482534816419091949205584951292517303330452910012749674475329235689229498752425379611083979518257734473992186831474208400813283887045691145481237726578827559198828469462343342343287720369159899636816373592067698883361360269728719786071024354151682314608072902347335691012713629816579496252896260869382806838857194293618332286500427694077400072428506897829689703872985954772105672992293334668485358785863779749153981721900135318166811250762946069962348114491411585418993494561587403918162681937152503739843
"""

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
from Crypto.Util.number import *
import gmpy2
from gmpy2 import is_prime

e = 65537
c = 11032748573623426359632659657114807044712138586316710250985606809252700461490504487308849626514319062562557448839550994242999334882617031487618174168038491566640081840111747765753878087564318833273878755416584962921669911444225959335274753391800995531023212276838665202257007640354237043291129197348884914956663597240094662207929658519596987351984403258345205873566463643624175318315064440456858013874962784792564480286904620663695194689839431808082976248378509181327101557380978849545906691903896662095520288964101796965095129861467059775556110616007889846240936219381379219605528051627402300580239311202137582442057
leak = 0.829374344780877053838760251345359097311540811993463349625630085472892814959843248358036249898871908548743719153319438638517170060651237635838827482534816419091949205584951292517303330452910012749674475329235689229498752425379611083979518257734473992186831474208400813283887045691145481237726578827559198828469462343342343287720369159899636816373592067698883361360269728719786071024354151682314608072902347335691012713629816579496252896260869382806838857194293618332286500427694077400072428506897829689703872985954772105672992293334668485358785863779749153981721900135318166811250762946069962348114491411585418993494561587403918162681937152503739843

# 计算连分数收敛项
cf = continued_fraction(leak)
convers = cf.convergents()

for pkd in convers:
# 获取分子和分母
pp, pq = pkd.as_integer_ratio()
pp = int(pp)

# 检查是否为1024位素数
if pp.bit_length() == 1024 and is_prime(pp):
try:
# 计算解密指数
d = inverse(e, pp-1)
# 解密消息
m = pow(c, d, pp)
flag = long_to_bytes(m)

# 验证flag格式
if b'BaseCTF{' in flag:
print(flag)
break
except:
# 处理可能的错误(如逆元不存在)
continue

运行得到

最后flag为

1
BaseCTF{9431ee53-5d5c-4b0b-956f-1eafff6c9e87}

没有n啊 _pro

题目描述:

1
ps:可能需要点脑洞

附件

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

flag=b'BaseCTF{}'
m=bytes_to_long(flag)
p=getPrime(128)
q=getPrime(128)

n=p*q
e=65537

phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)

assert d<phi

c=pow(m,e,n)
print("c =",c)
print("e =",e)
print("d =",d)

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from Crypto.Util.number import *
import itertools
c = 78919950899709764543039048006935881842075789773495004639436106636461009323420
e = 65537
d = 13002488326322253055272696035053386340217207134816593767440035447757509399233
p_bits=128
q_bits=128
def get_phi(e, d):
k_phi = e*d -1
result = []
for k in range(e,2,-1):
if k_phi % k == 0:
tmp = k_phi // k
if int(tmp).bit_length()==p_bits+q_bits:
result.append(tmp)
return result
def main():
phi_list = get_phi(e,d) #获得可能的phi_n列表
count = len(phi_list)
print(f'一共有{count}个可能的phi')
count = 0
for phi in phi_list:
count += 1
print(f'{count} 正在尝试爆破 {phi}')
factors = factor(phi) # 分解phi_n得到质因子列表
result = []
for i in factors:
num, times = int(i[0]), i[1]
result += [num] * times

if len(factors)>1:
s = set()
for r in range(1, len(result) + 1):
combination = list(itertools.combinations(result, r))
for i in combination:
s.add(i)
ans=[]
for i in s:
tmp=1
for j in i:
tmp=tmp*j
ans.append(tmp)
for num in ans:
if int(num+1).bit_length()==p_bits and is_prime(num+1):
p = num+1
q = phi // num + 1
if is_prime(q):
n = p * q
flag=long_to_bytes(int(pow(c,d,n)))
if b'BaseCTF' in flag:
print(flag)
return


if __name__ == '__main__':
main()
#b'BaseCTF{3e226a94-babb27696416}'

运行得到

最后flag为

1
BaseCTF{3e226a94-babb27696416}

hard_math

题目描述:

1
2
3
你可以很轻松获得一部分, 但只有一部分......

很简单的代数知识

附件

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
import numpy as np
from sage.all import *
from Crypto.Util.number import *

a, b, c = [getPrime(128) for _ in range(3)]
d, e, f, h, i, j = [getPrime(512) for _ in range(6)]
k, l, m = [getPrime(16) for _ in range(3)]

flag = b"flag{test_flag}"
n = len(flag) // 3
flag1 = bytes_to_long(flag[0:n])
flag2 = bytes_to_long(flag[n:2 * n])
flag3 = bytes_to_long(flag[2 * n:3 * n])
mat_flag = matrix([flag1, flag2, flag3])

def randomArray():
upper = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
low = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
for i in range(3):
for j in range(i+1, 3):
upper[i][j] = getPrime(512)
low[j][i] = getPrime(512)
result = np.array(upper) @ np.array(low)
return result

def m2l(data):
data = str(list(data)).replace(')',']').replace('(','[')
return data

U = matrix(randomArray())

V = matrix(
[
[a, b, c],
[d, e, f],
[h, i, j]
]
)

hint = matrix(
[
[a, 0, 0],
[d, e, 0],
[h, i, j]
]
)

W = U * V
r = matrix([k, l, m])

m = mat_flag * W + r

print(f'm = {m2l(m)}')
print(f'W = {m2l(W)}')
print(f'hint = {m2l(hint)}')

'''
m = [[515006066572991495094024845507453270170679530115722665716310857090383589987192995300820709326539907598036228187098433712764150545713781753928519780987397892019149396848734270629944247423448792576409939690690172467014798009304748201014701433638914639516136791514943818115581841161140822534657373450411916010383872732592192428514885246957165021151091735415512934159556555795946329029885077848428522565951230170422871166025743271004222458910631903580841388720000991656351499297814283656311006619217557, 493376106730590001882623910015696056521634040769204676097683956342407441946394989269289586462834183861958955979569597323143336033364245602994690452975858606246399021815786952339420761036368842534214572793543597526440971054273983326810410557306121368806745656400301215422355097611632518232563203326662080440857128552584680151063471311246027207795633032412326671372295196912352244705460776745840724990330443310670290805805114851081572848158034185286087423873359219385001802862944316920564177120955175, 575595002745228725017587011229401876567667455244528775277629732860064977911268125609189310020405051622085511289521885274600136190154096572813688714712133062373574937656504877555714680953922288909295838812970976406997779107157755042843766890628178252727891534572782306820699889220503146129501975505498358015202877369653016071954056645819683541482989501884449536172692222955049657627314349743452274317472117170325014443435968767431351069364374662221187031602748415650312412433222057689003403908801913]]
W = [[838243669569772365825528069088793455362253801517360278602593303745699429137215594576991203071727187689167097915523807181069815074124001330605476179062587774586413099179825273026676486841213151585743972214797692786366689785491273081413668402037800457578015835799910062278548422607854946333715446327802896293029377534443735084744391631685250614642775247173445704258033114931031666306649949263186126055241139290905429794696028384343749984236719592960909032270495356, 803037915525763017813052134194087092503024850450778985110871642829830991012170830783900056324370267494800927024749373592744933154087905523794957583458320772762393022274754812539413304654338911861881703406551975827547157103926858618050322166669434180444100312398454530810141984367238536123028456943329443614154050974619461000072847460724967548375623320227093428700111757757638270165456251865510363753235078534130529338200958418407734698270157192357964274092960160, 936860550979161859763944379815022616668684890898857549853283234781148589264637570580765176526871677402372007461081732898697312885010695317454774616907341062321919789905918536590631377401204453037238548216648108039082749895680446221612769807718147337667121814420180597640654236164929573894976873797106386019676593508260795149809742272019006821924426056135904099903987553221898726778429309630193632524365812002539064510798904913798165805952369467097166655052324662], [903827515929770485045352583923655902326985198425839313304983595578754651977406515523417091164606505992344067878304810153443237319663912774096105876828088267351880185653549590057499840375845602572585406606843113691398586082599896034026753671311127281701066533882077608584967968707777937945824307588234847645532828872891999612833211248100809726023940327229679170954992117211762654040526677026676750258569210085085849650693677075476712776614907076983085506292744593, 865867277899743984439472212248353523489475207105436612467388414274420933395815480684569358513658899128263451705767460689322324871155098437383762120083505456143481204507833625398191810324011750457183760477995450683492183216742470659735972303328300805612595535471688829946545404613937343154546265892485079288647073301566428063885748080397335579940733133160982445771626323095205883638294011960474082043462070600709609945253876118567904739848764175027352015971149441, 1010160142335093061390073894563508864471566280278502420921989223687002198547569470869775259447268733595903657260678484653049020541253485677709836243404433947659892982318145912957083642845032140875108225542486758247838327077646951588304929682753162881261192381472575935615608383217184248495268384377517552833159650113564246358248703626825695080546545844771964065265076038887828360524279438416928547216942293462621132698205097190096991916709625976826523765493530001], [78212249173117191675170269491819725722517802312978337273804090104803606178852022644248470195807846920777359458397572673319629877881485882414961268159575924654736302449378271858232975357320988498416055914130853390645176331442047110403763360174417255005631946157490069743178573263637578884793651847627029051991, 74927379501472932120680494090445315819870183792818898309591485925627415024697485507641733597293876698532213631345314279208289123258824769689285644220202046304564375857497101372953510739020984815291833079840818219941112397714761814022393125005379756778275950629416624821974542971342867918912677411141124552457, 87413688302893898473393354361135831954484558329329084401662857815823746202157926477994765338832304531581829735643758883274071789530966177809582992054303282158857862400265977801285276497220755870408421869590049299225416536929009300912398960151372766988582409763009295034261252377005456165370870094539411150067]]
hint = [[246113081383159550742301389040370789477, 0, 0], [11152329977565784221225693789680814642651917976425031602984186773217921601713987960438433946931386627886062324958107378857734386881263658081884765704688257, 10683938505657230179810827249056252019273456770047066582472908450838551957854054329645676204226277615006027375173781179496005220534722980666830108442748411, 0], [12909086249033493657373140400755388103713119422025290702729934460438874573189113819222211003617053854285976236233309899368081087581903742593207861442650517, 9187258103530841595225948803092366126509314603068288593845050883756605942036676873402194862960350885965541685057956650837894582552315218590371164516643577, 7601247345297763187625384319296811132204071832415909380474604204622868879647397909637085901563946695955258577131871160032821007989191447784910345738795389]]
'''

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import numpy as np
from sage.all import *
from Crypto.Util.number import *
from re import sub

m = [515006066572991495094024845507453270170679530115722665716310857090383589987192995300820709326539907598036228187098433712764150545713781753928519780987397892019149396848734270629944247423448792576409939690690172467014798009304748201014701433638914639516136791514943818115581841161140822534657373450411916010383872732592192428514885246957165021151091735415512934159556555795946329029885077848428522565951230170422871166025743271004222458910631903580841388720000991656351499297814283656311006619217557, 493376106730590001882623910015696056521634040769204676097683956342407441946394989269289586462834183861958955979569597323143336033364245602994690452975858606246399021815786952339420761036368842534214572793543597526440971054273983326810410557306121368806745656400301215422355097611632518232563203326662080440857128552584680151063471311246027207795633032412326671372295196912352244705460776745840724990330443310670290805805114851081572848158034185286087423873359219385001802862944316920564177120955175, 575595002745228725017587011229401876567667455244528775277629732860064977911268125609189310020405051622085511289521885274600136190154096572813688714712133062373574937656504877555714680953922288909295838812970976406997779107157755042843766890628178252727891534572782306820699889220503146129501975505498358015202877369653016071954056645819683541482989501884449536172692222955049657627314349743452274317472117170325014443435968767431351069364374662221187031602748415650312412433222057689003403908801913]
W = [[838243669569772365825528069088793455362253801517360278602593303745699429137215594576991203071727187689167097915523807181069815074124001330605476179062587774586413099179825273026676486841213151585743972214797692786366689785491273081413668402037800457578015835799910062278548422607854946333715446327802896293029377534443735084744391631685250614642775247173445704258033114931031666306649949263186126055241139290905429794696028384343749984236719592960909032270495356, 803037915525763017813052134194087092503024850450778985110871642829830991012170830783900056324370267494800927024749373592744933154087905523794957583458320772762393022274754812539413304654338911861881703406551975827547157103926858618050322166669434180444100312398454530810141984367238536123028456943329443614154050974619461000072847460724967548375623320227093428700111757757638270165456251865510363753235078534130529338200958418407734698270157192357964274092960160, 936860550979161859763944379815022616668684890898857549853283234781148589264637570580765176526871677402372007461081732898697312885010695317454774616907341062321919789905918536590631377401204453037238548216648108039082749895680446221612769807718147337667121814420180597640654236164929573894976873797106386019676593508260795149809742272019006821924426056135904099903987553221898726778429309630193632524365812002539064510798904913798165805952369467097166655052324662], [903827515929770485045352583923655902326985198425839313304983595578754651977406515523417091164606505992344067878304810153443237319663912774096105876828088267351880185653549590057499840375845602572585406606843113691398586082599896034026753671311127281701066533882077608584967968707777937945824307588234847645532828872891999612833211248100809726023940327229679170954992117211762654040526677026676750258569210085085849650693677075476712776614907076983085506292744593, 865867277899743984439472212248353523489475207105436612467388414274420933395815480684569358513658899128263451705767460689322324871155098437383762120083505456143481204507833625398191810324011750457183760477995450683492183216742470659735972303328300805612595535471688829946545404613937343154546265892485079288647073301566428063885748080397335579940733133160982445771626323095205883638294011960474082043462070600709609945253876118567904739848764175027352015971149441, 1010160142335093061390073894563508864471566280278502420921989223687002198547569470869775259447268733595903657260678484653049020541253485677709836243404433947659892982318145912957083642845032140875108225542486758247838327077646951588304929682753162881261192381472575935615608383217184248495268384377517552833159650113564246358248703626825695080546545844771964065265076038887828360524279438416928547216942293462621132698205097190096991916709625976826523765493530001], [78212249173117191675170269491819725722517802312978337273804090104803606178852022644248470195807846920777359458397572673319629877881485882414961268159575924654736302449378271858232975357320988498416055914130853390645176331442047110403763360174417255005631946157490069743178573263637578884793651847627029051991, 74927379501472932120680494090445315819870183792818898309591485925627415024697485507641733597293876698532213631345314279208289123258824769689285644220202046304564375857497101372953510739020984815291833079840818219941112397714761814022393125005379756778275950629416624821974542971342867918912677411141124552457, 87413688302893898473393354361135831954484558329329084401662857815823746202157926477994765338832304531581829735643758883274071789530966177809582992054303282158857862400265977801285276497220755870408421869590049299225416536929009300912398960151372766988582409763009295034261252377005456165370870094539411150067]]
hint = [[246113081383159550742301389040370789477, 0, 0], [11152329977565784221225693789680814642651917976425031602984186773217921601713987960438433946931386627886062324958107378857734386881263658081884765704688257, 10683938505657230179810827249056252019273456770047066582472908450838551957854054329645676204226277615006027375173781179496005220534722980666830108442748411, 0], [12909086249033493657373140400755388103713119422025290702729934460438874573189113819222211003617053854285976236233309899368081087581903742593207861442650517, 9187258103530841595225948803092366126509314603068288593845050883756605942036676873402194862960350885965541685057956650837894582552315218590371164516643577, 7601247345297763187625384319296811132204071832415909380474604204622868879647397909637085901563946695955258577131871160032821007989191447784910345738795389]]

#a, b, c = [getPrime(128) for _ in range(3)]
#d, e, f, h, i, j = [getPrime(512) for _ in range(6)]
#k, l, m = [getPrime(16) for _ in range(3)]

flag = b"BaseCTF{A99C2980-9F32-5BDC-26E9-C0551E3997A8}"

def m2l(data):
data = str(list(data)).replace(')',']').replace('(','[')
return data

def red(data):
new = sub(' +', ' ',str(data)).replace('[','').replace(']','').split(' ')
a,b,c = new[-3:]
a,b,c = count(a), count(b), count(c)
return matrix([a,b,c])

def count(data):
if '/' in data:
a,b = data.split('/')
a,b = int(a), int(b)
if (a%b) >= (b//2):
new = (a // b) + 1
else:
new = a // b
else:
new = int(data)
return new

V = matrix(hint)
V[0] = matrix(W).LLL()[0]
V[1,2] = (abs(matrix(W).det()) - (
V[0,0]*V[1,1]*V[2,2] +
V[1,0]*V[2,1]*V[0,2]
) + (
V[2,0]*V[1,1]*V[0,2] +
V[0,1]*V[1,0]*V[2,2]
)) // (
V[0,1]*V[2,0] - V[0,0]*V[2,1]
)

W = matrix(W)
U = W * (V**(-1))
a = b''
new_flag = (red(matrix(m) * (V**(-1))) * (U**(-1)))[0]
a += long_to_bytes(int(new_flag[0]))
a += long_to_bytes(int(new_flag[1]))
a += long_to_bytes(int(new_flag[2]))
print(a)

运行得到

最后flag为

1
BaseCTF{A99C2980-9F32-5BDC-26E9-C0551E3997A8}

哎呀数据丢失了

附件

task.py

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 *
from Crypto.PublicKey import RSA

flag=b""
m=bytes_to_long(flag)

rsa=RSA.generate(1024)


c=pow(m,rsa.e,rsa.n)

with open("out",'wb') as f:
f.write(long_to_bytes(c))

private_key=rsa.exportKey("PEM")
with open("pri.pem",'wb') as f:
f.write(private_key)

pri.pem

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC9J4SEEirvmmnsZHKQIZ3tBu3St2EXIbMmhQsvUGDa7tdpQ1Zm
fEecqcy2lp9Pvm3H+mdZrKIdipaogajkoCF3MnV+ZJ1QMZFRH6ltpC7R2i+jvIyc
ZfvZwN1vQwNZrEXkVdMsWw6inSHmR/+A5Qq8u4D3attnAHoE6F2660yPHQIDAQAB
AoGAImXjVVkwca41AQYrR0a1v3r5GM68W0aHm8OqCwqk8mtoxP234p9LLpQ6ZCH0
Cr5onGtPDCG2wYSIbVBW9GyiaQhUDsB7gq1H5meXGgH6xhYuk6f8Ya7VZg+Cauuj
TXiszRj8WeeSFwHxD/UdUog3BrhkKHz9s04wnJOCnSnYZ8kCQQDG4J**********
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
-----END RSA PRIVATE KEY-----

还有个out文件是密文

exp:

1
2
3
4
5
6
7
8
9
10
11
12
from Crypto.Util.number import *
from gmpy2 import *


n=0x00bd278484122aef9a69ec647290219ded06edd2b7611721b326850b2f5060daeed7694356667c479ca9ccb6969f4fbe6dc7fa6759aca21d8a96a881a8e4a0217732757e649d503191511fa96da42ed1da2fa3bc8c9c65fbd9c0dd6f430359ac45e455d32c5b0ea29d21e647ff80e50abcbb80f76adb67007a04e85dbaeb4c8f1d
e=0x010001
d=0x2265e355593071ae3501062b4746b5bf7af918cebc5b46879bc3aa0b0aa4f26b68c4fdb7e29f4b2e943a6421f40abe689c6b4f0c21b6c184886d5056f46ca26908540ec07b82ad47e667971a01fac6162e93a7fc61aed5660f826aeba34d78accd18fc59e7921701f10ff51d52883706b864287cfdb34e309c93829d29d867c9

with open("D:\\tmp\\哎呀数据丢失了\\out",'rb') as f:
c=f.read()
m=bytes_to_long(c)
print(long_to_bytes(pow(m,d,n)))

运行得到

最后flag为

1
BaseCTF{57e6c35a-2768-49f9-8aca-47a3abcff1c7}

rabin

附件

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
from Crypto.Util.number import *


flag=b"BaseCTF{}"
m = bytes_to_long(flag)

p = getPrime(512)
q = getPrime(512)
assert p%4==3 and q%4==3
n = p*q
e = 4

c = pow(m,e,n)
print("p=",p)
print("q=",q)
print("n=",n)
print("c=",c)
print("e=",e)
"""
p= 8531212975719216550108614256955774722172741885676113601617182716356239301381951899737237219659253655889636684200345109462928796329670321336864298557778843
q= 7443256287912111739335729314443559886458007838130371799255078565502662459436043455787869631999073617967343884377537828940738213460508765519478956421282871
n= 63500004625039456439237191267891267558404574431112995926594213383621331385226487443753506088788203040258384788149958095020759745138424276657604371402824844725005596890673468964961037168078105356669148960568974603581485045691990626520286184874115519591663033533771400334558853058140717812903874350138362098253
c= 51452608438757130697131508192775727191605112918772187364577097224326062184288501602000700342623122861398852536963355962672293705131887315354242193416090384360837672258861475017098419459125395949090523474744886423754439919504732741712693909507972791203801494594878447921609420574365853676576693694677914169353
e= 4
"""

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 Crypto.Util.number import long_to_bytes

p = 8531212975719216550108614256955774722172741885676113601617182716356239301381951899737237219659253655889636684200345109462928796329670321336864298557778843
q = 7443256287912111739335729314443559886458007838130371799255078565502662459436043455787869631999073617967343884377537828940738213460508765519478956421282871
n = p * q
c = 51452608438757130697131508192775727191605112918772187364577097224326062184288501602000700342623122861398852536963355962672293705131887315354242193416090384360837672258861475017098419459125395949090523474744886423754439919504732741712693909507972791203801494594878447921609420574365853676576693694677914169353

def compute_roots(c, prime):
exp1 = (prime + 1) // 4
y = pow(c, exp1, prime)
root1 = pow(y, exp1, prime)
root2 = (-root1) % prime
return [root1, root2]

roots_p = compute_roots(c, p)
roots_q = compute_roots(c, q)

def crt(a, n):
total = 0
N = 1
for ni in n:
N *= ni
for ai, ni in zip(a, n):
Ni = N // ni
inv = pow(Ni, -1, ni)
total = (total + ai * Ni * inv) % N
return total

solutions = []
for rp in roots_p:
for rq in roots_q:
sol = crt([rp, rq], [p, q])
solutions.append(sol)
solutions.append(n - sol) # Consider negative solutions

flag = None
for sol in solutions:
candidate = long_to_bytes(sol)
if b'BaseCTF' in candidate:
flag = candidate
break

print(flag.decode())

运行得到

最后flag为

1
BaseCTF{01c28b9c-7924-4c04-b71d-1cca15342618}

extendmd5

题目描述:

1
听说你很懂md5

附件

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
from Crypto.Util.number import *
import hashlib
import socketserver
import signal
import os
import random
flag = os.getenv('GZCTF_FLAG')


class Task(socketserver.BaseRequestHandler):
def _recvall(self):
BUFF_SIZE = 2048
data = b''
while True:
part = self.request.recv(BUFF_SIZE)
data += part
if len(part) < BUFF_SIZE:
break
return data.strip()

def send(self, msg, newline=True):
try:
if newline:
msg += b'\n'
self.request.sendall(msg)
except:
pass

def recv(self):
return self._recvall()

def my_md5(self,text):
mymd5=hashlib.md5()
mymd5.update(text)
return mymd5.hexdigest()
def handle(self):
signal.alarm(30)

c=random.randint(1,64)
want=random.randbytes(c)
want_md5=self.my_md5(want)
self.send(want_md5.encode())

while True:
self.send(b"\nPlease input the secret:")
secret = self.recv()

final=want+secret
final_md5=self.my_md5(final)

self.send(b"\nPlease input your md5:")
your_md5=self.recv().decode()
if final_md5 == your_md5:
self.send(flag.encode())
break

self.send(b"\nConnection has been closed =.= ")
self.request.close()


class ThreadedServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass


class ForkedServer(socketserver.ForkingMixIn, socketserver.TCPServer):
pass


if name == "__main__":
HOST, PORT = '0.0.0.0', 9999
server = ForkedServer((HOST, PORT), Task)
server.allow_reuse_address = True
server.serve_forever()

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
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
from pwn import *

import struct
import math

# 定义MD5所需的常量
T = [int(4294967296 * abs(math.sin(i + 1))) & 0xFFFFFFFF for i in range(64)]


# 定义左旋转函数
def left_rotate(x, c):
return (x << c) | (x >> (32 - c))


# 定义MD5主循环所需的四个基本函数
def F(x, y, z):
return (x & y) | (~x & z)


def G(x, y, z):
return (x & z) | (y & ~z)


def H(x, y, z):
return x ^ y ^ z


def I(x, y, z):
return y ^ (x | ~z)


# 定义MD5算法
def my_md5(message, A, B, C, D, skip):
# 初始化变量
a, b, c, d = A, B, C, D

# 填充消息
original_length = len(message) * 8
message += b'\x80'
while (len(message) * 8) % 512 != 448:
message += b'\x00'
message += struct.pack('<Q', original_length)

# 处理每个512位(64字节)块
# 跳过前几个分组
for i in range(64 * skip, len(message), 64):
block = message[i:i + 64]
X = struct.unpack('<16I', block)

# 备份当前的a, b, c, d值
AA, BB, CC, DD = a, b, c, d
# 进行四轮操作,每轮16步
for i in range(64):
if 0 <= i <= 15:
k, s, func = i, [7, 12, 17, 22][i % 4], F(b, c, d)
elif 16 <= i <= 31:
k, s, func = (5 * i + 1) % 16, [5, 9, 14, 20][i % 4], G(b, c, d)
elif 32 <= i <= 47:
k, s, func = (3 * i + 5) % 16, [4, 11, 16, 23][i % 4], H(b, c, d)
elif 48 <= i <= 63:
k, s, func = (7 * i) % 16, [6, 10, 15, 21][i % 4], I(b, c, d)

temp = b + left_rotate((a + func + X[k] + T[i]) & 0xFFFFFFFF, s)
a, b, c, d = d, temp & 0xFFFFFFFF, b, c

# 将结果加到当前的a, b, c, d
a = (a + AA) & 0xFFFFFFFF
b = (b + BB) & 0xFFFFFFFF
c = (c + CC) & 0xFFFFFFFF
d = (d + DD) & 0xFFFFFFFF
# 返回哈希结果
return struct.pack('<4I', a, b, c, d).hex()


rem = remote("gz.imxbt.cn",20021 )

for _ in range(100):
want_md5 = rem.recv(32).decode() # 接收原始数据的md5

# 计算成iv
iv = []
for i in range(4):
tmp = ""
for j in range(4):
tmp += want_md5[(i + 1) * 8 - (j + 1) * 2:(i + 1) * 8 - j * 2]
iv.append(int(tmp, 16))

# 爆破长度
for i in range(32, 64):
rem.recvuntil(b"Please input the secret:")

# 填充消息
payload = b''
payload_length = i * 8
payload += b'\x80'
while ((i + len(payload)) * 8) % 512 != 448:
payload += b'\x00'
payload += struct.pack('<Q', payload_length)
payload += b'naby'

rem.sendline(payload)

# 计算填充数据后的有几个分组,需要跳过计算
skip = (i + len(payload) - 4) // 64
A, B, C, D = iv
message = b'a' * (64 * skip) + b'naby'
res = my_md5(message, A, B, C, D, skip)
rem.recvuntil(b"Please input your md5:")
rem.sendline(res.encode())
rem.recvline()
m = rem.recvline()
if b'correct' in m:
print(_, want_md5, i, m)
break

rem.interactive()

运行得到

猜猜看

题目描述:

1
ps:你可能在别的地方见过这个东西了

附件

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
from Crypto.Util.number import *
import socketserver
import numpy as np
import random
import ast
import os
flag = os.getenv('GZCTF_FLAG').encode()
class Task(socketserver.BaseRequestHandler):
def _recvall(self):
BUFF_SIZE = 2048
data = b''
while True:
part = self.request.recv(BUFF_SIZE)
data += part
if len(part) < BUFF_SIZE:
break
return data.strip()

def send(self, msg, newline=True):
try:
if newline:
msg += b'\n'
self.request.sendall(msg)
except:
pass

def recv(self):
return self._recvall()

def handle(self):
assert len(flag)==45
self.send(b"hello.")

m=bytes_to_long(flag)
m=bin(m)[2:]

length=len(m)

x=np.array([int(i) for i in m])
T=np.array([[random.getrandbits(1) for _ in range(length)] for __ in range(length)])

y=np.dot(x,T)
self.send(str(list(y)).encode())

while True:
user_input=ast.literal_eval(self.recv().strip().decode('utf-8'))
if isinstance(user_input,list):
try:
mat=np.array(user_input)
res=list(np.dot(mat,T))
self.send(str(res).encode())
except:
self.send(b'wrong!!')
else:
self.send(b'wrong!')
break


self.send(b"\nConnection has been closed =.= ")
self.request.close()


class ThreadedServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass


class ForkedServer(socketserver.ForkingMixIn, socketserver.TCPServer):
pass


if __name__ == "__main__":
HOST, PORT = '0.0.0.0', 9999
server = ForkedServer((HOST, PORT), Task)
server.allow_reuse_address = True
server.serve_forever()

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
import numpy as np
from Crypto.Util.number import *
from pwn import *
p=remote("gz.imxbt.cn",20031)
p.recvline()
flag=eval(p.recvline())
length=45*8-1
T=[]
for i in range(length):
x=[0]*i+[1]+[0]*(length-1-i)
p.sendline(str(x).encode())
T.append(eval(p.recvline()))
T=np.array(T)
t_ni=np.linalg.inv(T)

m=np.dot(flag,t_ni)
m=np.round(m)
flag=""
for i in m:
if i==1:
flag+='1'
else:
flag+='0'
print(long_to_bytes(int(flag,2)))

p.interactive()

运行得到

最后flag为

1
BaseCTF{e5e31f21-416a-44ea-b507-ae0d025eb3ee}

ECB是不安全的

源码

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
from Crypto.Util.number import *
from Crypto.Util.Padding import *
from Crypto.Cipher import AES
import socketserver
import os
import base64
flag = os.getenv('GZCTF_FLAG').encode()
class Task(socketserver.BaseRequestHandler):
def _recvall(self):
BUFF_SIZE = 2048
data = b''
while True:
part = self.request.recv(BUFF_SIZE)
data += part
if len(part) < BUFF_SIZE:
break
return data.strip()

def send(self, msg, newline=True):
try:
if newline:
msg += b'\n'
self.request.sendall(msg)
except:
pass

def recv(self):
return self._recvall()

def handle(self):

self.send(b"the server will connect you entered to the front of flag.")
self.send(b"then you will receive ciphertext(b64encode) encrypted by AES-ECB.")

key=os.urandom(16)
my_aes=AES.new(key=key,mode=AES.MODE_ECB)
self.send(base64.b64encode(my_aes.encrypt(pad(flag,AES.block_size))))

while True:
self.send(b':')
cin=self.recv()
final=cin+flag
self.send(base64.b64encode(my_aes.encrypt(pad(final,AES.block_size))))


self.send(b"\nConnection has been closed =.= ")
self.request.close()


class ThreadedServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass


class ForkedServer(socketserver.ForkingMixIn, socketserver.TCPServer):
pass


if __name__ == "__main__":
HOST, PORT = '0.0.0.0', 9999
server = ForkedServer((HOST, PORT), Task)
server.allow_reuse_address = True
server.serve_forever()

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
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
from pwn import *
from Crypto.Util.number import *
import base64
p=remote("gz.imxbt.cn",20033)

print(p.recvline())
print(p.recvline())

c=p.recvline()[:-1]
c=base64.b64decode(c)

length1=0
for i in range(16):
p.recvline() # b":\n"
payload=b'a'*i
p.sendline(payload)
d=p.recvline()[:-1]
d=base64.b64decode(d)
if len(d)!=len(c):
length1=i
break
length_flag=len(c)-length1
print(length_flag)

# 从前往后爆破flag
payload_length=len(c)+16 # 多一个分组保容错
flag=b''
for i in range(payload_length-1,payload_length-1-length_flag,-1):
p.recvline() # b":\n"
payload=b'a'*i
p.sendline(payload)
d=p.recvline()[:-1]
d=base64.b64decode(d)
for j in range(33,128):
p.recvline() # b":\n"
payload1=b'a'*i+flag+chr(j).encode()
p.sendline(payload1)
e=p.recvline()[:-1]
e=base64.b64decode(e)
e=e[payload_length-16:payload_length]
if e in d:
flag+=chr(j).encode()
break
print(flag)

"""# 从后往前爆破flag(此方法需要知道填充模式)
from Crypto.Util.Padding import pad
from Crypto.Cipher import AES

# 在前面填充到满足AES加密的分组长度
dic='{}-BCTF0123456789abcdef'
flag=b''
for i in range(length_flag):
p.recvline() # b":\n"
server_payload=b'a'*(length1+i+1)
p.sendline(server_payload)
server_flag=p.recvline()[:-1]
server_flag=base64.b64decode(server_flag)

for j in dic:
p.recvline() # b":\n"
my_payload=j.encode()+flag
my_payload=pad(my_payload,AES.block_size)
my_payload=my_payload+b'a' # 我也不知道这里为什么要多加一个字节,当i=2时不加这个字节就会出错
p.sendline(my_payload)
my_flag=p.recvline()[:-1]
my_flag=base64.b64decode(my_flag)
my_flag=my_flag[:16]

if my_flag in server_flag:
flag=j.encode()+flag

break
print(flag)"""

p.interactive()

运行得到

最后flag为

1
BaseCTF{7bab7d14-f558-4a7b-a26c-a0140fb117de}

の歪来

题目描述:

1
怎么办?怎么办?

附件

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

flag=b''
assert len(flag)==28
m=bytes_to_long(flag)

n=getPrime(2048)
e=32

c=pow(m,e,n)


print("n =",n)
print("e =",e)
print("c =",c)


#
flag = b'BaseCTF{}'
n = 17363249226879909675667629533972233798566313669420563155296918020175446973456428454735263489044575257132690882883587342817653451483222705760704890265900885255972067349104579938808591608382992680533327518070878297438339884996059309549300942570104747348751766711833983705979880714174709047335147739991850385244159235504375559144283494800573079055547597410783559965162216203307100248001158445665271438067670522510991047688414176659907164436539491205637933681658814267567385232097679554282863595183422504494357205180093828786415060565003183966959273253039416986816444073158723191290806413175478175738266995214965220231649
e = 32
c = 6840453756562205147103219479843999687625029691496635689045074720240615321966887831642035124198445485320265097191334720798522097422084141332044111764558336174743819347952914775206809737198058220362381349481027893609144697054465070779290329222696236671374412706789862193871687821041053566873553189148668599841084370137084893575567622972476409755187388121177923217208552049876944055745912987536390075417261016809335539362984984190264791744790640858201038207982043569204062714722892105134794280417020318408200038144689432974312283915592134911446185412636709207566063730723406969727969141426530341540330398465744403597273

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
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
from Crypto.Util.number import *
from gmpy2 import *
import random
import math


p = 17363249226879909675667629533972233798566313669420563155296918020175446973456428454735263489044575257132690882883587342817653451483222705760704890265900885255972067349104579938808591608382992680533327518070878297438339884996059309549300942570104747348751766711833983705979880714174709047335147739991850385244159235504375559144283494800573079055547597410783559965162216203307100248001158445665271438067670522510991047688414176659907164436539491205637933681658814267567385232097679554282863595183422504494357205180093828786415060565003183966959273253039416986816444073158723191290806413175478175738266995214965220231649
e = 32
c = 6840453756562205147103219479843999687625029691496635689045074720240615321966887831642035124198445485320265097191334720798522097422084141332044111764558336174743819347952914775206809737198058220362381349481027893609144697054465070779290329222696236671374412706789862193871687821041053566873553189148668599841084370137084893575567622972476409755187388121177923217208552049876944055745912987536390075417261016809335539362984984190264791744790640858201038207982043569204062714722892105134794280417020318408200038144689432974312283915592134911446185412636709207566063730723406969727969141426530341540330398465744403597273
def onemod(e, q):
p = random.randint(1, q-1)
while(powmod(p, (q-1)//e, q) == 1): # (r,s)=1
p = random.randint(1, q)
return p

def AMM_rth(o, r, q): # r|(q-1
assert((q-1) % r == 0)
p = onemod(r, q)

t = 0
s = q-1
while(s % r == 0):
s = s//r
t += 1
k = 1
while((s*k+1) % r != 0):
k += 1
alp = (s*k+1)//r

a = powmod(p, r**(t-1)*s, q)
b = powmod(o, r*a-1, q)
c = powmod(p, s, q)
h = 1

for i in range(1, t-1):
d = powmod(int(b), r**(t-1-i), q)
if d == 1:
j = 0
else:
j = (-math.log(d, a)) % r
b = (b*(c**(r*j))) % q
h = (h*c**j) % q
c = (c*r) % q
result = (powmod(o, alp, q)*h)
return result

def ALL_Solution(m, q, rt, cq, e):
mp = []
for pr in rt:
r = (pr*m) % q
# assert(pow(r, e, q) == cq)
mp.append(r)
return mp


def calc(mp, mq, e, p, q):
i = 1
j = 1
t1 = invert(q, p)
t2 = invert(p, q)
for mp1 in mp:
for mq1 in mq:
j += 1
if j % 100000 == 0:
print(j)
ans = (mp1*t1*q+mq1*t2*p) % (p*q)
if check(ans):
return
return


def check(m):
try:
a = long_to_bytes(m)
if b'NSSCTF' in a:
print(a)
return True
else:
return False
except:
return False


def ALL_ROOT2(r, q): # use function set() and .add() ensure that the generated elements are not repeated
li = set()
while(len(li) < r):
p = powmod(random.randint(1, q-1), (q-1)//r, q)
li.add(p)
return li

cp = c % p

mp = AMM_rth(cp, e, p)

rt1 = ALL_ROOT2(e, p)
amp = ALL_Solution(mp, p, rt1, cp, e)

for i in amp:
m=long_to_bytes(i)
if b'BaseCTF' in m:
print(m)
break

运行得到

最后flag为

1
BaseCTF{e_d0u_hu1_4_w@i_lal}

老涩批了

题目描述:

1
如果实在不会,不妨去看看ctfwiki

附件

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
from Crypto.Util.number import *
import socketserver
import os
import uuid
flag = os.getenv('GZCTF_FLAG').encode()

class Task(socketserver.BaseRequestHandler):
def _recvall(self):
BUFF_SIZE = 2048
data = b''
while True:
part = self.request.recv(BUFF_SIZE)
data += part
if len(part) < BUFF_SIZE:
break
return data.strip()

def send(self, msg, newline=True):
try:
if newline:
msg += b'\n'
self.request.sendall(msg)
except:
pass

def recv(self):
return self._recvall()

def handle(self):

p=getPrime(256)
q=getPrime(256)
n=p*q
e=65537
d=inverse(e,(p-1)*(q-1))

text=b'BaseCTF{'+str(uuid.uuid4()).encode()+b'}'

m1=bytes_to_long(text[:len(text)//2])
c1=pow(m1,e,n)

m2=bytes_to_long(text[len(text)//2:])
c2=pow(m2,e,n)

self.send(b'n = '+str(n).encode())
self.send(b'e = '+str(e).encode())
self.send(b'c1 = '+str(c1).encode())
self.send(b'c2 = '+str(c2).encode())

while True:
select=self.recv().strip()
if select==b'1':
c=int(self.recv().decode().strip())
m=pow(c,d,n)
res=m&1
elif select==b'2':
c=int(self.recv().decode().strip())
m=pow(c,d,n)
res=long_to_bytes(m,64)[0]
elif select==b'3':
user_text=self.recv().strip()
if user_text==text:
self.send(flag)
break
else:
self.send(b'try again')
break
else :
self.send(b'wrong')
break
self.send(str(res).encode())
self.send(b"\nConnection has been closed =.= ")
self.request.close()


class ThreadedServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass


class ForkedServer(socketserver.ForkingMixIn, socketserver.TCPServer):
pass


if __name__ == "__main__":
HOST, PORT = '0.0.0.0', 9999
server = ForkedServer((HOST, PORT), Task)
server.allow_reuse_address = True
server.serve_forever()

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
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
from Crypto.Util.number import *
import decimal
from pwn import *
from time import *
rem=remote("gz.imxbt.cn",20036)
rem.recvuntil(b'n = ')
n=int(rem.recvline().decode().strip())

rem.recvuntil(b'e = ')
e=int(rem.recvline().decode().strip())

rem.recvuntil(b'c1 = ')
c1=int(rem.recvline().decode().strip())

rem.recvuntil(b'c2 = ')
c2=int(rem.recvline().decode().strip())
def server_decode1(c):
rem.sendline(b'1')
sleep(0.01)
rem.sendline(str(c).encode())
rec=rem.recvline().strip()
return rec
kbits = n.bit_length()
decimal.getcontext().prec = kbits
L = decimal.Decimal(0)
R = decimal.Decimal(int(n))
for i in range(kbits):
c1 = (c1 * pow(2, e, n)) % n
recv = server_decode1(c1)
if recv == b'1':
L = (L + R) // 2
else:
R = (L + R) // 2
flag1=long_to_bytes(int((R)))
print(flag1)
sleep(0.01)
def server_decode2(c):
rem.sendline(b'2')
sleep(0.01)
rem.sendline(str(c).encode())
rec=rem.recvline().strip()
return rec
k=1
while True:
c22 = (c2 * pow(2, e*k, n)) % n
res=server_decode2(c22)
res=int(res)
if res&1:
break
k=k+1
L=2**(k-1)
R=2**k

while True:
if R-L==1:
break
x=(L+R)//2
c22 = (c2 * pow(x, e, n)) % n
res=server_decode2(c22)
res=int(res)
if res:
R=x
else :
L=x
flag2=(2**(kbits-8)//L)
print(long_to_bytes(flag2))
user_text=flag1[:-1]+b'-'+long_to_bytes(flag2)
print(user_text)
rem.sendline(b'3')
sleep(0.01)
rem.sendline(user_text)


rem.interactive()

运行得到

最后flag为

1
BaseCTF{bfd588ea-89e7-4631-8aa8-ac78eed1e03a}

PDP

题目描述:

1
2
3
其实不难?

https://people.eecs.berkeley.edu/~dawnsong/papers/p598-ateniese

附件

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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
from Crypto.Util.number import *
from gmpy2 import *
import hashlib
import hmac
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from random import *

def KeyGen():
while True:
pp=getPrime(512)
p=2*pp+1
while not isPrime(p):
pp=getPrime(512)
p=2*pp+1

qq=getPrime(512)
q=2*qq+1
while not isPrime(q):
qq=getPrime(512)
q=2*qq+1

if pp!=qq:
break
n=p*q
phi=(p-1)*(q-1)

e=getPrime(1024)
d=invert(e,phi)

v=getRandomNBitInteger(128)

g=e**2%n

return (n,g,e,d,v)

def TagBlock(n,g,d,v):
f=open("ABigFile",'rb')
F=f.read()
f.close()
b_size=64 # 64B

block_count=len(F)//b_size + (0 if len(F)%b_size==0 else 1)

W=[]
tags=[]
for i in range(block_count):
Wi=str(v)+str(i)
W.append(Wi)

block=bytes_to_long(F[i*b_size:(i+1)*b_size])

my_md5=hashlib.md5()
my_md5.update(Wi.encode())
tags.append(pow((int(my_md5.hexdigest(),16)*pow(g,block,n))%n,d,n))
return (W,tags)

def GenProof(n,g):
c=randint(400,500)
k1=getRandomNBitInteger(256)
k2=getRandomNBitInteger(160)
s=getRandomNBitInteger(16)
return (c,k1,k2,s,pow(g,s,n))

def gen_proof(n,tags,c,k1,k2,gs,judge=0):
f=open("ABigFile",'rb')
F=f.read()
f.close()
b_size=64 # 64B

if judge:
listF=list(F)
X=[]
for i in range(len(F)//100):
x=randint(0,len(F)-1)
while listF[x]==0:
x=randint(0,len(F)-1)
X.append(x)
listF[x]=0
F=b''
for i in listF:
F+=long_to_bytes(i)

block_count=len(F)//b_size + (0 if len(F)%b_size==0 else 1)
T=1
temp=0
for j in range(c):
my_aes=AES.new(long_to_bytes(k1),mode=AES.MODE_ECB)
i=my_aes.encrypt(pad(long_to_bytes(j),AES.block_size))
i=bytes_to_long(i)%block_count

my_sha256=hashlib.sha256
my_hmac=hmac.new(long_to_bytes(k2),digestmod=my_sha256)
my_hmac.update(long_to_bytes(j))
a=int(my_hmac.hexdigest(),16)%n

T=(T*(pow(tags[i],a,n)))%n

block=bytes_to_long(F[i*b_size:(i+1)*b_size])%n

temp=temp+block*a
temp=pow(gs,temp,n)
my_sha1=hashlib.sha1()
my_sha1.update(str(temp).encode())
rho=int(my_sha1.hexdigest(),16)
return (T,rho)



n,g,e,d,v=KeyGen()
with open("./output/key.txt",'w') as file:
file.write(str(n)+'\n')
file.write(str(e)+'\n')

W,tags=TagBlock(n,g,d,v)
with open("./output/W.txt","w") as file:
for i in W:
file.write(str(i))
file.write('\n')


c,k1,k2,s,gs=GenProof(n,g)
with open("./output/chal.txt",'w') as file:
file.write(str(c)+'\n')
file.write(str(k1)+'\n')
file.write(str(k2)+'\n')
file.write(str(s)+'\n')



T,rho=gen_proof(n,tags,c,k1,k2,gs)
with open("./output/result.txt",'w') as file:
file.write(str(T)+'\n')

flag_md5=hashlib.md5()
flag_md5.update(str(rho).encode())
print(b'BaseCTF{'+flag_md5.hexdigest().encode()+b'}')

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
44
45
46
47
48
49
50
51
52
53
54
from Crypto.Util.number import *
from gmpy2 import *
import hashlib
import hmac
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from random import *

def CheckProff(n,e,W,c,k1,k2,s,T):
tau=pow(T,e,n)
block_count=len(W)
for j in range(c):
my_aes=AES.new(long_to_bytes(k1),mode=AES.MODE_ECB)
i=my_aes.encrypt(pad(long_to_bytes(j),AES.block_size))
i=bytes_to_long(i)%block_count

my_sha256=hashlib.sha256
my_hmac=hmac.new(long_to_bytes(k2),digestmod=my_sha256)
my_hmac.update(long_to_bytes(j))
a=int(my_hmac.hexdigest(),16)%n

Wi=str(W[i])
my_md5=hashlib.md5()
my_md5.update(Wi.encode())
hw=pow(int(my_md5.hexdigest(),16),a,n)
tau=(tau*invert(hw,n))%n
tau=pow(tau,s,n)
my_sha1=hashlib.sha1()
my_sha1.update(str(tau).encode())
tau=int(my_sha1.hexdigest(),16)
flag_md5=hashlib.md5()
flag_md5.update(str(tau).encode())
print(b'BaseCTF{'+flag_md5.hexdigest().encode()+b'}')

with open("./output/key.txt",'r') as file:
n=int(file.readline())
e=int(file.readline())

W=[]
with open("./output/W.txt","r") as file:
fl=file.readline()
while fl:
W.append(int(fl))
fl=file.readline()

with open("./output/chal.txt",'r') as file:
c=int(file.readline())
k1=int(file.readline())
k2=int(file.readline())
s=int(file.readline())
T=234286400251524464112670458144913694525518333434039777508421611102466502545441606446799021254782625175811569624228349681696143431027926557585053651139957429856785510525021542033961575674601192776283321921860155347475439442726331189839563865687519551977156169783131926796425661730777079164446161030078497564104
CheckProff(n,e,W,c,k1,k2,s,T)

#BaseCTF{d198bce7a2f06ed24d3b043bddbd7512}

文章作者: yiqing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 yiqing !
  目录