Crypto

1、神秘套娃

题目

1
2
3
4
5
一天,小明在古玩市场得到一个神秘的套娃,听说这个套娃藏着古代最有钱富豪的宝箱密码,套娃的底部,你发现了三段标注 “核心加密” 的神秘字符串,根据小明细心研究,这些是逐步叠加嵌套得到的密码,已知flag在初步被加密为24292125,请帮小明得到宝箱的密码,或许他能和你46分(注:每一个结果中间加一个空格号,再套上flag{})
第一段:22151311012182213
第二段:36122921261633143212
第一段:3619373118351933

思路

由题意得,每两个数字对应键盘上某行某列的字母。得到第一段:stepwise 第二段:nwlahycrxw 第三段:nomziboc。
由题目信息可知是逐步叠加嵌套得到的密码,将第二段字符串用凯撒密码枚举偏移量解密,当偏移量等于9时解得encryption。将第三段也偏移9位得到efdqzsft,再枚举偏移量解密,当偏移量等于12时,解得strength

2、ezAES

题目

1
2
3
4
k = 54686973497341555331323435363638
IV = 496E697469616C697A6174696F6E2056
c = ae4ff1ccc900eb0ba99857c297cf0b73
#得到的答案进行MD5的32位小写加密以获得flag

思路

由于key、iv、c都已知,直接使用CyberChef解得polarctf666,再用MD5加密得flag{3f234da2fe6e8c189048e522b18fefed}

3、xiaoji的RSA

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import libnum
from flag import *

m1 = libnum.s2n(flag[:21])
m2 = libnum.s2n(flag[21:])
p = libnum.generate_prime(1024)
q = libnum.generate_prime(1024)
e = 0x10001
n = p * q
h1 = pow(2025 * p + 2024 * q, 7717, n)
h2 = pow(2024 * p + 2025 * q, 8859, n)
c1 = pow(m1, e, n)
c2 = pow(m2, e, n)


print("h1=", h1)
print("h2=", h2)
print("n=", n)
print("c=", (c1 + c2))
print("leak=", (c1 * 2 - c2))

解答

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 *
import gmpy2
e=65537
h1 = 14598570770570369251044298637863318854969244053819114954671895416691350802920687681668270301378543649113252159681469894140327953343981428435557763783575047421073785093934100988516182011757805151301552786226747639175213248064364104458391503594386384710007637410647669428289271030281975860741433987188926890687769189330536656978907095466736760156091550669274865538908426382007469741745093518762985240171234021436305408209014615992584706412209748494302146308826117702351113891442300797965409831595569786933763773967575744129781374727612526423706127336276048951135368854093017991855415497273999713365969103371554004824509
h2 = 11655430400126708521266628893465012008156070100550313215125940102411494976112918677189030755406554269846801368688286768397687408859238412058773272768466345174217960738213084397497134648104645110774595383007722678343723326165844773931623583737649558732929341710652376370393000666923877685083880991816166675473675993119565288119886891401337292448811477124318462203416303782364411201690259713617106545395093938159021072322598644028525378190756212177234492649667270787158675885995463312527798325191816554894434526912762675422186788558909636033206644624947398671285555871818986699430277747968998624440765160214625508302582
n = 16117539256891249484718413429700173002583084988861340273782389608188420881800342876872775121756821301056788500260045796850939585388076522939011021777251658702207624594144564384121357888401608404641571728859619754015070281985119363898471820577703197516678288716301039869441770173970562352919565912788016889342101896134309321994797037369608180360632790282197647969119609543804552490560372790883065970972189091831856508916272396614853136857081227250153104695845022919856333090412792344985816893032033703744649648621089458783293225651830841418574525258165458710362104364949367148707705685722700758399918195168711661909001
c = 18062960292926203405106631570645792887346762710596094595946201638145269792362432970619678514073768330282072122297774770846723026262793638145140252714036118255298935496782643261099997757452005888950084317572578983859160308143219449311014720216597693717833093096186064214815571678655104145532183363580096161113659794514705540535423432576540755810113817779577012494191762397204056012915596163266097092210799790994886142736276356044755057247863118120000651380079123033610186723297866795705886993017274323290850712391555552018597217459748407996232225971214252337750534257640641166056960137653051788480104937847471213865531
leak = 29786109562795434767286575222202920392934698151772733519827029723076564127577506924725472620552207928305324807071633980845799428305323747287497587012814817694240321762385052643719779704776885137653915759833442842418374852111545817139388092965791383085268376283252367393215830021523854878152740193684532064211244526477475872824124551317767515936013314015487953976823909663377712672258700701049790904432754196590520755614551428222850284265995888579989169357385240073615572407415594868320441237551194011351100321407974631166974196395240849462596136681294133772802147270429624576958515766511950802469230517874955000694776

