Easy

alibos

题目描述:

1
Alibos, a classic cryptographic algorithm, is designed to safeguard non-sensitive data, providing a reliable solution for routine information protection.

题目:

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
#!/usr/bin/env python3

from Crypto.Util.number import *
from gmpy2 import *
from secret import d, flag

get_context().precision = 1337


def pad(m, d):
if len(str(m)) < d:
m = str(m) + '1' * (d - len(str(m)))
return int(m)


def genkey(d):
skey = getRandomRange(10 ** (d - 1), 10 ** d)
pkey = int(10 ** d * (sqrt(skey) - floor(sqrt(skey))))
return pkey, skey


def encrypt(m, pkey):
m = pad(m, len(str(pkey)))
d = len(str(pkey))
c = (pkey + d ** 2 * m) % (10 ** d)
return c


pkey, skey = genkey(d)

m = bytes_to_long(flag)
c = encrypt(m, pkey)

print(f'pkey = {pkey}')
print(f'enc = {c}')

output:

1
2
pkey = 8582435512564229286688465405009040056856016872134514945016805951785759509953023638490767572236748566493023965794194297026085882082781147026501124183913218900918532638964014591302221504335115379744625749001902791287122243760312557423006862735120339132655680911213722073949690947638446354528576541717311700749946777
enc = 6314597738211377086770535291073179315279171595861180001679392971498929017818237394074266448467963648845725270238638741470530326527225591470945568628357663345362977083408459035746665948779559824189070193446347235731566688204757001867451307179564783577100125355658166518394135392082890798973020986161756145194380336

简单来说的是按照如下方式进行加密:
$c = \text{pkey} + d^2 \quad (\text{pad}(m)) \quad \text{mod}(10^d)$
这里主要是未知d,但是仔细观察题目会发现$d = len(str(pkey))$ 所以d就已知了,直接解即可

exp:

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

pkey = 8582435512564229286688465405009040056856016872134514945016805951785759509953023638490767572236748566493023965794194297026085882082781147026501124183913218900918532638964014591302221504335115379744625749001902791287122243760312557423006862735120339132655680911213722073949690947638446354528576541717311700749946777
c = 6314597738211377086770535291073179315279171595861180001679392971498929017818237394074266448467963648845725270238638741470530326527225591470945568628357663345362977083408459035746665948779559824189070193446347235731566688204757001867451307179564783577100125355658166518394135392082890798973020986161756145194380336
p_d = len(str(pkey))
mod = 10 ** p_d
m = ((c - pkey) % mod * inverse(p_d ** 2, 10 ** p_d)) % mod
print(m)
# 这里是需要去掉pad所以直接复制出来的数字,也可以写个循环判断flag头
flag = long_to_bytes(
int(617070432649333612824260819310073660177462690396680303631818904538190359368277582922920090537696854326452605))
print(flag)
#CCTF{h0M3_m4De_cRyp70_5ySTeM_1N_CryptoCTF!!!}

Mashy

题目描述:

1
Mashy may seem like a simple cracking task, but you'll need to open your eyes to identify the right things to crack.

题目:

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
#!/usr/bin/env python3

import sys
from hashlib import md5
from binascii import *
from secret import salt, flag

def die(*args):
pr(*args)
quit()

def pr(*args):
s = " ".join(map(str, args))
sys.stdout.write(s + "\n")
sys.stdout.flush()

def sc():
return sys.stdin.buffer.readline()

def xor(s1, s2):
return bytes([s1[_] ^ s2[_] for _ in range(len(s1))])

def main():
border = "┃"
pr( "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓")
pr(border, ".: Hi all, she did Mashy, you should do it too! Are you ready? :. ", border)
pr( "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛")

REC = []
cnt, STEP = 0, 7
sh = md5(salt).digest()

while True:
pr(border, f'Please send your first input: ')
d1 = sc().strip()
pr(border, f'Please send your second input: ')
d2 = sc().strip()
try:
d1 = hexlify(unhexlify(d1))
d2 = hexlify(unhexlify(d2))
h1 = md5(unhexlify(d1)).digest()
h2 = md5(unhexlify(d2)).digest()
except:
die(border, 'Your inputs are not valid! Bye!!!')
if d1 != d2 and d1 not in REC and d2 not in REC:
if md5(xor(d1, d2)).hexdigest() != 'ae09d7510659ca40eda3e45ca70e9606':
if hexlify(xor(xor(h1, h2), sh)) == b'a483b30944cbf762d4a3afc154aad825':
REC += [d1, d2]
if cnt == STEP:
die(border, f'Congrats! the flag: {flag}')
pr(border, 'Good job, try next level :P')
cnt += 1
else:
die(border, 'Your input is not correct! Bye!')
else:
die(border, 'No this one! Sorry!!')
else:
die(border, 'Kidding me!? Bye!!')

if __name__ == '__main__':
main()

简单来说是要完成七轮挑战,使得输入的两个16进制串d1,d2,使得满足:

  • d1 不等于 d2
  • d1 xor d2 的md5不为 ae09d7510659ca40eda3e45ca70e9606
  • md5(d1) xor md5(d2) xor sh 的值为 a483b30944cbf762d4a3afc154aad825

这题纯出题人脑子有病,出的莫名其妙的,全靠猜
ae09d7510659ca40eda3e45ca70e9606的原像为:b’\x00’ * 256
a483b30944cbf762d4a3afc154aad825的原像为:emelinjulca
然后我们不知道salt也就是sh,就进行不下去了,其实sh就是emelinjulca,纯就跟出题人脑袋相接才能做
(ps; 赛中的时候我人都傻了,然后一看几十解了,就拿emelinjulca试了一下结果真是,真是无了大语了)
到这里问题就简单了,整几组前缀进行MD5碰撞就完事了

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

sh = remote("01.cr.yp.toc.tf",13771)

