CryptoFox 2025¶
Olympiad mật mã và bảo mật thông tin CryptoFox 2025.
Số thứ tự |
Tên bài |
Tình trạng |
---|---|---|
0 |
Хакерская атака |
Chưa giải |
1 |
Кривизна функции |
Giải một phần ý 1 |
2 |
Странная вселенная |
Chưa giải |
3 |
Магическая шкатулка |
Chưa giải |
4 |
Разности для FOX128 |
Hoàn thành ý 1 |
5 |
Шифрование в RSA |
Hoàn thành |
6 |
Подозрительная фотография |
Chưa giải |
7 |
Замены и перестановки |
Hoàn thành |
8 |
Загадочная ошибка |
Chưa giải |
9 |
Генератор гаммы на основе XSL-схемы |
Chưa giải |
10 |
Регистровое преобразование |
Chưa giải |
11 |
Трудный PBKDF |
Chưa giải |
Giới thiệu¶
Đầu tiên mình xin phép có một số ý kiến về việc trình bày đề thi. Đề thi có một điểm khá khó chịu là không được biên tập thống nhất. Mình hiểu rằng có nhiều người ra đề nhưng ít nhất cũng phải có người chịu trách nhiệm biên tập lại đề mỗi câu chứ. Kí hiệu ở mỗi câu mỗi khác nhau làm mất tính thống nhất của một cuộc thi. Ví dụ, ở câu 1 dùng \(1 \leq \sigma(f)\), còn câu 2 dùng \(\alpha, \beta \geqslant 0\), khác cách viết dấu bằng ở bất đẳng thức. Một ví dụ khác là kí hiệu trường hữu hạn, ở câu 1 dùng \(\mathbb{Z}_p\) nhưng câu 4 lại dùng \(\mathbb{F}_{2^8}\). Trong trường hợp này mình nghĩ nên thống nhất dùng \(\mathrm{GF}(p)\) và \(\mathrm{GF}(2^8)\), hoặc \(\mathbb{F}_p\) và \(\mathbb{F}_{2^8}\), sẽ hợp lí hơn. Sự không thống nhất cuối cùng còn ở chỗ mỗi đề có font chữ, cỡ chữ khác nhau, thậm chí có đề đánh số trang nhưng có đề không. Vì lý do trên nên khi viết lại đề, mình sẽ thay đổi kí hiệu cho thống nhất.
Về phần nội dung trong đề thì có 4 câu về reverse engineering (câu 0, câu 3, câu 6 và câu 8), còn lại 7 câu về mật mã. Các câu reverse engineering cũng là những thuật toán mật mã được giấu bên trong chương trình. Với kinh nghiệm hạn hẹp về reverse engineering thì mình không làm được những bài đó. =)))
Задача 0. Хакерская атака¶
Đây là một bài reverse engineering, và mình không biết làm. :)
Задача 1. Кривизна функции¶
Câu hỏi¶
Đặt \(p\) là số nguyên tố, \(p \geqslant 3\), \(\mathbb{F}_p = \{ 0, 1, \ldots, p \}\) là trường hữu hạn modulo \(p\), \(\gamma = e^{\frac{2\pi i}{p}}\) là nghiệm phức primitive bậc \(p\) của \(1\).
Với ánh xạ \(f: \mathbb{F}_p \to \{ 0, 1 \}\) và với phần tử \(a \in \mathbb{F}_p\) ta định nghĩa số
Ta định nghĩa curvature của hàm \(f\) là đại lượng
Chứng minh rằng
và chặn dưới đạt dấu bằng khi và chỉ khi \(f\) là hàm hằng.
Chứng minh rằng, nếu \(p = 2^{k+1} - 1\) và ánh xạ \(f_t\), với \(t = 0, 1, \ldots, k\), biến đổi từng phần tử \(x \in \mathbb{F}_p\) theo nghĩa \(f_t(x) = x_t \in \{ 0, 1 \}\), trong đó \(x_t\) là biểu diễn nhị phân của \(x\), hay
thì ta có bất đẳng thức
Gợi ý cho câu 2: sử dụng tổng Vinogradnova I.M. là
với mọi số tự nhiên \(p\) và \(N\).
[TODO] Giải¶
Bài này mình giải được một phần câu 1.
Sử dụng biến đổi Fourier rời rạc, đặt
Đặt \(U_a = p \cdot \nu_a(f)\) thì ta có
với \(a = 0, 1, \ldots, p - 1\).
Khi đó, theo biến đổi Fourier rời rạc ngược có thể thấy liên hệ giữa dãy \(\{ u_ x \}\) theo \(\{ U_ a \}\) là
với \(x = 0, 1, \ldots, p - 1\).
Theo định lí Parceval thì
hay
Sử dụng bất đẳng thức Cauchy, với hai vector bất kì
ta có
Cho \(s_i = 1\) và \(t_i = \left| \nu_f(i) \right|\) với \(i = 0, 1, \ldots, p - 1\) ta có
Do \(f: \mathbb{F}_p \to \{ 0, 1 \}\) nên \((-1)^{f(x)} \in \{ -1, 1 \}\), suy ra \(\left|(-1)^{f(x)}\right|^2 = 1\) với mọi \(x = 0, 1, \ldots, p - 1\).
Như vậy bất đẳng thức trên có thể thu được
tương đương với
Dấu bằng xảy ra khi và chỉ khi \(\left| \nu_f(a) \right|\) là hằng số nhưng dễ thấy điều này không thể xảy ra. Do đó có thể kết luận
Задача 2. Странная вселенная¶
Câu hỏi¶
Trong một vũ trụ lạ thường nọ, gọi là Strange Universe, chúng ta thực hiện các thí nghiệm quantum.
Kết thúc một thí nghiệm, chúng ta nhận được toán tử quantum \(A\) và các trạng thái quantum \(\lvert x \rangle\) và \(\lvert y \rangle\), ở đây
với \(\alpha, \beta \geqslant 0\) và \(\alpha + \beta = 1\). Chúng ta muốn tiếp tục thí nghiệm nhưng các thiết bị đã hỏng.
Chúng ta sử dụng một kênh truyền quantum để trao đổi thông tin, và chúng ta cần trả lời các câu hỏi sau:
Trong Strange Universe, giao thức mật mã BB84 có không an toàn không? Nếu có thì điều kiện nào khiến việc này xảy ra?
Trong Strange Universe, giao thức mật mã E91 có không an toàn không? Nếu có thì điều kiện nào khiến việc này xảy ra?
Trong Strange Universe có tính chất thú vị nào khác của kênh truyền quantum không?
[TODO] Giải¶
Задача 3. Магическая шкатулка¶
Lại một bài reverse engineering khác và mình cũng không làm ra.
Задача 4. Разности для FOX128¶
Câu hỏi¶
Grisha phát triển một thuật toán mã khối là FOX128.
Đặt \(V_{16}(2^8)\) là không gian vector có số chiều bằng \(16\) trên trường \(\mathbb{F}_{2^8}\).
Đặt \(S(X)\) là nhóm symmetric, tác độ lên tập hữu hạn \(X\).
Phép biến đổi không tuyến tính của FOX128 là hoán vị \(\pi'\). Khi đó với
ta sẽ có
với \(\pi \in S(\mathbb{F}_{2^8})\).
Hoán vị \(\pi\) có thể được viết dưới dạng
như sau
\(0\) |
\(1\) |
\(2\) |
\(3\) |
\(4\) |
\(5\) |
\(6\) |
\(7\) |
\(8\) |
\(9\) |
\(10\) |
\(11\) |
\(12\) |
\(13\) |
\(14\) |
\(15\) |
|
\(0\) |
\(252\) |
\(238\) |
\(221\) |
\(17\) |
\(207\) |
\(110\) |
\(49\) |
\(22\) |
\(251\) |
\(196\) |
\(250\) |
\(218\) |
\(35\) |
\(197\) |
\(4\) |
\(77\) |
\(1\) |
\(233\) |
\(119\) |
\(240\) |
\(219\) |
\(147\) |
\(46\) |
\(153\) |
\(186\) |
\(23\) |
\(54\) |
\(241\) |
\(187\) |
\(20\) |
\(205\) |
\(95\) |
\(193\) |
\(2\) |
\(249\) |
\(24\) |
\(101\) |
\(90\) |
\(226\) |
\(92\) |
\(239\) |
\(33\) |
\(129\) |
\(28\) |
\(60\) |
\(66\) |
\(139\) |
\(1\) |
\(142\) |
\(79\) |
\(3\) |
\(5\) |
\(132\) |
\(2\) |
\(174\) |
\(227\) |
\(106\) |
\(143\) |
\(160\) |
\(6\) |
\(11\) |
\(237\) |
\(152\) |
\(127\) |
\(212\) |
\(211\) |
\(31\) |
\(4\) |
\(235\) |
\(52\) |
\(44\) |
\(81\) |
\(234\) |
\(200\) |
\(72\) |
\(171\) |
\(242\) |
\(42\) |
\(104\) |
\(162\) |
\(253\) |
\(58\) |
\(206\) |
\(204\) |
\(5\) |
\(181\) |
\(112\) |
\(14\) |
\(86\) |
\(8\) |
\(12\) |
\(118\) |
\(18\) |
\(191\) |
\(114\) |
\(19\) |
\(71\) |
\(156\) |
\(183\) |
\(93\) |
\(135\) |
\(6\) |
\(21\) |
\(161\) |
\(150\) |
\(41\) |
\(16\) |
\(123\) |
\(154\) |
\(199\) |
\(243\) |
\(145\) |
\(120\) |
\(111\) |
\(157\) |
\(158\) |
\(178\) |
\(177\) |
\(7\) |
\(50\) |
\(117\) |
\(25\) |
\(61\) |
\(255\) |
\(53\) |
\(138\) |
\(126\) |
\(109\) |
\(84\) |
\(198\) |
\(128\) |
\(195\) |
\(189\) |
\(13\) |
\(87\) |
\(8\) |
\(223\) |
\(245\) |
\(36\) |
\(169\) |
\(62\) |
\(168\) |
\(67\) |
\(201\) |
\(215\) |
\(121\) |
\(214\) |
\(246\) |
\(124\) |
\(34\) |
\(185\) |
\(3\) |
\(9\) |
\(224\) |
\(15\) |
\(236\) |
\(222\) |
\(122\) |
\(148\) |
\(176\) |
\(188\) |
\(220\) |
\(232\) |
\(40\) |
\(80\) |
\(78\) |
\(51\) |
\(10\) |
\(74\) |
\(10\) |
\(167\) |
\(151\) |
\(96\) |
\(115\) |
\(30\) |
\(0\) |
:math:` 98` |
\(68\) |
\(26\) |
\(184\) |
\(56\) |
\(130\) |
\(100\) |
\(159\) |
\(38\) |
\(65\) |
\(11\) |
\(173\) |
\(69\) |
\(70\) |
\(146\) |
\(39\) |
\(94\) |
\(85\) |
\(47\) |
\(140\) |
\(163\) |
\(165\) |
\(125\) |
\(105\) |
\(213\) |
\(149\) |
\(59\) |
\(12\) |
\(7\) |
\(88\) |
\(179\) |
\(64\) |
\(134\) |
\(172\) |
\(29\) |
\(247\) |
\(48\) |
\(55\) |
\(107\) |
\(228\) |
\(136\) |
\(217\) |
\(231\) |
\(137\) |
\(13\) |
\(225\) |
\(27\) |
\(131\) |
\(73\) |
\(76\) |
\(63\) |
\(248\) |
\(254\) |
\(141\) |
\(83\) |
\(170\) |
\(144\) |
\(202\) |
\(216\) |
\(133\) |
:math:` 97` |
\(14\) |
\(32\) |
\(113\) |
\(103\) |
\(164\) |
\(45\) |
\(43\) |
\(9\) |
\(91\) |
\(203\) |
\(155\) |
\(37\) |
\(208\) |
\(190\) |
\(229\) |
\(108\) |
\(82\) |
\(15\) |
\(89\) |
\(166\) |
\(116\) |
\(210\) |
\(230\) |
\(244\) |
\(180\) |
\(192\) |
\(209\) |
\(102\) |
\(175\) |
\(194\) |
\(57\) |
\(75\) |
\(99\) |
\(182\) |
Ở bảng trên, phần tử hàng \(i\) và cột \(j\) (\(0 \leqslant i, j \leqslant 15\)) là giá trị \(\pi(16 i + j)\).
Phép biến đổi tuyến tính của phần tử \(\alpha = (\alpha_1, \ldots, \alpha_{16})\) với \(\alpha \in V_{16}(2^8)\) được kí hiệu là \(h\). Khi đó với phần tử \(\alpha = (\alpha_1, \ldots, \alpha_{16})\) ta chuyển thành dạng ma trận
Khi đó \(h(\alpha)\) là ma trận \(B\), được tính theo công thức:
với phép cộng và nhân được thực hiện giống phép cộng và nhân trên các phần tử của trường.
Phép cộng với khóa \(k\) là ánh xạ có dạng
với \(\oplus\) là toán tử cộng từng bit theo modulo \(2\) (phép XOR), và \(\alpha, k \in V_{16}(2^8)\).
Khi đó, hàm mã hóa đối với bản rõ \(\alpha \in V_{16}(2^8)\) có dạng
Grisha sử dụng mode ECB để mã hóa từ ПРИВЕДЕНИЕ. Ở đây anh ấy dùng bảng sau để encode kí tự tiếng Nga sang phần tử thuộc \(\mathbb{F}_{2^8}\) và để gọn mình sẽ viết ở dạng thập phân.
А |
У |
О |
И |
Э |
Ы |
Я |
Ю |
Е |
Ё |
Б |
В |
Г |
Д |
Ж |
З |
Й |
\(0\) |
\(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\) |
... |
Khi sử dụng FOX128 cipher thì chúng ta sẽ thêm vào phía trước các số \(0\) cho đủ vector gồm \(16\) phần tử. Ví dụ sau khi encode thông điệp chúng ta có vector \((25, 2, 17, 23)\) thì chúng ta pad thành
Chúng ta biết rằng khi mã hóa thông điệp ПРИВЕДЕНИЕ, ta thu được bản mã
Sau đó Grisha mã hóa một thông điệp khác với cùng khóa con \(k_1\), \(k_2\) như trên với những thông điệp có nghĩa khác nhau nhằm mục đích nghiên cứu sự phụ thuộc giữa các bản rõ với nhau và với bản mã. Khi đó, với một bản rõ nào đó Grisha đã mã hóa thành
Grisha đã làm mất thí nghiệm của mình và không còn thông tin về khóa, cũng như bản rõ tương ứng với \(\beta_2\). Hãy giúp anh ấy.
Khôi phục bản rõ tương ứng bản mã \(\beta_2\).
Đưa ra thuật toán tối ưu khôi phục lại \(k_2\) hoặc một phần của nó, nếu biết rằng khi tạo khóa con \(k_2\) chỉ sử dụng các nguyên âm.
[TODO] Giải¶
Mình giải được câu 1 và chưa kịp làm câu 2.
Giả sử chúng ta mã hóa hai bản rõ \(\bm{a}, \bm{a}' \in V_{16}(2^8)\) với cùng khóa \(\bm{k}_1\) và \(\bm{k}_2\).
Đặt
với \(a_i\) và \(a_i' \in \mathbb{F}_{2^8}\), \(i = 1, 2, \ldots, 16\).
Đặt
với \(k_{1, i}\) và \(k_{2, i} \in \mathbb{F}_{2^8}\), \(i = 1, \ldots, 16\).
Sau phép biến đổi \(\nu_{\bm{k}_1}\) ta được
ở đây đặt \(b_i = a_i \oplus k_{1, i}\), tương tụ \(b_i' = a_i' \oplus k_{1, i}\).
Sau phép biến đổi thứ hai \(\pi'\) ta có
với \(c_i = \pi(b_i)\) và \(c_i' = \pi(b_i')\).
Sau phép biến đổi tuyến tính \(h\) ta có
Cuối cùng, phép biến đổi \(\nu_{\bm{k}_2}\):
Lúc này bản mã chính là các vector \((e_1, \ldots, e_{16})\) và \((e_1', \ldots, e_{16}')\).
Nếu XOR hai bản mã với nhau thì
nhưng \(h\) là phép biến đổi tuyến tính nên
Như vậy có thể nói rằng
Ma trận \(H\) và nghịch đảo của nó là như nhau, do đó có thể viết lại biểu thức trên thành
Vì \(c_i = \pi(a_i \oplus k_{1, i})\) và \(c_i' = \pi(a_i' \oplus k_{1, i})\), và ta tính được \(h(e_1 \oplus e_1', \ldots, e_{16} \oplus e_{16}')\) nên sẽ tìm được các phần tử \(c_1 \oplus c_1'\), ..., \(c_{16} \oplus c_{16}'\).
Lúc này ta thử các \(k_{1, i}\) với \(i = 1, 2, \ldots, 16\) để xem \(k_{1, i}\) nào thỏa mãn
với điều kiện là \(0 \leqslant a_i' \leqslant 32\) (theo bảng code bên trên).
Chương trình giải mình để ở đây
.
Theo kết quả chạy chương trình thì các vị trí \(i\) sau cho \(a_i = a_i'\):
Như vậy từ tiếng Nga chúng ta cần tìm có dạng ПРИВ_ДЕНИ_. Lưu ý rằng chúng ta đã bỏ các số \(0\) đứng trước trong quá trình decode.
Ở đây, dễ thấy sau kí tự В phải là nguyên âm, tức là vị trí \(i = 10\). Có hai ứng cử viên cho vị trí này là kí tự О (encode thành \(2\)) và И (encode thành \(3\)). Trong tiếng Nga có từ "привидение" nên ta sẽ chọn kí tự И cho \(i = 10\).
Vì "привидение" là từ giống trung nên kết thúc của nó (trong 6 cách) là "е", "я", "и" và "й". Từ chương trình giải bên trên chỉ có kí tự Я là được chấp nhận.
Như vậy, kết quả là ПРИВИДЕНИЯ.
Задача 5. Шифрование в RSA¶
Câu hỏi¶
Ta sử dụng thuật toán RSA để mã hóa với tham số sau
Ta chặn được hai bản mã:
Hãy giải mã các thông điệp, biết rằng bản rõ \(m_1\) và \(m_2\) có liên hệ \(m_2 = m_1 + 1\).
Giải¶
Sử dụng Coppersmith attack ở file solve_rsa.py
.
Задача 6. Подозрительная фотография¶
Thêm một bài reverse engineering và lần này là Android. Mình chịu chết.
Задача 7. Замены и перестановки¶
Câu hỏi¶
Chúng ta chặn được một thông điệp mã hóa được truyền qua radio và lưu vào file ct.txt. Chúng ta cần biết thông điệp ban đầu là gì.
Biết rằng thông điệp được mã hóa bằng mã dòng (stream cipher). Khóa là một dãy \(\gamma_1\), \(\gamma_2\), ... được sinh ra từ một khóa ban đầu và đi qua thuật toán sinh khóa.
Thuật toán sinh khóa nhận đầu vào là khóa \(256\) bits.
\(256\) bits đầu tiên nhận được từ việc mã hóa dãy các bytes 0 bằng thuật toán Skipjack với khóa \(K_{root}\) (\(80\) bits) và \(IV\) (\(64\) bits) là
Việc mã hóa được thực hiện bằng mode CFB, nghĩa là
trong đó \(K_{root} \in \{ 0, 1 \}^{80}\), \(IV \in \{ 0, 1 \}^{64}\), và bản mã là \(K_0 \in \{ 0, 1 \}^{256}\).
\(256\) bits tiếp theo được sinh bởi kết quả mã hóa bên trên, tức là
Thực hiện tương tự như vậy ta có công thức tổng quát là
với \(i \in \mathbb{N}\), \(K_i \in \{ 0, 1 \}^{256}\).
Dãy \(\{ \gamma_n \}\) nhận được từ các giá trị \(K_i\) và \(K_0\). Ở đây, \(4\) bits đầu tiên của dãy \(\{ \gamma_n \}\) nhận được từ \(K_0\) theo quy tắc
trong đó \(K_0[j]\) là khối \(64\) bits thứ \(i\) của \(K_0\), \(\gamma_j \in \{ 0, 1 \}\) với \(j = 0, 1, 2, 3\).
Các bit tiếp theo được sinh tương tự theo quy tắc
với \(a \% b\) là số dư khi chia \(a\) cho \(b\), \(j \in \mathbb{N}\).
Ví dụ ta có khóa
thì ta sẽ chia được thành \(4\) đoạn, mỗi đoạn \(64\) bits (hay \(8\) bytes) như sau
Bản mã nhận được theo công thức
với \(c_i, p_i \in \{ 0, 1 \}\) và \(i = 0, 1, 2, \ldots\)
Hãy phân tích và khôi phục thông điệp ban đầu, và xác định họ của tác giả nếu biết file được encode bằng cp1251.
Giải¶
Thuật toán sinh khóa nhận đầu vào là khóa \(256\) bits.
\(256\) bits đầu tiên nhận được từ việc mã hóa dãy các bytes 0 bằng thuật toán Skipjack với khóa \(K_{root}\) (\(80\) bits) và \(IV\) (\(64\) bits) là
Việc mã hóa được thực hiện bằng mode CFB, nghĩa là
trong đó \(K_{root} \in \{ 0, 1 \}^{80}\), \(IV \in \{ 0, 1 \}^{64}\), và bản mã là \(K_0 \in \{ 0, 1 \}^{256}\).
Đặt \(\mathsf{Enc}(P)\) là hàm mã hóa bản rõ \(P\) \(64\) bits bằng thuật toán Skipjack với khóa \(K_{root}\) \(80\) bits.
Giả sử \(K_0 = (K_0[0], K_0[1], K_0[2], K_0[3]) \in \{ 0, 1 \}^{256}\), với \(K_0[j] \in \{ 0, 1 \}^{64}\), \(j = 0, 1, 2, 3\). Theo mode CFB thì
\(256\) bits tiếp theo được tạo với cơ chế tương tự:
Giả sử \(K_1 = (K_1[0], K_1[1], K_1[2], K_1[3]) \in \{ 0, 1 \}^{256}\) với \(K_1[j] \in \{ 0, 1 \}^{64}\), \(j = 0, 1, 2, 3\). Tương tự, theo mode CFB thì
Tổng quát:
với \(i \in \mathbb{N}\) và \(K_i \in \{ 0, 1 \}^{256}\).
Giả sử
với \(K_i[j] \in \{ 0, 1 \}^{64}\), \(j = 0, 1, 2, 3\).
Theo mode CFB thì
Dãy \(\{ \gamma_n \}\) nhận được từ các giá trị \(K_i\) và \(K_0\). Ở đây, \(4\) bits đầu tiên của dãy \(\{ \gamma_n \}\) nhận được từ \(K_0\) theo quy tắc
trong đó \(K_0[j]\) là khối \(64\) bits thứ \(i\) của \(K_0\), \(\gamma_j \in \{ 0, 1 \}\) với \(j = 0, 1, 2, 3\).
Các bit tiếp theo được sinh tương tự theo quy tắc
với \(a \% b\) là số dư khi chia \(a\) cho \(b\), \(j \in \mathbb{N}\).
Chúng ta sẽ tìm quy luật đối với dãy \(\{ \gamma_n \}\):
Ta cần file problem-7/skipjack.py
để thực hiện thuật toán Skipjack.
Tiếp theo, chúng ta thử mã hóa với \(K_{root}\) bất kì để quan sát xem có quy luật nào cho \(K_i\) không với file problem-7/find_rules.py
.
Dễ thấy bản mã (dạng hex) có dạng sau:
0d16dceddfc805c1 47122ce9d3b7983a 02fd48e270666df7 28a8d35b20fbd167
0000000000000000 c4a1be9a50040a49 a266cc2ec5ada370 59c24fdb72f24d49
0d16dceddfc805c1 83b3927383b39273 1374429b74bf2dc5 b2e5c38addfd9bbc
0000000000000000 0000000000000000 90c7d0e8f70cbfb6 b4975af551b93659
0d16dceddfc805c1 47122ce9d3b7983a 923a980a876ad241 f786cb6cd09fa275
0000000000000000 c4a1be9a50040a49 32a11cc632a11cc6 a16a8af18673e3e8
0d16dceddfc805c1 83b3927383b39273 83b3927383b39273 1078044437616d5d
0000000000000000 0000000000000000 0000000000000000 93cb9637b4d2ff2e
0d16dceddfc805c1 47122ce9d3b7983a 02fd48e270666df7 bb63456c94292e49
0000000000000000 c4a1be9a50040a49 a266cc2ec5ada370 ca09d9ecc620b267
0d16dceddfc805c1 83b3927383b39273 1374429b74bf2dc5 212e55bd692f6492
0000000000000000 0000000000000000 90c7d0e8f70cbfb6 275cccc2e56bc977
0d16dceddfc805c1 47122ce9d3b7983a 923a980a876ad241 644d5d5b644d5d5b
0000000000000000 c4a1be9a50040a49 32a11cc632a11cc6 32a11cc632a11cc6
0d16dceddfc805c1 83b3927383b39273 83b3927383b39273 83b3927383b39273
0000000000000000 0000000000000000 0000000000000000 0000000000000000
Ta chỉ quan tâm các khối \(64\) bits toàn các byte 0 nên bản mã dạng hex trên tương đương với
---------------- ---------------- ---------------- ----------------
0000000000000000 ---------------- ---------------- ----------------
---------------- ---------------- ---------------- ----------------
0000000000000000 0000000000000000 ---------------- ----------------
---------------- ---------------- ---------------- ----------------
0000000000000000 ---------------- ---------------- ----------------
---------------- ---------------- ---------------- ----------------
0000000000000000 0000000000000000 0000000000000000 ----------------
---------------- ---------------- ---------------- ----------------
0000000000000000 ---------------- ---------------- ----------------
---------------- ---------------- ---------------- ----------------
0000000000000000 0000000000000000 ---------------- ----------------
---------------- ---------------- ---------------- ----------------
0000000000000000 ---------------- ---------------- ----------------
---------------- ---------------- ---------------- ----------------
0000000000000000 0000000000000000 0000000000000000 0000000000000000
Ở đây, ----------------
là khối khác \(0\). Thử mã hóa nhiều lần vói \(K_{root}\) khác nhau thì ta thấy bản mã đều có dạng chung như trên.
Từ đó có thể nói dãy \(\{ \gamma_n \}\) không phụ thuộc vào khóa. Lúc này ta có thể sử dụng \(K_{root}\) tùy ý và sinh ra dãy \(\{ \gamma_n \}\).
File giải mã là problem-7/solve.py
.
Kết quả giải mã là
EVALUATION OF THE SITUATION UNTIL NOW IT HAD TO BE EXPECTED THAT THE ENEMY WOULD TRY TO CROSS THE DANUBE WITH THE TROOPS ASSEMBLING AT VIDIN LOMPALANKA AND NEAR DRUTSCHUK WITH THE GOAL TO CUT OFF THE RAILWAYS BETWEEN ORSOVA AND CRAIOVA AND TO PUSH FORWARD TO BUCHAREST SINCE NOVEMBER 1 1918 IT APPEARS THAT THE SERBIAN ARMIES TOGETHER WITH THREE FRENCH DIVISIONS AREENGAGED IN AN ADVANCE TOWARD BELGRADE SEMENDRIA AND THE INTENDED ATTACK AT VIDI AND LOM PALANKA SEEMS TO HAVE BEEN ABANDONED IT HAS TO BE EXPECTED THE DEPLOYMENT OF STRONGER FORCES AT THE DANUBE SOUTH OF SVISTOVRUSTSCHUK SPECIALLY AFTER THE PEACE AGREEMENT OF TURKEY HENCE IT IS MOST LIKELY THAT THE SERBIAN ARMIES REINFORCED BY THE FRENCH INTEND TO CROSS THE DANUBE NEAR BELGRADE SEMENDIA AND THE INTO SOUTHERN REPEAT SOUTHERN HUNGARY WHILE THE TASK OF THE FRENCH ARMY MARCHING SOUTH OF SVISTOV RUTSCHUK REMAINS THE OFFENSIVE TOWARD BUCHAREST IN CONJUNCTION WITH THIS OPERATION IT CANNOT BE RULED OUT THAT THE ROMANIAN FORCES COMING FROM MOLDAVIA OVER THE PASSES OF TOELGYESGIMES AND OITOS WILL INVADE TRANSYLVANIA THUS THE LINES OF COMMUNICATIONS IN THE REAR OF THE OCCUPATION ARMY WHICH HAVE UP TO NOW AS A RESULT OF IS THREATENED WITH ATTACK AND THE FURTHER OCCUPATION OF THE WALL ACHIAAS LAID DOWN IN ORDER FROM OKHEAD QUARTERS 2RMNR11161 WITHOUT DOUBT AND WITH REGARD TO THE AMMUNITION FOOD AND THE COAL STOCK SIT IS UNFEASIBLE IF THE GENERAL ARM ISTICE DOES NOT BECOME EFFECTIVE IN THE FORESEEABLE FUTURE IT IS SUGGESTED THAT THE OCCUPATION ARMY BE WITHDRAWN ATONCE FROM ROMANIA AND TOGETHER WITH THE GERMAN UNITS OF THE FIRST ARMY TO START THE MARCH TOUPPERSILES IA THROUGH HUNGARY APPROVAL IS REQUESTED SIGNED KMIAGROP
Ở cuối đoạn có ghi SIGNED KMIAGROP nên họ của tác giả là KMIAGROP.
Задача 8. Загадочная ошибка¶
Thêm một bài reverse engineering C++. Bài này có dùng thêm OpenSSL nhưng mình vẫn không biết làm.
Задача 9. Генератор гаммы на основе XSL-схемы¶
Câu hỏi¶
Chúng ta tạo thuật toán sinh khóa cho mã dòng
Hàm sinh của khóa là ánh xạ \(F: \mathbb{F}_2^{64} \to \mathbb{F}_2^{64}\), được xây dựng dựa trên mô hình XSL, rất phổ biến trong việc thiết kế mã khối.
Phép biến đổi không tuyến tính là S-box, dựa trên ánh xạ \(S: \mathbb{F}_2^8 \to \mathbb{F}_2^8\). S-box có thể biểu diễn qua hoán vị sau
\(0\) |
\(1\) |
\(2\) |
\(3\) |
\(4\) |
\(5\) |
\(6\) |
\(7\) |
\(8\) |
\(9\) |
\(10\) |
\(11\) |
\(12\) |
\(13\) |
\(14\) |
\(15\) |
|
\(0\) |
\(208\) |
\(5\) |
\(11\) |
\(222\) |
\(234\) |
\(63\) |
\(49\) |
\(228\) |
\(31\) |
\(202\) |
\(196\) |
\(17\) |
\(37\) |
\(240\) |
\(254\) |
\(43\) |
\(1\) |
\(117\) |
\(160\) |
\(174\) |
\(123\) |
\(79\) |
\(154\) |
\(148\) |
\(65\) |
\(186\) |
\(111\) |
\(97\) |
\(180\) |
\(128\) |
\(85\) |
\(91\) |
\(142\) |
\(2\) |
\(239\) |
\(58\) |
\(52\) |
\(225\) |
\(213\) |
\(0\) |
\(14\) |
\(219\) |
\(32\) |
\(245\) |
\(251\) |
\(46\) |
\(26\) |
\(207\) |
\(193\) |
\(20\) |
\(3\) |
\(74\) |
\(159\) |
\(145\) |
\(68\) |
\(112\) |
\(165\) |
\(171\) |
\(126\) |
\(133\) |
\(80\) |
\(94\) |
\(139\) |
\(191\) |
\(106\) |
\(100\) |
\(177\) |
\(4\) |
\(242\) |
\(39\) |
\(41\) |
\(252\) |
\(200\) |
\(29\) |
\(19\) |
\(198\) |
\(61\) |
\(232\) |
\(230\) |
\(51\) |
\(7\) |
\(210\) |
\(220\) |
\(9\) |
\(5\) |
\(87\) |
\(130\) |
\(140\) |
\(89\) |
\(109\) |
\(184\) |
\(182\) |
\(99\) |
\(152\) |
\(77\) |
\(67\) |
\(150\) |
\(162\) |
\(119\) |
\(121\) |
\(172\) |
\(6\) |
\(205\) |
\(24\) |
\(22\) |
\(195\) |
\(247\) |
\(34\) |
\(44\) |
\(249\) |
\(2\) |
\(215\) |
\(217\) |
\(12\) |
\(56\) |
\(237\) |
\(227\) |
\(54\) |
\(7\) |
\(104\) |
\(189\) |
\(179\) |
\(102\) |
\(82\) |
\(135\) |
\(137\) |
\(92\) |
\(167\) |
\(114\) |
\(124\) |
\(169\) |
\(157\) |
\(72\) |
\(70\) |
\(147\) |
\(8\) |
\(188\) |
\(105\) |
\(103\) |
\(178\) |
\(134\) |
\(83\) |
\(93\) |
\(136\) |
\(115\) |
\(166\) |
\(168\) |
\(125\) |
\(73\) |
\(156\) |
\(146\) |
\(71\) |
\(9\) |
\(25\) |
\(204\) |
\(194\) |
\(23\) |
\(35\) |
\(246\) |
\(248\) |
\(45\) |
\(214\) |
\(3\) |
\(13\) |
\(216\) |
\(236\) |
\(57\) |
\(55\) |
\(226\) |
\(10\) |
\(131\) |
\(86\) |
\(88\) |
\(141\) |
\(185\) |
\(108\) |
\(98\) |
\(183\) |
\(76\) |
\(153\) |
\(151\) |
\(66\) |
\(118\) |
\(163\) |
\(173\) |
\(120\) |
\(11\) |
\(38\) |
\(243\) |
\(253\) |
\(40\) |
\(28\) |
\(201\) |
\(199\) |
\(18\) |
\(233\) |
\(60\) |
\(50\) |
\(231\) |
\(211\) |
\(6\) |
\(8\) |
\(221\) |
\(12\) |
\(158\) |
\(75\) |
\(69\) |
\(144\) |
\(164\) |
\(113\) |
\(127\) |
\(170\) |
\(81\) |
\(132\) |
\(138\) |
\(95\) |
\(107\) |
\(190\) |
\(176\) |
\(101\) |
\(13\) |
\(59\) |
\(238\) |
\(224\) |
\(53\) |
\(1\) |
\(212\) |
\(218\) |
\(15\) |
\(244\) |
\(33\) |
\(47\) |
\(250\) |
\(206\) |
\(27\) |
\(21\) |
\(192\) |
\(14\) |
\(161\) |
\(116\) |
\(122\) |
\(175\) |
\(155\) |
\(78\) |
\(64\) |
\(149\) |
\(110\) |
\(187\) |
\(181\) |
\(96\) |
\(84\) |
\(129\) |
\(143\) |
\(90\) |
\(15\) |
\(4\) |
\(209\) |
\(223\) |
\(10\) |
\(62\) |
\(235\) |
\(229\) |
\(48\) |
\(203\) |
\(30\) |
\(16\) |
\(197\) |
\(241\) |
\(36\) |
\(42\) |
\(255\) |
Ở bảng trên, phần tử ở hàng \(i\) và cột \(j\) (\(0 \leqslant i, j \leqslant 15\)) là giá trị S-box của \(16i + j\).
Biến đổi tuyến tính \(L\) dựa trên LFSR, nghĩa là \(L: \mathbb{F}_2^{64} \to \mathbb{F}_2^{64}\) với hệ số của đa thức đặc trưng được viết dưới dạng 0x12a9d9b8c0edf6e79 (ở đây bit cao là hệ số của hạng tử bậc cao, most significant bit). Ở mỗi vòng, thanh ghi sẽ được khai báo bởi một trong các hằng số của vòng và đi qua \(64\) vòng.
Như vậy, quá trình sinh khóa có dạng
với \(k^{(i - 1)}\) là khóa được sinh trước đó, \(k^{(0)}\) là khóa đầu vào để sinh toàn bộ dãy khóa, và \(C^{(i)}\) là hằng số của vòng, gồm
0x6ea276726c487ab8,
0x5d27bd10dd849401,
0xdc87ece4d890f4b3,
0xba4eb92079cbeb02,
0xb2259a96b4d88e0b,
0xe7690430a44f7f03,
0x7bcd1b0b73e32ba5,
0xb79cb140f2551504,
0x156f6d791fab511d,
0xeabb0c502fd18105,
0xa74af7efab73df16,
0x0dd208608b9efe06,
0xc9e8819dc73ba5ae,
0x50f5b570561a6a07,
0xf6593616e6055689,
0xadfba18027aa2a08.
Phương trình mã hóa có dạng
với \(y^{(i)}, x^{(i)} \in \mathbb{F}_2^{64}\).
Người truyền tin muốn kiểm tra độ an toàn của thuật toán sinh khóa. Anh ta mã hóa một phần của đoạn văn đầu trong tiểu thuyết "Alice in Wonderland" (tiếng Anh) và thu được bản mã là
3291999942924df2eb53323558623a949f5d90c4ba2cf0d9883c21ee0fcd8e5348de9d8fecee8b55693a5682396c33b57cdcaa6946fdfe5c50660656cfb03fbfa682db7f20837e3d406340ebf301b8223a7ada2820b5e15756ab0f54e2af8008f181e474757afbdfaf65525e88dadce723653bfc35398852d3e82cfb4815f3f6
Nhiệm vụ của bạn là phân tích thuật toán mã hóa và nếu có lỗ hổng, hãy khai thác nó và tìm khóa mã hóa.
[TODO] Giải¶
Задача 10. Регистровое преобразование¶
Câu hỏi¶
Eva chặn được một đoạn gamma được sinh dựa trên shift register (xem chi tiết ở file problem-10/PQR.py
):
Hãy tìm giá trị register ban đầu.
[TODO] Giải¶
Задача 11. Трудный PBKDF¶
Câu hỏi¶
Việc trao đổi file diễn ra trên kênh truyền. Để mã hóa file chúng ta dùng thuật toán sau dựa trên mật khẩu.
Đầu vào là mật khẩu \(password\) gồm \(4\) chữ số thập phân, và thông điệp \(pt\).
Ta tính khóa \(key = \mathsf{SHA256}(password)\) và initial vector là
Sử dụng thuật toán mã khối AES256 với mode CBC và khóa \(key\), initial vector \(IV\), và padding bằng PKCS#7.
Chúng ta có một số file đã bị mã hóa. Biết rằng, qua kênh truyền có thể có nhiễu nên file có thể chứa một số bytes đã bị hỏng. Một trong số đó chứa flag, hãy tìm nó.
[TODO] Giải¶
Kết luận¶
Để viết sau.