A=pow(2025,-7717,n)
B=pow(2024,-8859,n)
Q1=(h1*A) % n
Q2=(h2*B) % n
Q11=pow(Q1,8859,n)
Q22=pow(Q2,7717,n)
p=gmpy2.gcd(Q11-Q22,n)
q=n//p
d=gmpy2.invert(e,(p-1)*(q-1))
c1=(leak+c)//3
c2=c-c1
m1=pow(c1,d,n)
m2=pow(c2,d,n)
flag1=long_to_bytes(m1)
flag2=long_to_bytes(m2)
flag=flag1+flag2
print(flag)

flag{fc08e137-5be9-4677-a1f5-4e640223df0e}

思路

由题有:
$$h1 \equiv (2025p+2024q)^{7717} \pmod n,h2 \equiv (2024p+2025q)^{8859} \pmod n$$
那么有:
$$h1 \equiv (2025p)^{7717},h2 \equiv (2024q)^{8859} \pmod n$$
那么:
$$Q1 \equiv h1*(2025^{-1})^{7717} \equiv p^{7717} \pmod q,Q2 \euqiv h2*(2024^{-1})^{8859} \equiv p^8859 \pmod q$$
$$则p=gcd(Q1^{8859}-Q2{7717},n),q=n//p,RSA解密得到c1+c2结合leak得到c1、c2$$

4、创造LCG

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from Crypto.Util.number import *
from secret import FLAG
p = getPrime(128)
step = len(FLAG) // 3
lcg = [bytes_to_long(FLAG[:step]), bytes_to_long(FLAG[step:2*step]), bytes_to_long(FLAG[2*step:])]
a = getPrime(80)
b = getPrime(80)
c = getPrime(80)
a = 678292774844628690689951
b = 799218428050845578943269
c = 871991670671866736323531
p = 226554022535584634512578046463759712133

for _ in range(10):
new_state = (a*lcg[0] + b*lcg[1] + c*lcg[2]) % p
lcg = lcg[1:] + [new_state]
#print(lcg)
print(lcg)
print(a, b, c, p)

解答

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 *
import gmpy2
a = 678292774844628690689951
b = 799218428050845578943269
c = 871991670671866736323531
p = 226554022535584634512578046463759712133
lcg=[118535100331759438922878365119097283254, 158813747268985221207623801114689384559, 90210227613114113867424870653549078831]

inv_a=gmpy2.invert(a,p)
for _ in range(10):
prev_state=inv_a*(lcg[2]-b*lcg[0]-c*lcg[1])% p
lcg=[prev_state]+lcg[:-1]

print(lcg)
m1,m2,m3=lcg
f1=long_to_bytes(m1)
f2=long_to_bytes(m2)
f3=long_to_bytes(m3)
flag=f1+f2+f3
print(flag)

flag{try_to_transform_it_into_formulaic_form}

思路