msg = [(b"31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe11ecc10c7ab8b4fe112d7f29ceb2dae1f39ce7a691488bfb817b7685ad087a162b0ce0ea69b140e7274b44c43f183578392f9719b43d4966c321cc0a10e6fbd002869b42f9fad9eb869dc55d5d349835961b1fd36a0bbe76a9bb5f4f5cc54136dec48d74497bf6579a6bf9721b81078637b429cff958886bd816dc4333a338",b"31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe11ecc10c7ab8b4fe112d7f29ceb2dae1f39c67a691488bfb817b7685ad087a162b0ce0ea69b140e7274b44c4bf183578392f9719b43d4966c3214c0a10e6fbd002869b42f9fad9eb869dc55d5d349835961b9fd36a0bbe76a9bb5f4f5cc54136dec48d74497bf6579a6bf9729b80078637b429cff958886bd8165c4333a338"),
(b"32000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ebcd0390c198c8f33b4a08cce32f47451b5002e68895b7505d12824a0a460d133de3eff34e4de89ceb27ed3bce211b4696fec6736c059058d8b60f6e473f6c701068abf2d6bc645c4589a6f0f5211f5fc903c96e789d91f8abb300d8176088b7d31d825897c9001cf409c45b3a50005e93e33f4f908f9df944a664c927d28d55",b"32000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ebcd0390c198c8f33b4a08cce32f47451b5002668895b7505d12824a0a460d133de3eff34e4de89ceb27ed3bcea11b4696fec6736c059058d8b60fee473f6c701068abf2d6bc645c4589a6f0f5211f5fc903c9ee789d91f8abb300d8176088b7d31d825897c9001cf409c45b3ad0ff5d93e33f4f908f9df944a6644927d28d55"),
(b"3300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068270588dbc19cfe24db79019b0070d1823c4a4d6d816cdb22c2401a32081455e5db01c54c0ccf1b6706f061eec3e58ead12b5173dee55f954f9ac52a1a4bbedc32ab0ee3cae3896f9908a49d38cc5535c6c80661d262e1ec91a8639ecc7e1654086c61bf4cfe7fc6a7378f7809416ef39ae4ccc7fc29570c4c3a51b03fed7b9",b"3300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068270588dbc19cfe24db79019b0070d1823c4acd6d816cdb22c2401a32081455e5db01c54c0ccf1b6706f061ee43e68ead12b5173dee55f954f9acd2a1a4bbedc32ab0ee3cae3896f9908a49d38cc5535c6c80e61d262e1ec91a8639ecc7e1654086c61bf4cfe7fc6a7378f7801416ef39ae4ccc7fc29570c4c3a59b03fed7b9"),
(b"3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025a80516e996c87574dc568d274da9d2d281b09bbc72f7ef46767961b4a708e969ebffe06a6e0945cbefe2f2fc41d89cb89c2574afb1fdbac5aca131cdf52d68b9e3c95615888cbc3d187ccd32f60d5b35636e925c1aa3002bb330c81b6088d8cbeb8014afc24f5e374ad05ab2f30d1fac7221195b7f3f1f19f5219ecaf948a2",b"3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025a80516e996c87574dc568d274da9d2d281b01bbc72f7ef46767961b4a708e969ebffe06a6e0945cbefe2f2fcc1d89cb89c2574afb1fdbac5aca1b1cdf52d68b9e3c95615888cbc3d187ccd32f60d5b35636e125c1aa3002bb330c81b6088d8cbeb8014afc24f5e374ad05ab2730d1fac7221195b7f3f1f19f5211ecaf948a2"),
(b"35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f56f1da5ad57f483059ae0869962f05204f954e2de9d56c55b168139ec372cefb1b307cbe84ce477cbff5df4d40bc46c08ceef8bb18bfc996b3b9fdaa7b72c17ee1cb3491794d6e2ff7d9914525cdf2d88b9314505ef864d201d2b364a6e25ae4d183e738c3c86e53e5ad1a1910c825cb1bcd59b97d1a3cf979668fbac6a138b",b"35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f56f1da5ad57f483059ae0869962f05204f95462de9d56c55b168139ec372cefb1b307cbe84ce477cbff5df4d48bc46c08ceef8bb18bfc996b3b9f5aa7b72c17ee1cb3491794d6e2ff7d9914525cdf2d88b931c505ef864d201d2b364a6e25ae4d183e738c3c86e53e5ad1a1918c815cb1bcd59b97d1a3cf9796687bac6a138b"),
(b"36000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2b343c2bb614b7b4acc4e0ade8a5e4b2abb4eefe97ef7991832793e4e301637cf0becd84c43dbafeb43d0da12c8e2883e0d02ada60e678e3470ee866abe2fa713b8a521a986e75d821f74221fee2ea441b3ab462f29b56f862b00d05f60cdc1a9a1c92d04457bd6e693673963ab6e6b6c3552cd1c54efe627b342fecdfd8dea",b"36000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2b343c2bb614b7b4acc4e0ade8a5e4b2abb4e6fe97ef7991832793e4e301637cf0becd84c43dbafeb43d0da1248e3883e0d02ada60e678e3470ee066abe2fa713b8a521a986e75d821f74221fee2ea441b3abc62f29b56f862b00d05f60cdc1a9a1c92d04457bd6e6936739632b6e6b6c3552cd1c54efe627b3427ecdfd8dea"),
(b"370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d6afba61c0910b5ca21a9164b65134753b3845080d9afe6460237a1d938a8385204b0e85cce2b686b40d9b9c517e64b08ee01d02fa63470aa3b34c1e550d11356d867ea70e96b0257d9b1b20df1ee22603111180739001ad17bf6c8dd707932b34e97b62e74936197adcc2f93164b46c7c7e4bb7b6c1a55a21958961f7378be",b"370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d6afba61c0910b5ca21a9164b65134753b384d080d9afe6460237a1d938a8385204b0e85cce2b686b40d9b9c597e64b08ee01d02fa63470aa3b3441e550d11356d867ea70e96b0257d9b1b20df1ee22603111980739001ad17bf6c8dd707932b34e97b62e74936197adcc2f93964a46c7c7e4bb7b6c1a55a21958161f7378be"),
(b"38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6eb639aedf271805029b40d4dc783ab8d769d35cb9032f9184641b94c881615f5f902cb5e8ba3176f2660d4f821828fdbed111365cc4dfbbf001ca884fcb74df4f681c17ed38f53b8346319fee0c2eaecf2ea2597f0ca2c04ed6c064e9e3ddd7d37ff3e54908e889a58455a8fd411bc0f75e93cadc453f6f89d16e8cd8e7c2a",b"38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6eb639aedf271805029b40d4dc783ab8d769db5cb9032f9184641b94c881615f5f902cb5e8ba3176f2660d4f8a1828fdbed111365cc4dfbbf001c2884fcb74df4f681c17ed38f53b8346319fee0c2eaecf2eaa597f0ca2c04ed6c064e9e3ddd7d37ff3e54908e889a58455a8f5411bc0f75e93cadc453f6f89d1668cd8e7c2a")]

for i in range(8):
sh.sendline(msg[i][0])
sh.sendline(msg[i][1])

sh.recvuntil(b"Congrats! the flag: ")

print(sh.recvline())

#CCTF{mD5_h4Sh_cOlL!Si0N_CrYp7o_ch41lEnGe!!!}

Beheaded$

题目描述:

1
The beheaded flags have had their headers removed, making them encrypted. Can a living entity truly survive without a head?

题目:

1
2
3
4
5
6
7
8
9
10
11

source secrets.sh

FLAGS="all_flags.txt"
rm -f "all_flags.enc"

while read flag; do
magick -background white -fill blue -pointsize 72 -size "$X"x"$Y" -gravity North caption:"$flag" flag.ppm
tail -n +4 flag.ppm > tail
openssl enc -aes-256-ecb -pbkdf2 -nosalt -pass pass:"$KEY" -in tail >> "all_flags.enc"
done < "$FLAGS"

题目将flag串写在图片上,然后对这张图片进行ECB加密,最后得到密文文件。
这个不太会,看春哥说是用工具,以后再说吧。

Medium

Alilbols

题目:

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
#!/usr/bin/env python3

from Crypto.Util.number import *
from gmpy2 import *
from secret import d, flag


def genkey(d):
while True:
f = getRandomRange(1, int(sqrt(2) * 10 ** d))
g = getRandomRange(10 ** d, int(sqrt(2) * 10 ** d))
if gcd(f, 10 * g) == 1:
q = 4 * 100 ** d
h = inverse(f, q) * g % q
if gcd(h, 10 * d) == 1:
break
pkey, skey = (d, h), (f, g)
return pkey, skey


