[原创]GDG Algiers CTF两道矩阵题wp
2022-10-28 23:48:18 Author: bbs.pediy.com(查看原文) 阅读量:21 收藏

[原创]GDG Algiers CTF两道矩阵题wp

2天前 1082

[原创]GDG Algiers CTF两道矩阵题wp

两道矩阵相关的题,感觉可以整理一下下 :)

the_matrix

首先选定一个大素数,生成内的随机值

经过SHA256的处理得到key,再用AES通过key加密明文。

题目给定了两个12x12矩阵,满足

AES的初始向量已知,因此需要求

,有

,则

其中的阶。

先求离散对数,然后求解同余方程组即可。

由于,猜测可以唯一确定

计算之后发现,不是就是

于是我选取,此时 直接唯一确定。

python sln.py

CyberErudites{Di4g0n4l1zabl3_M4tric3s_d4_b3st}

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

import json

from Crypto.Hash import SHA256

from Crypto.Cipher import AES

from Crypto.Util.Padding import pad

p = 12143520799543738643

vD = [37, 31, 29, 23, 19, 17, 13, 11, 7, 5, 3, 2]

vP = [6751925379844785295, 11256715989719283883, 4551561838026472495, 11383130904596697638, 8534299476177021992, 11184828239802784209, 7103104085280766875, 1622643043767580331, 11104789109564474465, 1502559189506368871, 522368022672629021, 1590703325067650792]

K = 7619698002081645976

key = SHA256.new(data=str(K).encode()).digest()[:2**8]

with open("encrypted_flag.txt", "r") as ff:

    data_dict = json.load(ff)

    iv = bytes.fromhex(data_dict["iv"])

    ciphertext = bytes.fromhex(data_dict["ciphertext"])

cipher = AES.new(key, AES.MODE_CBC, iv)

flag = cipher.decrypt(ciphertext).decode()[:46]

print(flag)

franklin-last-words

选取大质数和一个大随机数,公钥,加密

和密文都已知,但难以求出

注意到题中所给太小,如果知道至少2个明文密文对,猜测可以构造出其他的多项式值(flag以CyberErudites开头)。

考虑明文和矩阵与方程

其中是构造明文。

如果有模意义的逆,就可以求出

,从而

所以

由于都很大,较小(明文是ASCII),于是应当总是有模逆元,可以大胆求

我选取明文即为'C','y',然后打表对照输出解密。

python sln.py

CyberErudites{Fr4nkl1n_W3_n33d_an0th3R_S3450N_A54P}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

from sage.all import Matrix, IntegerModRing

from message import N, e, ct

def poly(num):

    return [(3*pow(num, 3, N)) % N, (3*pow(num, 6, N)) % N]

def v2polyv(v, num):

    return (v - R_3 - pow(num, 9, N)) % N

def polyv2v(v, num):

    return (v + R_3 + pow(num, 9, N)) % N

def gen(num):

    V2 = Matrix(IntegerModRing(N), [poly(num)])

    V1 = V2 * T_

    v = (poly_C*V1[0][0] + poly_y*V1[0][1]) % N

    table[polyv2v(v, num)] = chr(num)

table = {}

R_3 = ct[0]

prefix = b"CyberErudites{}"

T = Matrix(IntegerModRing(N), [poly(int(prefix[0])), poly(int(prefix[1]))])

T_ = T.inverse()

poly_C = v2polyv(ct[1], ord('C'))

poly_y = v2polyv(ct[2], ord('y'))

for num in range(32, 126):

    gen(num)

print("".join([table[v] for v in ct[1:]]))

[2022冬季班]《安卓高级研修班(网课)》月薪三万班招生中~

最后于 2小时前 被狗敦子编辑 ,原因: 出现了莫名其妙的附件问题

上传的附件:
  • the_matrix.zip (3.94kb,0次下载)
  • franklin-last-words.zip (5.91kb,0次下载)

文章来源: https://bbs.pediy.com/thread-274904.htm
如有侵权请联系:admin#unsafe.sh