Bất đối xứng, PKI, blockchain và chống MITM

Mã bất đối xứng, bắt tay SSL TLS, hạ tầng khóa công khai, blockchain và phòng chống MITM khi triển khai ML.
KhóThuật toán ~60 phút

Ôn lại trước khi học

Giới thiệu

Bài này học khóa công khai, chứng chỉ và chống nghe lén. Dùng để giữ mô hình ML an toàn khi triển khai.

Kiến thức cần nhớ

Mã bất đối xứng

  • Định nghĩa: cặp khóa công khai mã hóa, bí mật giải mã.
  • Ai cũng bỏ thư vào hòm, chỉ chủ hòm mở được.
  • Ví dụ đời thường: như khe hòm thư ai cũng nhét được.
  • Chậm hơn đối xứng hàng trăm lần thực tế.
  • Nên dùng lai: bất đối xứng trao khóa, đối xứng mã data.

TLS và PKI

  • Định nghĩa: TLS bắt tay rồi chuyển sang mã nhanh.
  • Trình duyệt kiểm chứng chỉ trước khi tin máy chủ.
  • PKI là hệ nhà cấp chứng chỉ xác minh danh tính.
  • Ví dụ đời thường: như kiểm căn cước trước khi giao chìa.
  • Không có PKI thì kẻ gian tự xưng tên người khác.
Lớp phòng thủChống gìBằng gì
Nghe lénĐọc trộmTLS, mã hóa
Mạo danhGiả máy chủChứng chỉ, ghim
Lộ khóaDùng mãi 1 khóaXoay và thu hồi

Blockchain và MITM

  • Định nghĩa: khối sau chứa băm khối trước nên khó sửa.
  • Nhiều bên không tin nhau vẫn đồng ý 1 sổ chung.
  • MITM là kẻ chen giữa đọc sửa lưu lượng đi qua.
  • Ví dụ đời thường: như người đưa thư lén mở thư.
  • Sửa bằng mã hóa lúc nghỉ và kiểm toàn vẹn model.

Ví dụ

  • Input: tải model qua mạng không TLS -> Output: MITM tráo model độc.
  • Giải thích: thiếu chứng chỉ nên không phát hiện giả mạo.
# Kiểm toàn vẹn trước khi tải model
import hashlib
bam = hashlib.sha256(open("m.bin","rb").read()).hexdigest()
print(bam == bam_chuan)  # True mới dùng

💻 Bài tập

Ngôn ngữ: Python 3 với cryptography. Nộp vào day-106/.

RSA tự cài ở Bài 1 chỉ để hiểu toán. Không dùng để bảo vệ dữ liệu thật. Mọi việc thật dùng thư viện đã kiểm định.

Bài 1: RSA tí hon

HàmYêu cầu
is_probable_prime(n, k=20)Miller-Rabin
gen_prime(bits)Sinh số nguyên tố ngẫu nhiên bằng secrets
egcd, modinvNghịch đảo modulo
keygen(bits=512)e = 65537, trả (n, e) và (n, d)
encrypt(m, pub), decrypt(c, priv), sign(m, priv), verify(m, s, pub)pow(m, e, n)
decrypt(encrypt(m)) == m với 100 m ngẫu nhiên < n
verify(m, sign(m)) = True; sửa 1 bit của m -> False
p = 61, q = 53, e = 17 -> n = 3233, d = 2753; encrypt(65) = 2790

Bài 2: Mã hóa lai và chứng chỉ

  1. Dùng cryptography: sinh cặp khóa RSA 2048. Mã hóa file 10 MB bằng mã hóa lai: khóa AES-256 ngẫu nhiên mã hóa file (AES-GCM), RSA-OAEP mã hóa khóa AES.
  2. So thời gian: mã hóa 10 MB trực tiếp bằng RSA (theo khối) và bằng lai.
  3. Tự tạo CA gốc, cấp chứng chỉ cho localhost. Kiểm tra chữ ký chứng chỉ bằng khóa công khai CA. Sửa 1 byte trong chứng chỉ: kiểm tra thất bại.

Bài 3: Blockchain tí hon và MITM (nâng cao)

  1. Block(index, timestamp, data, prev_hash, nonce) với hash = sha256(...). Proof-of-work: hash bắt đầu bằng 4 số 0.
  2. Chain.is_valid(). Sửa data của khối 3: chuỗi không hợp lệ, trừ khi đào lại mọi khối sau. Đo thời gian đào lại.
  3. MITM: giả lập client tải file model từ server qua kênh không mã hóa, kẻ giữa tráo file. Sửa bằng 2 cách: kiểm tra SHA-256 công bố trước, và chữ ký số của server. Viết test cho cả 2.

✅ Tiêu chí hoàn thành

  • RSA tí hon pass ví dụ số nhỏ và test ngẫu nhiên.
  • Bảng thời gian RSA trực tiếp và mã hóa lai.
  • Chứng chỉ bị sửa thì kiểm tra thất bại.
  • Bài 3 phát hiện được file bị tráo.

❓ Câu hỏi ôn tập

  • Khóa công khai khác khóa bí mật sao?
  • TLS dùng lai thế nào?
  • PKI tin ai đầu tiên?
  • MITM chen vào đâu?

🌕 Bạn đã hoàn thành ngày 106. Làm hết bài tập phía trên rồi sang ngày tiếp theo.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.