def encrypt(m, pkey):
d, h = pkey
q = 4 * 100 ** d
assert m < 10 ** d
r = getRandomRange(1, 10 ** d // 2)
c = (r * h + m + r) % q
return c


pkey, _ = genkey(d)
m = bytes_to_long(flag)
c = encrypt(m, pkey)

print(f'h = {pkey[1]}')
print(f'c = {c}')

output:

1
2
h = 1051643987107349427988807326909852110640860009433515828832892541964729933410444984350917250524103015414239941369074041041830326426044333499878031164851095096864048639115431370526747014210332286314344073411522846701723463410585601251886732229726828022089809603850477551571014006202841406236367999378786782206165205893353928598469661871284779486855440579818275314024966224282757807716013799903830828885606714972634243850947534165272668985513949964901606268939300116019465522042467054120201087606016018354238401711720121586874288767235317479748890350702705575809130664969776549574720593740409234863974057904204809404816059921579771581800937241591669455683460570640868196509926763901079838233646036933530095891316054589051458146768287967886035091641162494322987627448810201550901588438560433001422233269632915351406169253963308421081459981594969405377353502889363324282815864766827664453823780238352371809048289845094882346227809082005375092441877966603138648719670349093616548820955566204871333952902983753935678447080673827214244142614295192263451840766771122229866931492260663320087497820892824540996643905125018452302747847009
c = 11913143174789215053772744981113562063689725867199301496294410323568897757042952642806438602327917861884988292757318755590132189620231444302311290566584065812614959093870787195145654508262419270742989923415342357807325941686508030706603920412262004324188375072184983301522882728578077572816154054220606088703932092256905881975876112779175003897105313776239681492514925430817300633974666123599685062340158348009344351002327049272743679109535286730751345284084148118733529966364414749672437370878526710641430471595906340522772252875146681541656231708112317601000655090279925720590940060372738708208419449824043905057860829031242339842131799965043031307394209699264362321397162645220002253271689678364848888381499587038475895945238726252440250183268252483198408039250213490525880829604473555612305513974817850974135874728084839426045420913060975464553734293001460752648937744531874552694145500413222582269910431269597066268600572899619407093373565994271589940926018891922169454906132284552523035481664164354874071831210264979733079749696197917769435226866441989054017071332158916586376454753209296136133271926449919437888563234409

密钥生成有:

  • $ 1 \leq f < \sqrt{2} \cdot 10 ^ d$
  • $ 10 ^ d \leq g < \sqrt{2} \cdot 10 ^ d$
  • $ q = 4 \cdot 10 ^ 2d$
  • $ h = f ^ {-1} g \ (mod \ q)$

加密有:

  • 取一个随机数r, 满足 $ 1 < r < \frac{10^d}{2}$
  • 计算密文 $ c = rh + m + r \ (mod \ q) $

给出了h,c, 需要还原m

很明显是NTRU,直接造格:
$\begin{bmatrix} r & -1 & k \end{bmatrix}$ = $\begin{bmatrix} r & -1 & -m \end{bmatrix}$

但是我们不知道d,q, 所以需要枚举一下d的大小

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from Crypto.Util.number import *
h =
c =

for d in range(500,800):
q = 4 * 10 ** (2 *d)
M = matrix(ZZ, [[2, 0, h+1],
[0, 10^d,c],
[0, 0, q]])
v = M.LLL()[0]
m = int(abs(v[-1]))
if b'CCTF' in long_to_bytes(m):
print(d)
print(long_to_bytes(m))

Ally*

题目描述:

1
Ally enjoys the challenge of solving Diophantine equations, so help them tackle this latest complex equation as well.

题目:

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

def die(*args):
pr(*args)
quit()

def pr(*args):
s = " ".join(map(str, args))
sys.stdout.write(s + "\n")
sys.stdout.flush()

def sc():
return sys.stdin.buffer.readline()

def main():
border = "┃"
pr( "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓")
pr(border, ".:: Ally is my best friend, help him to solve his tough task ::.", border)
pr( "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛")

nbit = 14
level, step = 0, 19
while True:
pr(border, f'Please send your {nbit}-bit prime: ')
p = sc().strip()
try:
p = int(p)
except:
die(border, 'Your input is not valid! Bye!!!')
if isPrime(p) and p.bit_length() == nbit:
pr(border, 'Send the solution of the following Diophantine equation in positive integers x, y')
pr(border, f'{p} * (x - y)**3 = (x**2 + y) * (x + y**2)')
xy = sc().strip().decode()
try:
x, y = [int(_) for _ in xy.split(',')]
except:
die(border, 'Your answer is not valid! Bye!!!')
if p * (x - y)**3 == (x**2 + y) * (x + y**2) and x > 0 and y > 0:
if level == step:
die(border, f'Congratz! You got the flag: {flag}')
else:
pr(border, f'Good job, try the next step {level + 2}')
level += 1
nbit = int(1.2*nbit) + getRandomRange(0, 6)
else:
die(border, 'Your answer is not correct! Bye!!')
else:
die(border, 'Kidding me!? Bye!!')

if __name__ == '__main__':
main()
  • 就是给出19对如下的丢番图方程的正整数解:

赛中没做出来,赛后发现其实:

就可以了

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

def get_valid_prime(bits):
while True:
p = getPrime(bits)
if p % 4 == 1:
return p

try:
sh = remote('01.cr.yp.toc.tf', 13777)
for i in range(20):
sh.recvuntil(b'Please send your ')
bit_length = sh.recvuntil(b'-')[:-1]
bit_length = int(bit_length)
sh.recvline()

p = get_valid_prime(bit_length)
y = (p - 1) // 4
x = 2 * y + 1

sh.sendline(str(p).encode())
sh.recvline()
sh.sendline(f'{x},{y}'.encode())
sh.recv()

print(sh.recvline())
except Exception as e:
print(f"发生错误: {e}")

Bada*

题目描述:

1
The Bada equation contains an undetermined function. By closely examining how this equation behaves, you may be able to discover the concealed flag.

题目:

存在一个函数方程f: N×N → Z:

  • $ f(a+1,b) = f(a,b) + a $
  • $ f(a,b+1) = f(a,b) - b $

给定了f($x_0$,$y_0$)的函数值,以及f(x,y)的值,求(x,y)使满足f(x,y)=z

很明显这两个函数方程可以看作两个等差数列,也就是有:

即是:

记f(1,1)为c
也就是有:

这里就把问题变成了解关于x和y的不定方程的问题:

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

context.log_level = 'debug'

class EquationSolver:
def __init__(self):
self.pattern = r'f\((\d+), (\d+)\) = (-?\d+) and f\(x, y\) = (-?\d+)\n'
self.conn = remote('node4.anna.nssctf.cn', 28634)

def solve(self, prev_x, prev_y, base_z, target_z):
adjusted_z = base_z - (prev_x * (prev_x - 1) // 2) + (prev_y * (prev_y - 1) // 2)
left_hand = 8 * (target_z - adjusted_z)
for factor1 in divisors(left_hand):
factor2 = left_hand // factor1
if factor1 % 2 != 0 or factor2 % 2 != 0:
continue
half_factor1 = factor1 // 2
half_factor2 = (factor2 + 2) // 2
if (half_factor1 + half_factor2) % 2 != 0:
continue
x = (half_factor1 + half_factor2) // 2
y = (half_factor2 - half_factor1) // 2
return x, y
raise Exception("No solution found")

def process_step(self):
self.conn.recvuntil(b'We know: ')
line = self.conn.recvline().decode()
match = re.match(self.pattern, line)
if not match:
raise Exception("Format error in received data")
prev_x, prev_y, base_z, target_z = map(int, match.groups())
x, y = self.solve(prev_x, prev_y, base_z, target_z)
self.conn.sendline(f"{x},{y}".encode())

def run(self):
for _ in range(20):
self.process_step()
self.conn.interactive()

if __name__ == '__main__':
solver = EquationSolver()
solver.run()

Duzly$

题目描述:

1
Duzly is a straightforward hash function design based on congruence relationships over a prime number modulus.

题目:

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

def pad(m):
m += b'\x8f' * (8 - len(m) % 8)
return m

def duzly(m, C):
ow, E = 0, [2**24 + 17, 2**24 + 3, 3, 2, 1, 0]
for _ in range(6):
ow += C[_] * pow(m, E[_], p)
return ow % p

def pashan(msg):
msg = pad(msg)
pash, msg = b'', [msg[8*i:8*(i+1)] for i in range(len(msg) // 8)]
for m in msg:
_h = duzly(bytes_to_long(m), C).to_bytes(8, 'big')
pash += _h
return pash

p = 2**64 - 59
C = [1] + [randint(0, p) for _ in range(5)]
flag = urandom(getRandomRange(0, 110)) + flag + urandom(getRandomRange(0, 110))
_pash = pashan(flag)

f = open('_pash_updated', 'wb')
f.write(str(C).encode() + b'\n')
f.write(_pash)
f.close()

赛中看0解(自知之明一手)就没看,赛后一看果然没看懂
这里贴一下大佬的做法这里

Forghan*

题目描述:

1
The Forghan, the combination of RSA and DLP cryptography, may in certain instances prove more accessible than employing either method individually.

题目:

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
import sys
from Crypto.Util.number import *
from hashlib import sha256
from flag import flag

def die(*args):
pr(*args)
quit()

def pr(*args):
s = " ".join(map(str, args))
sys.stdout.write(s + "\n")
sys.stdout.flush()

def sc():
return sys.stdin.buffer.readline()

def find_gen(p):
while True:
g = getRandomRange(2, p - 1)
if pow(g, (p-1)//2 , p) != 1:
return g

def main():
border = "┃"
pr( "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓")
pr(border, "Hi all, now it's time to solve a strange and unusual RSA and DLP ", border)
pr(border, "challenge about encryption! Follow the questions and find the secret", border)
pr(border, "flag! :) ", border)
pr( "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛")
nbit, b = 256, False
while True:
pr(f"| Options: \n|\t[G]et encrypted flag \n|\t[P]ublic parameters \n|\t[S]ubmit {nbit} primes \n|\t[Q]uit")
ans = sc().decode().lower().strip()
if ans == 'g':
if b == True:
l, n = len(flag), (p**2 - 1) * (q**2 - 1)
gp, gq = find_gen(p), find_gen(q)
sp, sq = getRandomRange(1, p), getRandomRange(1, q)
flagp, flagq = flag[:l // 2], flag[l // 2:]
yp, yq = pow(gp, sp, p), pow(gq, sq, q)
cp, cq = pow(bytes_to_long(flagp), yp, n), pow(bytes_to_long(flagq), yq, n)
pr(border, f'cp = {cp}')
pr(border, f'cq = {cq}')
else: pr(border, 'Please first send your primes! :P')
elif ans == 's':
pr(border, 'Send your desired prime numbers separated by comma: ')
P = sc()
try:
p, q = P.split(b',')
p, q = int(p), int(q)
except: die(border, 'Your input are not integer! Bye!!')
if p != q and isPrime(p) and isPrime(q) and p.bit_length() == q.bit_length() == nbit:
b = True
pr(border, 'Now you can get the encrypted flag in main menu!')
else: die(border, 'Sorry, your integers are not valid :/')
elif ans == 'p':
if b == True:
pr(border, f' gp = {gp}')
pr(border, f' gq = {gq}')
pr(border, f' yp = {yp}')
pr(border, f' yq = {yq}')
else: pr(border, 'Please first send your primes! :P')
elif ans == 'q':
die(border, 'Quitting...')
else:
die(border, 'You should select valid choice!')

if __name__ == '__main__':
main()

题目有三个选项,但是显然是有顺序的,具体来说应该按照下面来:

  • 选择”S”,输入256bit的素数p、q
  • 选择”G”,靶机对flag进行加密,加密流程如下:
    • 生成n,n = (p^2 - 1) * (q^2 - 1)
    • 分别生成p、q下的一个随机二次非剩余gp、gq
    • 生成p、q下的随机数sp、sq
    • 将flag分为两段,记为flagp、flagq,对应数字记为mp、mq
    • 计算yp、yq, $y_p = g_p^{s_p} \pmod{p}$,$y_q = g_q^{s_q} \pmod{q}$
    • 计算密文cp、cq,$c_p = m_p^{y_p} \pmod{n}$ ,$c_q = m_q^{y_q} \pmod{n}$

选择”P”,获取gp、gq、yp、yq的值

由于有 $y_p$、$y_q$,所以这里就变成了解一个RSA的问题,由于flag是静态的,所以可以放在一个子群里去求解,放在模p-1下有:

由于p和q都是自己构造的,很容就能得到p-1的分解,就可以解RSA解出mp、mq在p-1下的值,又因为flag是静态的,所以完全可以多次交互求crt

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
from Crypto.Util.number import *
from sympy.ntheory.modular import crt
from pwn import *

sh = remote("node4.anna.nssctf.cn", 28932)

def gen_prime():
while True:
p = getPrime(255)
if isPrime(2*p+1):
return 2*p+1

nums = 10
P = [gen_prime() for i in range(nums)]
mp = []
mq = []
for i in range(nums):
sh.sendline(b"s")
sh.recvuntil(b'Send your desired prime numbers separated by comma: ')
q = getPrime(256)
sh.sendline((str(P[i]) + ',' + str(q)).encode())

sh.sendline(b"g")
sh.recvuntil(b"cp = ")
cp = int(sh.recvline().strip().decode())
sh.recvuntil(b"cq = ")
cq = int(sh.recvline().strip().decode())

sh.sendline(b"p")
sh.recvuntil(b"gp = ")
gp = int(sh.recvline().strip().decode())
sh.recvuntil(b"gq = ")
gq = int(sh.recvline().strip().decode())
sh.recvuntil(b"yp = ")
yp = int(sh.recvline().strip().decode())
sh.recvuntil(b"yq = ")
yq = int(sh.recvline().strip().decode())

k = (P[i] - 1) // 2
mp.append(pow(cp, inverse(yp, k - 1), P[i]))
mq.append(pow(cq, inverse(yq, k - 1), P[i]))

Mp = crt(P, mp)[0]
Mq = crt(P, mq)[0]

print(long_to_bytes(Mp))
print(long_to_bytes(Mq))

Honey

题目描述:

1
Honey is a concealed cryptographic algorithm designed to provide secure encryption for sensitive messages.

题目:

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 *
from math import sqrt
from flag import flag

def gen_params(nbit):
p, Q, R, S = getPrime(nbit), [], [], []
d = int(sqrt(nbit << 1))
for _ in range(d):
Q.append(getRandomRange(1, p - 1))
R.append(getRandomRange(0, p - 1))
S.append(getRandomRange(0, p - 1))
return p, Q, R, S

def encrypt(m, params):
p, Q, R, S = params
assert m < p
d = int(sqrt(p.bit_length() << 1))
C = []
for _ in range(d):
r, s = [getRandomNBitInteger(d) for _ in '01']
c = Q[_] * m + r * R[_] + s * S[_]
C.append(c % p)
return C


nbit = 512
params = gen_params(512)
m = bytes_to_long(flag)
C = encrypt(m, params)
f = open('params_enc.txt', 'w')
f.write(f'p = {params[0]}\n')
f.write(f'Q = {params[1]}\n')
f.write(f'R = {params[2]}\n')
f.write(f'S = {params[3]}\n')
f.write(f'C = {C}')
f.close()

params_enc.txt:

1
2
3
4
5
p = 10580731215444436219213907263947534038012197972307836319229421193761088798378768844649759133142120180834573817149711299466707823017636232456526471274387917
Q = [6718668664591596190749745980002066645380242844394957953766947533978323053938214647829798301606252456858132121628517723050462291300790766055200866765561610, 8738840830394886495658505803088103824478963010774845789433253508554356383249611502157307334585157729703873877797759121271071421201959116272886732798936523, 4388762712805764363921857352899834586382140923234814556069490536704913653848525595836491615636446563386705915348021173847271741862809075809151508973332816, 3663706247989213864330218414789109172658418861584264092087052781618522795676355371739296186667918464732397854703792563460353675590182379535358561615166754, 10397730940373180549512945920847346184926672474430866208628825035104473525758952069910968144296138220861205803231072660136999110567752870928953292888013817, 7950983396364741732874562189206547723862955251595526752956177377987683115942827501152009639962778147887569469649852864894630521759276627026901168996371682, 4533165373271154956275563812280832107592547920299130443910706773435844651231402604986107252454770256826684895729900344877444002682896222483157835711226276, 234527648838985018479849393379369972316648524004050156622962478277970628212208049885578895953447529009579881605066831810617219492342569126524704457098602, 870946394610707169333783318085559836426827503011955242395779894700298192587685130680102208909573921059078858816359885827349281892186755920839352494224983, 5025393101560564396356619431938053414422489109406396725377683594254768077793838379117179092536396259414266971990125716674162127500490058572594571364978294, 5914192169617888877888201158713062853387719050723973971874176184801960297380845845091259990664210178355882621876155306106794686897854891414999449337977781, 2315609284318723939818174971181608382568372323836754133265010413836452399043354382657889810068171230196496294710150903020084150025606782486579490225752163, 7278167622527482910919537896950398911672667355929695202886784227621290914468002099686668156909569183497765732237075799745632960354306268680765408194219074, 3334584846711780119716613440720851482199838919351927489954344426327712973616885459737471991960238971274273643566666607141850753561424427088261862873317161, 10418397794302836806813296591826255845845380563102199636140458670781241436466478273414138749593148481207713557016996462238845705251702717702279222414513227, 8928267741189301140931758366885435860144549752680480164627323600501278650103818630920534258909582593266779000356145650416276415560226176904904552964196921, 3371514716248416335324237152123624115597170761078576760713238311485522010416246207731778456501311675041827750001670698984335573888627309609534659722697174, 3802217515688979225517388823688564230191961273039428065604146662684362686419670392762755984078261072614619934671572327384351597903233780846163893180876244, 2363399549320749312563257796730356164186914867645487733176402567625567991193120859507532138374793392237469893062402307645814490930874653088116729203724851, 10221767730316631512882371487958453352895713655492241322139865275323706929127996334620105099751973217983332705204535216804829987329684674632121801754529472, 2309440702968799222696132507585555901684240893289264193546892279919675495689944211715270510347394465285317239758024734161176699837687742722383530547735726, 5768185970426887633783322939933762164095055854707759575404348181421158843802654199133776622565384843677610666356549368021172121302926969754865633752131083, 3229518654067354667224244723968136366109210341994628338992752927462431316675552817799465987425719486448276862390918033544772400219803600904202906882850710, 9261930571620802581580992489567043178258044978932724785185749415955521702331959591680386023118398455066896674799447994060060156036800986190467008880726445, 2202162000802916921896507108984564185119471354726317829850206292755815439071735424116041491064894922930900262540589602333676063925873357256494020426758849, 1449198886322850923273373987785167865779477069790726992542423846556138762913056524689998313112599261515223680429584445016474216381861998363527368722991846, 8372052560034461177472546395510480308837387803551378399004608402463282066003862653368875671946863748209051044725913651881213858335224750549176875818647614, 1554572177534183877889322947083536921680809086638640689433294150868422460719624621258231995856944045776876555664816113444481761122803489100212103150005950, 10304720995101153898600333216365877709018991122985401884049110267116778080162237155472336396606109372189653686733770775660895990549286854727042270667997449, 9702831715765050072649082617719386580543641764650576307262259428035281535816750758018451681417440458250169771442858047124693499821240155899358663466925522, 4983986466837077050816175727911146971276599399191126236666755181304580074902883995859030897874305902445659355326021836801836996577665092276845357389900055, 983210432268706135181772492997088637756153310076409721616450343187239073604891492532080986521255675448499887782529162112441952861587689660048849369850769]
R = [8922553268219903948421811612403588317187402276064169063400419617931637566221670948925221403527928336656976084021780421068421112325215152715630319708159148, 1960697234007608888633325436691320507012497445090151112947144246088597317322303593936974554881161091213718329061011703885436579261559669838148253146762736, 5876944865176517279136475269375710514719489457672467542904948332791352244229042691977616905122711469012731652511966060550749288338599104284986451669586397, 10560136356360422684127995001096871178761635291417665630629868184624616925939841693017240341233504589896610287855672892399213367967385666891688408976236926, 477096251733995832965266836067676961413182629438628989729801411920869543083075545758386996801847267554704996660190900105380190625423846876906822024677634, 7001514955678391252130680521301315254365131738168087539892724691183104608345983375763663321467662055864103520121513349630333839818372656472731157470876337, 3894488356665934776074291789545516608573077899099880057920210752197885106521699021123658077208789295954145485399473386424677782787720074605813565437678385, 6084641463140385894120457093933350076091808742065950836200598466936433741373700151235571333073965513559605688011967994215074945374832957951384088589789549, 6429023674027239778212676334778900557043774851747196071499704016422574667955121145943674677254291410204037372996870181094090300709994594837656541352954321, 974464046378184190666336249935678253753198649184272269465353741281529523364289314148552833155935080422698020734516538377662137879089845095565536185765703, 5275384626572520577089146723078373110279682903874445477027602487061203157331398955233780208890725281673434536867800450553737656852356536771518379108118530, 7195767683001605593626199889963767438584070902169912442665828755648712278523740276132000225353756257232761885567134364203207306842108602537457408438487869, 1960155276835684836483043402384876176138942980630724993481564836712252228823186653467973806509964860286129730847244573674203959835565358735171611743573721, 6414607819273473402861616605113355396690170400984793217629732347141796693554056264547151212348354332930126795040213921009711560216969452391748438893237750, 3344964019305423035551401397282638905496921053458747459062023331678484337724980196690184898986671355848101101352105363764794975082772539709853216580762130, 5599385562588302350377616767130563945375472947459594912838322011021483641484084692396462025157944023828872267520122213089523093591160284337483108416804096, 9490045098551912983475126253859124028793327975874647810947095579199208473971726763051464010595903748080632329362605820021188148160826282120484098519748832, 980400922804123638777377509067942595214234592161404114303498013065244168965487370334832921426484278913774963761155003569793282819717667783351454812080994, 2772369382727364487748752144766350276094463435156818133766210304998890765120785013435379746537938377688617479112518505844159436213691418873590807740501183, 2338271137215119073302625621754099128003710500967811947590498668688826448575898279561111743087002717955161536157254689000474464404087443266193145449601031, 11773104862539842923315548180471993854469651503131148446111338098437913152663007837927793233931818835121946274135336436554801339749906320765919816150768, 7022131435585860015767289025786078578929344550873832550705723505006303288639135070849692494020122369694090619694760175970759059981608871097298624956669246, 9062158671807923729547552523768819638817707994079942965412925347441853183471973898478745711676153003756450481351777543455041815438536630317647408008349357, 641428039466528875429106458292463262780539744201857515833377175893334510962304373010401729801987725599439620073783868719664061882399367340158128062151780, 9636846145225909579086917154824161374486916920345217833190333031690359415616710658317308376119096253360425924297858397657697468296746934075225665559206030, 480796179229094678008918831581475398488769027287954488301969143979307355466114726392701279092691566949082439457297527772794149828193400419285116237063338, 7726757640854263742178678415761753342099387727318458723726925176786999799204056696883433346568600944559959849253863013300907357120126559055735593380638961, 551534415366550033034654093228329954588738781407008585088422737955391043381667720876717529438845777841508116853874405455280903517864352822604194884203656, 2135598634800053933515509095633720732412542790075717247869348997292949946344227105219967710854885153055617943193159899627517699960920415492992774438014041, 1680242449902645450228202409049382139482100876672724104665964994414865664877710770701122475977142858601068246748276652246938681740022531970523695731126206, 436320498659370791836085607479390848415464961245449366885835640616716752879866126057724425537944356751844317980881005608075886211154052092270888058429787, 4102523817041969170017113001399252035243358293719837916039521471412151711746047572340376418109842112515873700164747338421862615679590520014959369523777063]
S = [4389820170235953517860364281419052587762385444517203945856665517072263529411621622474249480804818285716662154444854074939122170918939074730520091008754679, 10274488321950407401790238304858775303749809597573328350457719402010568443492374388509295355784873292280254116167747959663379913408799485392015111636115272, 7413556897779783875511997253964328306011661062497568739340607424890313315434489440969977560260194970241163209968988660276109536299848001455072705137702052, 10385679419514177727801069016719283683697529805734389950368725106396939072509839502286093730172215158898251533786500497578747904349856564856054102927847131, 6386209810414906928429352824399745808560059492214757951425372272591372428785367326567204502131184260857447725722068674542931096991341451850846209503213310, 699060860182347708294712482476262878008951502586470987307146194685783850677219935862211847525612405824474382122868643521962157410369483858428437433802395, 3482063900392942412450041046839813864192488604261419419162091087116878838189062406913587662602295096636481252242577251563441565388543873530900962308450590, 5752782775722534186844731777766684686828626762801341093006843547008915880093927377014105260314050196609699164926717998841388194942556402699285523644651583, 4477944786670422304592908174461368396168580171651041832449759231077050962444090886920563302603784981035116689839335069690875797644553684152368376089740517, 5663531682848751034979876476955107364567717396957230368140915480695954150088052156264521615690161327525898382714131905580517915060427960250740110846321921, 5343294510843224726960051115907810365241970373986845465490090821566645536683695042467985025063439338770116316455211944030125820601506874250685838077414765, 8432688027895892738831218358369397874948328355540048945541749304849571948638169902486647265119397307193449002927427840453857643697175667051504836511635801, 8974418251288081645329898313903422373193272601106837017923535786950979222125740970411725976034947989767143786286397290996756916960291029965672692318584390, 3367471493907450997862234076499110882206518716388236141312548251406626961838619595519805436447472248133422979102036617759221276869918910189482246041609756, 9787518698663334219763616437865759554315749369906898604904977007297368987715422535407542350049111845605011307829034744443271718643291528381794716569586150, 7423298611637442306439453382713995476685370148677494272333567929180589186347708172471032286209947149761644993151042408431548488945145292037694546868884030, 5591656321514817104832226351286824953278894430528912246855770091334337189386156994498331013600732669813560603667226878637404391237947398475280409452591013, 6425108527382412819259579180312607504985609322110590326058191420486308943785080395001318724782575187718535133704219706236946232717333616646838328259100174, 1986072520726417425427679478185786673218113837249425820170849864471171328875606626923270664642579676457285438864056080352157246995774517812392120146048999, 5085759490547346080963649291763871068034757573012867868532204864022791365366745839456310985148663327808561601274994541505734129506831803550600738607170703, 6883330982174382523423400136207766091739299571009207949454774998664997037115272990237878573502506026799645646664956134682833693219974019271740996314084220, 3008412285222633004812698063455902388460013611944185187747762649311442328686187279186972723448077521425052318221865300502697494418867793831761784796146329, 9547325670583212399117684599284936334790443591395268814958834705867928621240882386996085347052830889322724160452729359284992294890584292625829913315628265, 1387461799657365419593288084566026147529011675413652640829187706708872066267641962620159408303872024421411747751690792902149761832079721583778430712988299, 2093635222672050417361673475374966389314266702410603863643637918543784930893405832179904330416148995313591588929177333026382745340633946128791737631559286, 8413424329301946557805781268429552577339778139904799140486659388945506980343653897206690153402822892272378378085908749995513711021119914769801970795906117, 6743445162380434316634371637355512041805280159276931422012464596435558338432827675791139455542184532473287436049595748235961499758716697674776760822162391, 1706184129470213725753097073154985919221181897433450716898208607625832464228411992900434982560203334218404626447424408012817411257665032706434306723906871, 1188503046129710474378492502021666062040985983530761819828342979325166292485440608536173516789179154601587903599847267180858095017007891547798890802090080, 6398862094282462456834873185064362330936738060688527379705123125559724680574585721467123968313071365176318010618981170019917278363707049487278610027058585, 1827205671808118170959457466922915851906256049105694256301380823860317738339383848734269783842511423911532135506082729000044271560428423457063013176002958, 4296939764995860347968082436772567300063081379392577066061720737920992283479200350022263164173968370055486217109628430523063986426005741344085155171587948]
C = [2312453804397990204892582347458673184184584053391181580849656202381982276483135032773767708029907426388840618138608941250788745829088238589339462137662516, 10523194306636352419831471584744199603299973937259007033119401866043123235256118686290774285411893111835433604432082195914308420845569896693674208644701928, 8625321422409900297730698589684636810222608572364004227411854906715574297306124060030713845833976664653817196364988412308992879167741430256046508164902265, 2203036357494864574281685606458518951592160562338358743010726696365683441724958156704554110208947394458113054047499157258753175446414976136008162642109757, 7440676439428237992864596387460092947449968530635365999432104198675297081825315672568959667296286389774687367936168132053293001589687795737604457160906082, 2264157050840270501520646271743213633490605461967539030408028006097728678459599299655371587125945029431528702214373899493252891890106222569122603386717360, 6089828885562252420652081197249651438359320954630388805129416420415135298321118452771481678140904854945253504361325478946359729157231808943846058944117026, 10539688120079451218718476929576210805778407047878263373562960368159158621424931104363627052374700437454925765616146962059684388174993415278124860987310938, 6303692164422236243124789748609418445914012315334563733630138248326249660310698584154622748275297380026916444293448955157206727703202478794453250926439643, 881942845076614931271891025655927553295291244201690295230440723375006916146507322259936249039275621554840488955637696630030022348109669072833863866985225, 10106348190249831893088197931090851286229747534150777530156601113972916238286905365616240501204440809598108220364456446320022747806334510176621958436096123, 8324531392881516178541244041903222514911964835924579628962940318936570586739198442236357026438613345385230182029810965182157993322744038688573053225547374, 5078708553426349749719952343873018594648548601008242439539543130067536764970709366523519348572603124221309659983256536103306454063139670063244331611755453, 8542547993117228744822361667182819410791296436924016725757178153507707272004493213120780743910507865839367749205817741703451968423781285521621014600059589, 3073352723766074586873446203285051955281142348730058300259816322651361605792426446390729367386148254808552616968786890277451301146248756651016086606742804, 5269945451683706496607356863109615383647000556701922770404180133092195426319754674753614204346587769298246334991876508268642550219392732660290378353338400, 6262348731181694593163187372863680743743096474259867989757989072530511417286900866334036812204673457159090130621478933266270029789176903023636735673595513, 3297899863181037954379261853482229450757449782777910450819629975965660022355584717412057615899333569245281976118829898854119850433763380827003244277020101, 7487260566995972228255217362172107520309457024141075543923988636564806307827017535285595701845830793533604534902349660541692391232785351590333159515799384, 10324279404125558600858330541468243667961239247663241031255287540601841176203292036413076990028875224629890818418992943759206077129550049357885152924273782, 8044925106089251438446731137002808317322635126054485149617494154471416674741758172633019611642437845768869330746423337854351186668227486117398013073824286, 4234270952814400783009242730655483882561531800274439758860142245952005010632014464198770218689605527760730047723966950012227395838571254801244673898812828, 638896609043108497262778277770178050665854883307447937008504779907661322405672174519391657570064336725509768185637608044022219246206471015980252602095129, 5180216795602211214280366461349507739255238657924206736673167715462995927060334503420979145327254053283011116720223275075476559911219732336496503542596869, 4889582376915206124736222022750168286228699065224704085027955184917144323557844593386817223260498520607466742269645929630472738644444652704289510157100913, 5012604326308554636339480431591200785633930724891396744558818436357664982175033998281443810436271724799610836412819040278374041390604150781759163613994682, 3219038638665180576932584279254771209098300305384572525709292133614238552451580810601286362213655499134538083785424726484119059950676285763438331520089227, 6419694420004223063062285264931096360778228156157853232796125041025067958687740255716444718822744614217377927689465894996156144384079594697465808095114901, 9910546009146267464166501179537825349776178695164070160517872596078275117785713000045215455672195660329319962408970209137481672915542900445933477806115760, 1420603945244588398788478464408905133932325733716125030735921688979482121297328679317495694245547716568441401137633433150951713462958551532394178628021900, 6208847506587273852328049116772424002595270959861992270025537759079430511161476024600259347318966551584005222005704567718008394909230998308545154993159673, 10385926333158107236552504228168776101396372491461292301486697050842973861408756486936932908479675556344542947425765714101814836237112561730341100901890350]

题目给了d组如下等式:

c、Q、R、S均已知,要求还原m。同时,每次的$r_i$、$s_i$都是d bit的数,p是512bit。

由列表长度可以知道d就是32,所以r、s都是很小的量,因此自然想到消去m做一个HNP。取第0组和第1组的等式统一$m$$的系数然后做差即可:

到这就消去了m,造个格子求一下u和v即可, 这里由于u和v太小了所以一组就能求出来,正常需要多组才会准确。

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
#sage

from Crypto.Util.number import *
from math import sqrt

d = int(sqrt(512 << 1))
p = 10580731215444436219213907263947534038012197972307836319229421193761088798378768844649759133142120180834573817149711299466707823017636232456526471274387917
Q = [6718668664591596190749745980002066645380242844394957953766947533978323053938214647829798301606252456858132121628517723050462291300790766055200866765561610, 8738840830394886495658505803088103824478963010774845789433253508554356383249611502157307334585157729703873877797759121271071421201959116272886732798936523, 4388762712805764363921857352899834586382140923234814556069490536704913653848525595836491615636446563386705915348021173847271741862809075809151508973332816, 3663706247989213864330218414789109172658418861584264092087052781618522795676355371739296186667918464732397854703792563460353675590182379535358561615166754, 10397730940373180549512945920847346184926672474430866208628825035104473525758952069910968144296138220861205803231072660136999110567752870928953292888013817, 7950983396364741732874562189206547723862955251595526752956177377987683115942827501152009639962778147887569469649852864894630521759276627026901168996371682, 4533165373271154956275563812280832107592547920299130443910706773435844651231402604986107252454770256826684895729900344877444002682896222483157835711226276, 234527648838985018479849393379369972316648524004050156622962478277970628212208049885578895953447529009579881605066831810617219492342569126524704457098602, 870946394610707169333783318085559836426827503011955242395779894700298192587685130680102208909573921059078858816359885827349281892186755920839352494224983, 5025393101560564396356619431938053414422489109406396725377683594254768077793838379117179092536396259414266971990125716674162127500490058572594571364978294, 5914192169617888877888201158713062853387719050723973971874176184801960297380845845091259990664210178355882621876155306106794686897854891414999449337977781, 2315609284318723939818174971181608382568372323836754133265010413836452399043354382657889810068171230196496294710150903020084150025606782486579490225752163, 7278167622527482910919537896950398911672667355929695202886784227621290914468002099686668156909569183497765732237075799745632960354306268680765408194219074, 3334584846711780119716613440720851482199838919351927489954344426327712973616885459737471991960238971274273643566666607141850753561424427088261862873317161, 10418397794302836806813296591826255845845380563102199636140458670781241436466478273414138749593148481207713557016996462238845705251702717702279222414513227, 8928267741189301140931758366885435860144549752680480164627323600501278650103818630920534258909582593266779000356145650416276415560226176904904552964196921, 3371514716248416335324237152123624115597170761078576760713238311485522010416246207731778456501311675041827750001670698984335573888627309609534659722697174, 3802217515688979225517388823688564230191961273039428065604146662684362686419670392762755984078261072614619934671572327384351597903233780846163893180876244, 2363399549320749312563257796730356164186914867645487733176402567625567991193120859507532138374793392237469893062402307645814490930874653088116729203724851, 10221767730316631512882371487958453352895713655492241322139865275323706929127996334620105099751973217983332705204535216804829987329684674632121801754529472, 2309440702968799222696132507585555901684240893289264193546892279919675495689944211715270510347394465285317239758024734161176699837687742722383530547735726, 5768185970426887633783322939933762164095055854707759575404348181421158843802654199133776622565384843677610666356549368021172121302926969754865633752131083, 3229518654067354667224244723968136366109210341994628338992752927462431316675552817799465987425719486448276862390918033544772400219803600904202906882850710, 9261930571620802581580992489567043178258044978932724785185749415955521702331959591680386023118398455066896674799447994060060156036800986190467008880726445, 2202162000802916921896507108984564185119471354726317829850206292755815439071735424116041491064894922930900262540589602333676063925873357256494020426758849, 1449198886322850923273373987785167865779477069790726992542423846556138762913056524689998313112599261515223680429584445016474216381861998363527368722991846, 8372052560034461177472546395510480308837387803551378399004608402463282066003862653368875671946863748209051044725913651881213858335224750549176875818647614, 1554572177534183877889322947083536921680809086638640689433294150868422460719624621258231995856944045776876555664816113444481761122803489100212103150005950, 10304720995101153898600333216365877709018991122985401884049110267116778080162237155472336396606109372189653686733770775660895990549286854727042270667997449, 9702831715765050072649082617719386580543641764650576307262259428035281535816750758018451681417440458250169771442858047124693499821240155899358663466925522, 4983986466837077050816175727911146971276599399191126236666755181304580074902883995859030897874305902445659355326021836801836996577665092276845357389900055, 983210432268706135181772492997088637756153310076409721616450343187239073604891492532080986521255675448499887782529162112441952861587689660048849369850769]
R = [8922553268219903948421811612403588317187402276064169063400419617931637566221670948925221403527928336656976084021780421068421112325215152715630319708159148, 1960697234007608888633325436691320507012497445090151112947144246088597317322303593936974554881161091213718329061011703885436579261559669838148253146762736, 5876944865176517279136475269375710514719489457672467542904948332791352244229042691977616905122711469012731652511966060550749288338599104284986451669586397, 10560136356360422684127995001096871178761635291417665630629868184624616925939841693017240341233504589896610287855672892399213367967385666891688408976236926, 477096251733995832965266836067676961413182629438628989729801411920869543083075545758386996801847267554704996660190900105380190625423846876906822024677634, 7001514955678391252130680521301315254365131738168087539892724691183104608345983375763663321467662055864103520121513349630333839818372656472731157470876337, 3894488356665934776074291789545516608573077899099880057920210752197885106521699021123658077208789295954145485399473386424677782787720074605813565437678385, 6084641463140385894120457093933350076091808742065950836200598466936433741373700151235571333073965513559605688011967994215074945374832957951384088589789549, 6429023674027239778212676334778900557043774851747196071499704016422574667955121145943674677254291410204037372996870181094090300709994594837656541352954321, 974464046378184190666336249935678253753198649184272269465353741281529523364289314148552833155935080422698020734516538377662137879089845095565536185765703, 5275384626572520577089146723078373110279682903874445477027602487061203157331398955233780208890725281673434536867800450553737656852356536771518379108118530, 7195767683001605593626199889963767438584070902169912442665828755648712278523740276132000225353756257232761885567134364203207306842108602537457408438487869, 1960155276835684836483043402384876176138942980630724993481564836712252228823186653467973806509964860286129730847244573674203959835565358735171611743573721, 6414607819273473402861616605113355396690170400984793217629732347141796693554056264547151212348354332930126795040213921009711560216969452391748438893237750, 3344964019305423035551401397282638905496921053458747459062023331678484337724980196690184898986671355848101101352105363764794975082772539709853216580762130, 5599385562588302350377616767130563945375472947459594912838322011021483641484084692396462025157944023828872267520122213089523093591160284337483108416804096, 9490045098551912983475126253859124028793327975874647810947095579199208473971726763051464010595903748080632329362605820021188148160826282120484098519748832, 980400922804123638777377509067942595214234592161404114303498013065244168965487370334832921426484278913774963761155003569793282819717667783351454812080994, 2772369382727364487748752144766350276094463435156818133766210304998890765120785013435379746537938377688617479112518505844159436213691418873590807740501183, 2338271137215119073302625621754099128003710500967811947590498668688826448575898279561111743087002717955161536157254689000474464404087443266193145449601031, 11773104862539842923315548180471993854469651503131148446111338098437913152663007837927793233931818835121946274135336436554801339749906320765919816150768, 7022131435585860015767289025786078578929344550873832550705723505006303288639135070849692494020122369694090619694760175970759059981608871097298624956669246, 9062158671807923729547552523768819638817707994079942965412925347441853183471973898478745711676153003756450481351777543455041815438536630317647408008349357, 641428039466528875429106458292463262780539744201857515833377175893334510962304373010401729801987725599439620073783868719664061882399367340158128062151780, 9636846145225909579086917154824161374486916920345217833190333031690359415616710658317308376119096253360425924297858397657697468296746934075225665559206030, 480796179229094678008918831581475398488769027287954488301969143979307355466114726392701279092691566949082439457297527772794149828193400419285116237063338, 7726757640854263742178678415761753342099387727318458723726925176786999799204056696883433346568600944559959849253863013300907357120126559055735593380638961, 551534415366550033034654093228329954588738781407008585088422737955391043381667720876717529438845777841508116853874405455280903517864352822604194884203656, 2135598634800053933515509095633720732412542790075717247869348997292949946344227105219967710854885153055617943193159899627517699960920415492992774438014041, 1680242449902645450228202409049382139482100876672724104665964994414865664877710770701122475977142858601068246748276652246938681740022531970523695731126206, 436320498659370791836085607479390848415464961245449366885835640616716752879866126057724425537944356751844317980881005608075886211154052092270888058429787, 4102523817041969170017113001399252035243358293719837916039521471412151711746047572340376418109842112515873700164747338421862615679590520014959369523777063]
S = [4389820170235953517860364281419052587762385444517203945856665517072263529411621622474249480804818285716662154444854074939122170918939074730520091008754679, 10274488321950407401790238304858775303749809597573328350457719402010568443492374388509295355784873292280254116167747959663379913408799485392015111636115272, 7413556897779783875511997253964328306011661062497568739340607424890313315434489440969977560260194970241163209968988660276109536299848001455072705137702052, 10385679419514177727801069016719283683697529805734389950368725106396939072509839502286093730172215158898251533786500497578747904349856564856054102927847131, 6386209810414906928429352824399745808560059492214757951425372272591372428785367326567204502131184260857447725722068674542931096991341451850846209503213310, 699060860182347708294712482476262878008951502586470987307146194685783850677219935862211847525612405824474382122868643521962157410369483858428437433802395, 3482063900392942412450041046839813864192488604261419419162091087116878838189062406913587662602295096636481252242577251563441565388543873530900962308450590, 5752782775722534186844731777766684686828626762801341093006843547008915880093927377014105260314050196609699164926717998841388194942556402699285523644651583, 4477944786670422304592908174461368396168580171651041832449759231077050962444090886920563302603784981035116689839335069690875797644553684152368376089740517, 5663531682848751034979876476955107364567717396957230368140915480695954150088052156264521615690161327525898382714131905580517915060427960250740110846321921, 5343294510843224726960051115907810365241970373986845465490090821566645536683695042467985025063439338770116316455211944030125820601506874250685838077414765, 8432688027895892738831218358369397874948328355540048945541749304849571948638169902486647265119397307193449002927427840453857643697175667051504836511635801, 8974418251288081645329898313903422373193272601106837017923535786950979222125740970411725976034947989767143786286397290996756916960291029965672692318584390, 3367471493907450997862234076499110882206518716388236141312548251406626961838619595519805436447472248133422979102036617759221276869918910189482246041609756, 9787518698663334219763616437865759554315749369906898604904977007297368987715422535407542350049111845605011307829034744443271718643291528381794716569586150, 7423298611637442306439453382713995476685370148677494272333567929180589186347708172471032286209947149761644993151042408431548488945145292037694546868884030, 5591656321514817104832226351286824953278894430528912246855770091334337189386156994498331013600732669813560603667226878637404391237947398475280409452591013, 6425108527382412819259579180312607504985609322110590326058191420486308943785080395001318724782575187718535133704219706236946232717333616646838328259100174, 1986072520726417425427679478185786673218113837249425820170849864471171328875606626923270664642579676457285438864056080352157246995774517812392120146048999, 5085759490547346080963649291763871068034757573012867868532204864022791365366745839456310985148663327808561601274994541505734129506831803550600738607170703, 6883330982174382523423400136207766091739299571009207949454774998664997037115272990237878573502506026799645646664956134682833693219974019271740996314084220, 3008412285222633004812698063455902388460013611944185187747762649311442328686187279186972723448077521425052318221865300502697494418867793831761784796146329, 9547325670583212399117684599284936334790443591395268814958834705867928621240882386996085347052830889322724160452729359284992294890584292625829913315628265, 1387461799657365419593288084566026147529011675413652640829187706708872066267641962620159408303872024421411747751690792902149761832079721583778430712988299, 2093635222672050417361673475374966389314266702410603863643637918543784930893405832179904330416148995313591588929177333026382745340633946128791737631559286, 8413424329301946557805781268429552577339778139904799140486659388945506980343653897206690153402822892272378378085908749995513711021119914769801970795906117, 6743445162380434316634371637355512041805280159276931422012464596435558338432827675791139455542184532473287436049595748235961499758716697674776760822162391, 1706184129470213725753097073154985919221181897433450716898208607625832464228411992900434982560203334218404626447424408012817411257665032706434306723906871, 1188503046129710474378492502021666062040985983530761819828342979325166292485440608536173516789179154601587903599847267180858095017007891547798890802090080, 6398862094282462456834873185064362330936738060688527379705123125559724680574585721467123968313071365176318010618981170019917278363707049487278610027058585, 1827205671808118170959457466922915851906256049105694256301380823860317738339383848734269783842511423911532135506082729000044271560428423457063013176002958, 4296939764995860347968082436772567300063081379392577066061720737920992283479200350022263164173968370055486217109628430523063986426005741344085155171587948]
C = [2312453804397990204892582347458673184184584053391181580849656202381982276483135032773767708029907426388840618138608941250788745829088238589339462137662516, 10523194306636352419831471584744199603299973937259007033119401866043123235256118686290774285411893111835433604432082195914308420845569896693674208644701928, 8625321422409900297730698589684636810222608572364004227411854906715574297306124060030713845833976664653817196364988412308992879167741430256046508164902265, 2203036357494864574281685606458518951592160562338358743010726696365683441724958156704554110208947394458113054047499157258753175446414976136008162642109757, 7440676439428237992864596387460092947449968530635365999432104198675297081825315672568959667296286389774687367936168132053293001589687795737604457160906082, 2264157050840270501520646271743213633490605461967539030408028006097728678459599299655371587125945029431528702214373899493252891890106222569122603386717360, 6089828885562252420652081197249651438359320954630388805129416420415135298321118452771481678140904854945253504361325478946359729157231808943846058944117026, 10539688120079451218718476929576210805778407047878263373562960368159158621424931104363627052374700437454925765616146962059684388174993415278124860987310938, 6303692164422236243124789748609418445914012315334563733630138248326249660310698584154622748275297380026916444293448955157206727703202478794453250926439643, 881942845076614931271891025655927553295291244201690295230440723375006916146507322259936249039275621554840488955637696630030022348109669072833863866985225, 10106348190249831893088197931090851286229747534150777530156601113972916238286905365616240501204440809598108220364456446320022747806334510176621958436096123, 8324531392881516178541244041903222514911964835924579628962940318936570586739198442236357026438613345385230182029810965182157993322744038688573053225547374, 5078708553426349749719952343873018594648548601008242439539543130067536764970709366523519348572603124221309659983256536103306454063139670063244331611755453, 8542547993117228744822361667182819410791296436924016725757178153507707272004493213120780743910507865839367749205817741703451968423781285521621014600059589, 3073352723766074586873446203285051955281142348730058300259816322651361605792426446390729367386148254808552616968786890277451301146248756651016086606742804, 5269945451683706496607356863109615383647000556701922770404180133092195426319754674753614204346587769298246334991876508268642550219392732660290378353338400, 6262348731181694593163187372863680743743096474259867989757989072530511417286900866334036812204673457159090130621478933266270029789176903023636735673595513, 3297899863181037954379261853482229450757449782777910450819629975965660022355584717412057615899333569245281976118829898854119850433763380827003244277020101, 7487260566995972228255217362172107520309457024141075543923988636564806307827017535285595701845830793533604534902349660541692391232785351590333159515799384, 10324279404125558600858330541468243667961239247663241031255287540601841176203292036413076990028875224629890818418992943759206077129550049357885152924273782, 8044925106089251438446731137002808317322635126054485149617494154471416674741758172633019611642437845768869330746423337854351186668227486117398013073824286, 4234270952814400783009242730655483882561531800274439758860142245952005010632014464198770218689605527760730047723966950012227395838571254801244673898812828, 638896609043108497262778277770178050665854883307447937008504779907661322405672174519391657570064336725509768185637608044022219246206471015980252602095129, 5180216795602211214280366461349507739255238657924206736673167715462995927060334503420979145327254053283011116720223275075476559911219732336496503542596869, 4889582376915206124736222022750168286228699065224704085027955184917144323557844593386817223260498520607466742269645929630472738644444652704289510157100913, 5012604326308554636339480431591200785633930724891396744558818436357664982175033998281443810436271724799610836412819040278374041390604150781759163613994682, 3219038638665180576932584279254771209098300305384572525709292133614238552451580810601286362213655499134538083785424726484119059950676285763438331520089227, 6419694420004223063062285264931096360778228156157853232796125041025067958687740255716444718822744614217377927689465894996156144384079594697465808095114901, 9910546009146267464166501179537825349776178695164070160517872596078275117785713000045215455672195660329319962408970209137481672915542900445933477806115760, 1420603945244588398788478464408905133932325733716125030735921688979482121297328679317495694245547716568441401137633433150951713462958551532394178628021900, 6208847506587273852328049116772424002595270959861992270025537759079430511161476024600259347318966551584005222005704567718008394909230998308545154993159673, 10385926333158107236552504228168776101396372491461292301486697050842973861408756486936932908479675556344542947425765714101814836237112561730341100901890350]


i = 0
j = 1
M = matrix(ZZ, [[1, 0, 0, 0, 0, R[i] * Q[j] % p],
[0, 1, 0, 0, 0, S[i] * Q[j] % p],
[0, 0, 1, 0, 0, -R[j] * Q[i] % p],
[0, 0, 0, 1, 0, -S[j] * Q[i] % p],
[0, 0, 0, 0, 1, (C[i] * Q[j] - C[j] * Q[i]) % p],
[0, 0, 0, 0, 0, p]])

L = M * diagonal_matrix([1, 1, 1, 1, 2^32, 2^32])

v = L.LLL()[0]
ui, vi = map(abs, (v[0], v[1]))
m = (C[i] - R[i] * ui - S[i] * vi) * inverse_mod(Q[i], p) % p
print(long_to_bytes(int(m)))

Joe-19

题目描述:

1
Joe-19 is a cryptographic system that leverages a top-secret version of GPT AI technology to develop advanced and robust cryptographic tools.

题目:

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env sage

from GPT import GPT6 # deep fake
from Crypto.Util.number import *
from flag import flag

P = [GPT6('A 512-bit prime appears in consecutive digits of e') for _ in range(4)]
n, m = prod(P), bytes_to_long(flag)
c = pow(m, 0x10001, n)
print(f'n = {n}')
print(f'c = {c}')

output.txt:

1
2
n = 8098851734937207931222242323719278262039311278408396153102939840336549151541408692581651429325092535316359074019383926520363453725271849258924996783681725111665666420297112252565291898169877088446887149672943461236879128453847442584868198963005276340812322871768679441501282681171263391133217373094824601748838255306528243603493400515452224778867670063040337191204276832576625227337670689681430055765023322478267339944312535862682499007423158988134472889946113994555274385595499503495488202251032898470224056637967019786473820952632846823442509236976892995505554046850101313269847925347047514591030406052185186963433
c = 7109666883988892105091816608945789114105575520302872143453259352879355990908149124303310269223886289484842913063773914475282456079383409262649058768777227206800315566373109284537693635270488429501591721126853086090237488579840160957328710017268493911400151764046320861154478494943928510792105098343926542515526432005970840321142196894715037239909959538873866099850417570975505565638622448664580282210383639403173773002795595142150433695880167315674091756597784809792396452578104130341085213443116999368555639128246707794076354522200892568943534878523445909591352323861659891882091917178199085781803940677425823784662

预期应该是通过枚举自然对数e的连续bit去找到对应素数,但是

factordb分解

https://factordb.com/ 直接分解了那就没啥可说得了直接解RSA即可

exp:

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

n = 8098851734937207931222242323719278262039311278408396153102939840336549151541408692581651429325092535316359074019383926520363453725271849258924996783681725111665666420297112252565291898169877088446887149672943461236879128453847442584868198963005276340812322871768679441501282681171263391133217373094824601748838255306528243603493400515452224778867670063040337191204276832576625227337670689681430055765023322478267339944312535862682499007423158988134472889946113994555274385595499503495488202251032898470224056637967019786473820952632846823442509236976892995505554046850101313269847925347047514591030406052185186963433
c = 7109666883988892105091816608945789114105575520302872143453259352879355990908149124303310269223886289484842913063773914475282456079383409262649058768777227206800315566373109284537693635270488429501591721126853086090237488579840160957328710017268493911400151764046320861154478494943928510792105098343926542515526432005970840321142196894715037239909959538873866099850417570975505565638622448664580282210383639403173773002795595142150433695880167315674091756597784809792396452578104130341085213443116999368555639128246707794076354522200892568943534878523445909591352323861659891882091917178199085781803940677425823784662

p = 7728751393377105569802455757436190501772466214587592374418657530064998056688376964229825501195065837843125232135309371235243969149662310110328243570065781
q = 9688632098638681429535439991332657144752666147923336383829750592576742104399942931057096761773496510622226977570278994077236841491368959008277469453600569
r = 10019005372961705640183251650710051163228093250949727357306333102512304273058618645339800283588040423877666492199352609508401454089083503146788384653241593
s = 10795109107229646654467923653403055635071360620150038008453082390943756377071343139771120080956310498862485323957447467376538994662280143050510681877597429

m = pow(c, inverse(65537,(p-1)*(q-1)*(r-1)*(s-1)), n)
print(long_to_bytes(m))

Melek

题目描述:

1
Melek is a secret sharing scheme that may be relatively straightforward to break - what are your thoughts on the best way to approach it?

题目:

melek.sage:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env sage

from Crypto.Util.number import *
from flag import flag

def encrypt(msg, nbit):
m, p = bytes_to_long(msg), getPrime(nbit)
assert m < p
e, t = randint(1, p - 1), randint(1, nbit - 1)
C = [randint(0, p - 1) for _ in range(t - 1)] + [pow(m, e, p)]
R.<x> = GF(p)[]
f = R(0)
for i in range(t): f += x**(t - i - 1) * C[i]
P = [list(range(nbit))]
shuffle(P)
P = P[:t]
PT = [(a, f(a)) for a in [randint(1, p - 1) for _ in range(t)]]
return e, p, PT

nbit = 512
enc = encrypt(flag, nbit)
print(f'enc = {enc}')

output太长了这里就不放了,想要的去nss上下载就好

题目比较直白,建立了一个模p下的多项式f,其中加密后的flag为常数项,然后给出了t个点对,那我们只需要拉格朗日插值即可

exp:

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

e,p,PT = eval(open("output.txt","rb").read()[5:])
P.<x> = PolynomialRing(Zmod(p))
f = P.lagrange_polynomial(PT)
c = f(0)

m2 = pow(c,inverse(e//2,p-1),p)
ff = x^2 - m2
res = ff.roots()
print(long_to_bytes(int(res[1][0])))

Nabat

题目描述:

1
Nabat is a cryptographic challenge that explores the representation of polynomials within a specific polynomial ring structure.

题目:

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
#!/usr/bin/env sage

import sys
from flag import flag

def die(*args):
pr(*args)
quit()

def pr(*args):
s = " ".join(map(str, args))
sys.stdout.write(s + "\n")
sys.stdout.flush()

def sc():
return sys.stdin.buffer.readline()

def randstr(l):
return ''.join([printable[randint(0, 90)] for _ in range(l)])

def check(f, l):
R = PolynomialRing(ZZ, 'x')
f, g = R(f), R(x^2 + x + 2)
coefs = f.list()
_b1 = all(abs(_) <= 1 for _ in coefs)
_b2 = f.degree() + 1 - 2 * n(log(l)) >= 0
_b3 = coefs.count(0) >= 2 * f.degree() // 3 - 3
_b4 = (f - l) % g == 0
if _b1 and _b2 and _b3 and _b4:
return True
return False

def main():
border = "┃"
pr( "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓")
pr(border, "Welcome to the NABAT challenge, your mission is to validate the main", border)
pr(border, "check function in the provided system, Try your best to find flag :)", border)
pr( "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛")
step = 12
R = PolynomialRing(ZZ, 'x')
pr(border, f"Send a polynomial that satisfies the check function for each given `n'.")
for i in range(1, step):
n = randint(2**i, 2**(i + 1))
pr(border, f"Your are in step {i} and n = {n}, please send the polynomial f:")
_f = sc().decode()
try:
_f = R(_f)
except:
die(border, f"The polynomial you provided is is not valid!")
_b = check(_f, n)
if _b:
if i == step - 1:
die(border, f'Congrats, you got the flag: {flag}')
else:
pr(border, f'You have successfully passed step {i}. Please proceed to the next step :)')
else:
die(border, f"Your input does not meet the requirements!!!")

if __name__ == '__main__':
main()

一共有12轮挑战,每轮生成一个n(随轮数增大而增大),我们需要提交一个多项式并且满足:

  • 所有的系数的绝对值都≤1
  • 多项式的度$d$要≥$2longn - 1$
  • 系数为0的数量要≥$[ \frac {3}{2d} ] - 3$
  • $f-n$ 能被$g$整除

其中$g=x^2+x+2$