9. Tổng hợp bài tập môn Giao thức an toàn thông tin cho hệ thống cyber-physical¶
Tài liệu này tổng hợp nội dung từ hai nhóm ЛР (lab) và ДЗ (bài tập về nhà). Các file PDF, preamable.tex (tên file thực tế trong thư mục) và signature.png không được sử dụng.
9.1. Phần I — Lab (ЛР)¶
9.1.1. Lab 1. DLP cho người lớn¶
9.1.1.1. Đề bài¶
Alice và Bob thiết lập khóa bí mật chung bằng giao thức DiffieHellman với các tham số công khai
Các giá trị trao đổi trên kênh công khai là
Hãy cài đặt thuật toán PohligHellman để tìm khóa bí mật chung của Alice và Bob.
9.1.1.2. Bài giải¶
Ta phân tích bậc của nhóm:
Thuật toán được tổ chức thành ba tầng:
Baby-step giant-step (BSGS): giải \(g^x = h \pmod p\) trong một nhóm có bậc đã biết \(n\) với độ phức tạp xấp xỉ \(O(\sqrt n)\).
DLP trong nhóm có bậc là lũy thừa nguyên tố: với \(n = q^e\), tìm lần lượt các chữ số của \(x\) trong cơ số \(q\); mỗi chữ số được giải bằng BSGS.
PohligHellman: chiếu bài toán vào từng nhóm con có bậc \(q_i^{e_i}\), giải các đồng dư \(x \equiv x_i \pmod{q_i^{e_i}}\), rồi ghép bằng định lý số dư Trung Hoa.
Sau khi tìm được \(a\) hoặc \(b\), khóa chung được kiểm tra bởi
Kết quả:
Code đầy đủ (gồm lũy thừa nhanh, Euclid mở rộng, nghịch đảo modulo, CRT, căn bậc hai nguyên, BSGS và PohligHellman):
9.1.2. Lab 2. Hội đồng quản trị¶
9.1.2.1. Đề bài¶
Hội đồng quản trị có 7 người. Quyết định chiến lược cần đa số đồng thuận. Biết rằng Alice và Bob có 3 phiếu mỗi người, các thành viên còn lại có 1 phiếu. Mỗi phần khóa bí mật tương ứng với một phiếu.
Khóa công khai để kiểm tra chữ ký là
Thuật toán ký nhận ít nhất 6 phần khóa. Alice, Dave, Gaby và Hank đã ký digest
nhưng chữ ký sinh ra không vượt qua bước kiểm tra. Yêu cầu:
Mô tả hình thức giao thức sinh khóa và ký.
Tính chữ ký từ các phần khóa đã cho và chứng minh chữ ký sai.
Tìm lỗi trong chương trình.
Sửa lỗi, điều chỉnh các phần khóa nếu cần và chứng minh hệ thống mới hoạt động.
9.1.2.2. Bài giải¶
Mô hình giao thức. Cho \(f(x)\) là đa thức chia sẻ bí mật trên \(\mathbb F_p\). Bí mật chung là \(f(0)\) và khóa công khai là
Từ các cặp \((x_i, f(x_i))\) của những người tham gia, thuật toán nội suy Lagrange để khôi phục \(f(0)\). Sau đó chọn \(k\) sao cho \(\gcd(k, p - 1) = 1\) và tính chữ ký ElGamal
Chữ ký được kiểm tra bằng
Với các phần khóa ban đầu, thu được
và hàm Verify trả về False.
=
Nguyên nhân. KeyGen tạo đa thức bậc 6, trong khi quy tắc “ít nhất 6 phần khóa” chỉ cho phép nội suy duy nhất một đa thức có bậc không quá 5. Muốn khôi phục đa thức bậc 6 phải có ít nhất 7 điểm. Vì vậy các nhóm chỉ có 6 phiếu có thể khôi phục một giá trị tự do khác tại \(x = 0\), làm chữ ký không khớp với khóa công khai.
Từ toàn bộ các phần khóa cũ, bí mật chung được khôi phục là
và đúng là \(y = g^{f(0)} \pmod p\). Để giữ nguyên khóa công khai nhưng hỗ trợ ngưỡng 6, chọn đa thức bậc 5 mới
rồi phát lại các phần khóa dưới dạng \(F(x_i)\). Khi ký bằng các phần khóa mới, Verify trả về True.
Code và script SageMath:
9.1.3. Lab 3. Lược đồ cam kết của Alice và Bob¶
9.1.3.1. Đề bài¶
Trên đường cong elliptic \(E/\mathbb F_p\), điểm \(G\) sinh nhóm con có bậc nguyên tố \(q\). Chuỗi bí mật \(S\) được ánh xạ thành \(x \in \mathbb Z_q\). Hệ thống tạo điểm \(H = x_M G\) từ dữ liệu liên quan đến thông điệp, rồi Alice chọn \(r \in \mathbb Z_q\) và công bố cam kết
Khi mở cam kết, Alice gửi \((x, r)\) và người kiểm tra xác nhận \(C \stackrel{?}{=} x G + r H\). Yêu cầu là thay chuỗi \(S\) bằng chuỗi khác \(S'\) vẫn vượt qua kiểm tra, sau đó đề xuất cách cải tiến.
9.1.3.2. Bài giải¶
Điểm yếu cốt lõi là quan hệ logarit rời rạc giữa hai cơ sở đã biết:
Chọn tùy ý \(x_1 \ne x\) và đặt
Khi đó
Do đó cùng một cam kết có thể được mở bằng hai cặp khác nhau \((x, r)\) và \((x_1, r_1)\); tính binding bị phá vỡ.
Cách cải tiến: dùng cam kết Pedersen chuẩn
nhưng \(H\) phải được sinh độc lập sao cho không bên nào biết \(\alpha\) thỏa \(H = \alpha G\) (ví dụ áp dụng hash-to-curve với domain separation và tham số chung minh bạch). Khi không biết \(\log_G H\), việc tìm hai cách mở khác nhau sẽ suy ra cách giải DLP:
Demo sử dụng đường cong secp256k1:
9.1.4. Lab 4. Xác thực zero-knowledge dựa trên thặng dư bậc hai¶
9.1.4.1. Đề bài¶
Các tham số công khai là \((N, m)\), còn prover \(\mathfrak A\) biết bí mật \(k\) sao cho
Một vòng giao thức:
\(\mathfrak A\) chọn ngẫu nhiên \(r < N\), gửi \(a = r^2 \bmod N\).
Verifier \(\mathfrak B\) gửi thử thách \(b \in \{0, 1\}\).
\(\mathfrak A\) gửi \(q = k^b r \bmod N\).
\(\mathfrak B\) kiểm tra \(q^2 \stackrel{?}{\equiv} m^b a \pmod N\).
Hãy cài đặt giao thức, tìm các điều kiện cần thiết, tấn công khi verifier luôn chọn \(b = 1\), và xét biến thể \(b \in \{3, 5\}\).
9.1.4.2. Bài giải¶
Tính đúng đắn:
Điều kiện bổ sung: cần \(1 < m < N\), \(2 \le r \le N - 2\), \(\gcd(r, N) = 1\) và \(\gcd(k, N) = 1\). Các giá trị \(r = 1\) hoặc \(r = N - 1\) làm \(a = 1\) và có thể làm lộ \(\pm k\) khi \(b = 1\).
Tấn công khi \(b\) luôn bằng 1. Prover giả không cần biết \(k\): chọn \(\tilde q \in \mathbb Z_N^*\) và gửi
Với \(b = 1\), kiểm tra luôn đúng vì \(m \tilde a \equiv \tilde q^2 \pmod N\). Thử thách phải thực sự ngẫu nhiên và không dự đoán được.
Biến thể \(b \in \{3, 5\}\) cũng không an toàn. Prover chọn \(r\) và gửi
Nếu \(b = 3\), trả lời \(q = r\); nếu \(b = 5\), trả lời \(q = r m\). Cả hai trường hợp đều thỏa:
Vì prover không hề dùng \(k\), biến thể không có tính soundness.
Code demo:
lab-4/main_2.py — giao thức cơ bản
lab-4/main_3.py — tấn công thử thách cố định
lab-4/main_4.py — tấn công biến thể \(\{3, 5\}\)
9.2. Phần II — Bài tập về nhà (ДЗ)¶
9.2.1. Bài 1. Phân tích nhân tử cho trẻ em¶
9.2.1.1. Đề bài¶
Cho \(N = 293693171\) và \(29550^2 \equiv 24073^2 \pmod N\). Hãy phân tích \(N\) thành nhân tử.
Cho \(N = 1307 \cdot 95107\). Tìm \(x, y\) sao cho \(x^2 \equiv y^2 \pmod N\) nhưng \(x \not\equiv y \pmod N\).
9.2.1.2. Bài giải¶
Từ hiệu hai bình phương:
Ta có \(29550 - 24073 = 5477\) và \(29550 + 24073 = 53623\), do đó
Với câu 2, chọn \(x - y = 1307\) và \(x + y = 95107\). Giải hệ được
Khi đó \(x^2 - y^2 = (x - y) (x + y) = N\), nên
Ghi chú
Ghi chú biên tập: nguồn TeX có hai lỗi đánh máy ở câu 1 (24073^3 và 53627); các giá trị đúng là \(24073^2\) và \(53623\).
9.2.2. Bài 2. Cấu hình RSA không an toàn¶
9.2.2.1. Đề bài¶
Yuri cấu hình RSA cho \(n\) người dùng nhưng chỉ lưu \(k\) số nguyên tố, với \(k < 2 n\). Mỗi modulus là tích của hai số nguyên tố khác nhau và các khóa công khai \((e, N)\) của người dùng đôi một khác nhau. Eve chọn ngẫu nhiên một người dùng \(u\). Tìm xác suất Eve có thể phân tích modulus của \(u\).
9.2.2.2. Bài giải¶
Theo giả thiết được dùng trong lời giải nguồn, các modulus \(N_i\) là đôi một khác nhau và được chọn đều từ \(\binom{k}{2}\) tích có thể có. Eve phân tích được \(N_u\) nếu một modulus khác dùng chung một thừa số nguyên tố với \(N_u\); khi đó
cho ta thừa số đó.
Sau khi cố định \(N_u\), có \(\binom{k - 2}{2}\) modulus không dùng một trong hai thừa số của nó. Xác suất không có modulus nào trong \(n - 1\) modulus còn lại dùng chung thừa số là
trong đó \((t)_j = t (t - 1) \cdots (t - j + 1)\) là giai thừa giảm. Vì vậy
Nếu \(n - 1 > \binom{k - 2}{2}\) thì tử số bằng 0 và \(P(A) = 1\).
Ghi chú
Lưu ý: điều kiện “các cặp \((e, N)\) khác nhau” tự nó vẫn cho phép hai người dùng có cùng \(N\) nhưng khác \(e\). Công thức trên cần giả thiết mạnh hơn rằng các modulus đôi một khác nhau (thường hợp lý khi cùng dùng một public exponent chuẩn). Nếu cho phép lặp modulus, phân bố chọn khóa phải được chỉ rõ thì xác suất mới xác định duy nhất.
9.2.3. Bài 3. Đồng cấu nguy hiểm¶
9.2.3.1. Đề bài¶
Cho ElGamal với khóa công khai
Biết
Tìm \(m'\) nếu \(c' = (1732, 1567) = Enc(m')\).
9.2.3.2. Bài giải¶
Mã hóa ElGamal có dạng
Tọa độ thứ nhất cho thấy
nên \(r' \equiv r_1 - r\) theo bậc của nhóm. Từ tọa độ thứ hai của hai bản mã đã biết:
Do \(1567 \equiv m' (y^r)^{-1} y^{r_1} \pmod{2441}\),
Vậy
9.2.4. Bài 4. Giao thức trên đường cong elliptic¶
9.2.4.1. Đề bài¶
Cho \(G\) sinh nhóm con bậc nguyên tố \(q\) trên đường cong elliptic. Người dùng \(i\) có khóa bí mật \(sk_i \in \mathbb Z_q\) và khóa công khai \(PK_i = sk_i G\). Khi liên lạc với Bob, người dùng chọn \(r_1, r_2\), tính
lấy hoành độ \(x\) của điểm \(r_2 PK_b\), rồi tính
Người dùng gửi \((R_1, R_2, s)\). Hãy chỉ ra cách Bob xác định người gửi.
9.2.4.2. Bài giải¶
Bob dùng khóa bí mật của mình để tính
Vì thế Bob lấy được đúng hoành độ \(x\) mà người gửi đã dùng. Tiếp theo,
Suy ra
Bob tra \(PK_i\) trong cơ sở dữ liệu công khai ánh xạ \((U_i, PK_i)\) và xác định được danh tính \(U_i\) của người gửi.