有题意得:
$$x_{n+1} \equiv ax_{n-2}+bx_{n-1}+cx_n \pmod p$$
那么:
$$x_{n-1} \equiv a^{-1}(x_{n+1}-bx_{n-1}-cx_n \pmod p$$
可构造一个新的LCG,从后向前递推

5、trod

题目

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
#!/usr/bin/python3.10
def Sn(i):
s = ''
while i != 0:
digit = i & 0xff
i >>= 8
s += chr(digit)
return s


def In(s):
val = 0
for i in range(len(s)):
digit = ord(s[len(s) - i - 1])
val <<= 8
val |= digit
return val


def egcd(a, b):
if a == 0:
return b, 0, 1
else:
g, y, x = egcd(b % a, a)
return g, x - (b // a) * y, y


def add(a, b, p):
if b == -1:
return a
if a == -1:
return b
x1, y1 = a
x2, y2 = b
x3 = ((x1 * x2 - x1 * y2 - x2 * y1 + 2 * y1 * y2) * mod_inv(x1 + x2 - y1 - y2 - 1, p)) % p
y3 = ((y1 * y2) * mod_inv(x1 + x2 - y1 - y2 - 1, p)) % p
return x3, y3


def double_add(a, p):
return add(a, a, p)


def mod_inv(a, p):
a %= p
g, x, y = egcd(a, p)
if g != 1:
raise Exception('No inverse exists for %d mod %d' % (a, p))
else:
return x % p


def mod_mul(m, g, p):
r = -1
while m != 0:
if m & 1:
r = add(r, g, p)
m >>= 1
g = double_add(g, p)
return r


def encrypt(message, key):
return message ^ key


p = 518176062457782304884612410952519332834134329945067733347561865398388593

g = (36787147675581394808139907493983017478037802710811666907537030656, 9196786918895348702034976873495754369509450677702916726884257664)

A = (123420721694594649929479399223574107534344333995718594245237838243095171, 441474954859299544474995920494435026572932663211423760492509380991644019)

B = (201033191494423227078517457992052009778645182262306784843547224098182904, 218648529653244920425405172206343059964354475824649267929238496666580596)

if __name__ == "__main__":
from secret import aliceSecret, bobSecret, flag

assert A == mod_mul(aliceSecret, g, p)
assert B == mod_mul(bobSecret, g, p)

aliceMS = mod_mul(aliceSecret, B, p)
bobMS = mod_mul(bobSecret, A, p)
assert aliceMS == bobMS
masterSecret = aliceMS[0] * aliceMS[1]

length = len(flag)
encrypted_message = encrypt(In(flag), masterSecret)

print("length = %d, encrypted_message = %d" % (length, encrypted_message))

# length = 62, encrypted_message = 100093982037856112608548215034731454533357581263010216959659834987333181487918721876307552567021052798183868853477600221794005089397754541179893146978

之后补充

6、二元copper

题目

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 *
from secret import flag
# 生成1024位的大素数p和q
p = getPrime(1024)
q = getPrime(1024)

# 计算RSA模数n
n = p * q

d=getPrime(521)
e = inverse(d,(p-1)*(q-1))
flag_int = bytes_to_long(flag())
c = pow(flag_int, e, n)
# 生成提示信息1:p的高位部分(右移224位)
hint1 = p >> (1024-224)

# 生成提示信息2:q的高位部分(右移224位)
hint2 = q >> (1024-224)
print(f"n = {n}")
print(f"e = {e}")
print(f"c = {c}")
print(f"hint1 = {hint1}")
print(f"hint2 = {hint2}")



'''
n = 28384198625234311024055591508760545859772557962616705058087134570313766078246339432810722251075770426155260882976548948745855775802466082136886198916308950895091350291804323083377746723426585662829956721593008069417593656058519847917141571157423337000995823498275338699783892359735051369928648561714630161425631668045643208548745557419257154201912621422125784538013535319473974771074731705230991582524865280419594116357454200441743555890216903447536600103202560201259871803992219002685757605178878578265090068993111854329728311196716695934142083541791762952464173221834117578210442075243829228771641151482461878395681
e = 24233198590433138929759046268361507704173924810200652679220620112938468106193887274039561623781677698718659545011949842007599587857513820908529013019054134965026341908641820214813864848590705039503962393544485942577593170832200318338048424938687583902593193451991009036073079376645787351773806712023712043915544661222738699918976674231029998684765476662313863475966304161444465282825845046504385175046765187829943107254178661647191288636247051016225997643316505985860750972663378492448313338846037936997542245777268091759458108263910160659565995588095034641162401363842335174968680271594738396192872825937509377247217
c = 940844774044002760041224401562703091111426466612866082339966140841639939444648025078973826624076043358296937037021610358779157680065548800768654725751103021962957103161713314365598234258437018412919647354775780700585758075623352776449216395723630660676425946215835561424716152933938854890964273887565373627808873987131623770696128641766795559659984456300489545944324461938795805156161909329750290251725440271617055330398638953715159135274381585663770711778978803710571670536163056904818086237979881559953073139720433782186818163069926281641109314202702006420384137994982480163260679548223758917067813649186512456317
hint1 = 24918310222298699952176984963600731297429200840056013317855084116853 # p高位
hint2 = 25619165931627397281111327022328112349852649641215268689996006001965 # q高位
'''

之后补充

额被骗到了,还以为是xm的题😥