TOÁN HỌC ĐẰNG SAU CHỮ KÝ SỐ RSA

Sau khi đã tự tay viết và chạy thử toàn bộ hệ thống ở Bài trước, chắc hẳn nhiều bạn sinh viên đang tò mò: "Tại sao các phép tính $S = H^d \pmod n$ và $H' = S^e \pmod n$ lại hoạt động kỳ diệu đến vậy? Tại sao giải mã chữ ký lại ra đúng mã băm ban đầu?"

Bài học này sẽ bóc tách toàn bộ bản chất toán học của thuật toán RSA bằng những ví dụ số nguyên tố nhỏ để các bạn dễ dàng tính nhẩm hoặc bấm máy tính cầm tay!

1. NỀN TẢNG TOÁN HỌC CỐT LÕI (CONCEPT)

Thuật toán RSA (được đặt tên theo 3 nhà toán học: Rivest, Shamir, và Adleman) dựa trên 3 trụ cột toán học:

  1. Bài toán phân tích số nguyên tố (Factorization): Nhân 2 số nguyên tố lớn thì cực kỳ dễ, nhưng từ tích đó phân tích ngược lại 2 số nguyên tố ban đầu là bài toán cực kỳ khó đối với máy tính.

  2. Định lý Euler (Euler's Totient Theorem): Với $n = p \times q$, hàm Phi-Euler $\phi(n) = (p-1)(q-1)$ cho biết số lượng các số nguyên dương nhỏ hơn $n$ và nguyên tố cùng nhau với $n$.

  3. Phép tính số học Mô-đun (Modular Arithmetic): Các phép toán tính số dư khi chia cho $n$.

2. QUY TRÌNH 4 BƯỚC TẠO KHÓA TOÁN HỌC (KEY GENERATION)

Hãy cùng làm một bài tập số học từng bước:

[ BƯỚC 1: Chọn p, q ] ──► p = 61, q = 53
            │
            ▼
  [ BƯỚC 2: Tính n và φ(n) ] ──► n = 3233, φ(n) = 3120
            │
            ▼
  [ BƯỚC 3: Chọn e ] ──► e = 17 (UCLN(17, 3120) = 1)
            │
            ▼
  [ BƯỚC 4: Tính d ] ──► d = 2753 (sao cho (17 × 2753) mod 3120 = 1)
 

Chi tiết các bước tính toán:

  • Bước 1: Chọn 2 số nguyên tố $p$ và $q$

    • Giả sử chọn: $p = 61$ và $q = 53$.

  • Bước 2: Tính Modulus $n$ và Hàm Euler $\phi(n)$

    • $n = p \times q = 61 \times 53 = 3233$

    • $\phi(n) = (p - 1) \times (q - 1) = (61 - 1) \times (53 - 1) = 60 \times 52 = 3120$

  • Bước 3: Chọn Khóa công khai $e$ (Public Exponent)

    • Chọn $e$ sao cho $1 < e < \phi(n)$ và $e$ nguyên tố cùng nhau với $\phi(n)$ (tức là $\gcd(e, \phi(n)) = 1$).

    • Chọn $e = 17$ (Vì $17$ là số nguyên tố và không phải là ước của $3120$).

    • 🔑 Public Key thu được: $(e, n) = (17, 3233)$

  • Bước 4: Tính Khóa bí mật $d$ (Private Exponent)

    • Tìm $d$ là Nghịch đảo mô-đun của $e$ theo mô-đun $\phi(n)$:

      $$(d \times e) \equiv 1 \pmod{\phi(n)} \quad \Leftrightarrow \quad (d \times 17) \pmod{3120} = 1$$
    • Áp dụng Thuật toán Euclid mở rộng, ta tìm được $d = 2753$.

    • Kiểm tra lại: $17 \times 2753 = 46801 = 15 \times 3120 + 1$ (Chuẩn xác!).

    • 🔒 Private Key thu được: $(d, n) = (2753, 3233)$

3. CHỨNG MINH TOÁN HỌC: QUY TRÌNH KÝ & XÁC MINH

Giả sử ta có mã băm của một văn bản (sau khi nén về số nhỏ) là $H = 65$.

✍️ Phía người ký (Dùng Private Key $(d, n) = (2753, 3233)$):

Người ký tính Chữ ký số $S$:

$$S = H^d \pmod n = 65^{2753} \pmod{3233}$$

Bằng thuật toán bình phương và nhân liên tiếp (Fast Exponentiation), máy tính tính ra:

$$S = 2790$$

🔍 Phía người nhận (Dùng Public Key $(e, n) = (17, 3233)$):

Người nhận giải mã chữ ký $S = 2790$ để tìm lại mã băm ban đầu $H'$:

$$H' = S^e \pmod n = 2790^{17} \pmod{3233}$$

Máy tính thực hiện phép tính số dư:

$$H' = 65$$

👉 Kết quả: $H' = H = 65$. Bản chất toán học hoàn toàn khớp!

❓ TẠI SAO $(H^d)^e \pmod n$ LẠI BẰNG $H$? (BỐC TÁCH CÔNG THỨC)

Theo quy tắc lũy thừa:

$$(H^d)^e \pmod n = H^{d \cdot e} \pmod n$$

Vì ở Bước 4 ta đã chọn $d$ sao cho $d \cdot e \equiv 1 \pmod{\phi(n)}$, nghĩa là tồn tại một số nguyên $k$ sao cho:

$$d \cdot e = k \cdot \phi(n) + 1$$

Thay vào biểu thức trên:

$$H^{d \cdot e} = H^{k \cdot \phi(n) + 1} = (H^{\phi(n)})^k \times H^1$$

Theo Định lý Euler, với mọi $H$ nguyên tố cùng nhau với $n$, ta luôn có:

$$H^{\phi(n)} \equiv 1 \pmod n$$

Thế $1$ vào công thức:

$$H^{d \cdot e} \equiv (1)^k \times H \equiv H \pmod n$$

💡 Kết luận toán học: Việc ký bằng $d$ rồi mở bằng $e$ chính là đưa số $H$ mũ lên một số dạng $k \cdot \phi(n) + 1$, và nhờ định lý Euler, phần $k \cdot \phi(n)$ sẽ tự động biến thành $1$, chỉ còn lại chính số $H$ ban đầu!

4. BÀI TẬP BẰNG PYTHON THỦ CÔNG (KHÔNG DÙNG HÀM CÓ SẴN)

Dưới đây là đoạn code minh họa từng bước phép nhân và phép lấy dư từng bước nhỏ để sinh viên thấy rõ dòng chảy toán học:

# =====================================================================
# BÀI 5: MINH HỌA BẢN CHẤT TOÁN HỌC RSA BẰNG PYTHON
# =====================================================================

# 1. Khởi tạo số liệu toán học
p, q = 61, 53
n = p * q            # 3233
phi_n = (p - 1) * (q - 1) # 3120
e = 17
d = 2753             # d = pow(e, -1, phi_n)

print(f"1. Khởi tạo: n = {n}, Phi(n) = {phi_n}")
print(f"   Public Key  (e, n): ({e}, {n})")
print(f"   Private Key (d, n): ({d}, {n})\n")

# 2. Giả sử Mã băm văn bản H = 65
H = 65
print(f"2. Mã băm ban đầu (H): {H}")

# 3. Ký số bằng Private Key: S = (H^d) mod n
# Dùng hàm pow(base, exp, mod) thực hiện thuật toán Bình phương & Nhân
S = pow(H, d, n)
print(f"3. Chữ ký số tạo ra (S) = ({H}^{d}) mod {n} = {S}")

# 4. Xác minh bằng Public Key: H_prime = (S^e) mod n
H_prime = pow(S, e, n)
print(f"4. Giải mã chữ ký (H') = ({S}^{e}) mod {n} = {H_prime}\n")

# 5. So sánh toán học
print(f"📊 So sánh H và H': {H} == {H_prime} => {'CHÍNH XÁC 100%' if H == H_prime else 'SAI'}")

 

 

5. TÓM TẮT & CÂU HỎI BỎ TÚI FOR SINH VIÊN

Bảng tóm tắt các hằng số toán học trong RSA:

Ký hiệu Tên gọi Yêu cầu toán học Vai trò
$p, q$ Số nguyên tố ban đầu Số nguyên tố rất lớn (Thực tế $> 1024$ bits) Giữ bí mật tuyệt đối (dùng tính $\phi(n)$)
$n$ Modulus $n = p \times q$ Công khai (nằm trong cả Pub/Priv Key)
$\phi(n)$ Hàm Phi-Euler $\phi(n) = (p-1)(q-1)$ Giữ bí mật (dùng để tính $d$)
$e$ Public Exponent $\gcd(e, \phi(n)) = 1$ Công khai (Nằm trong Public Key)
$d$ Private Exponent $(d \times e) \pmod{\phi(n)} = 1$ Bí mật (Nằm trong Private Key)

✏️ CÂU HỎI BÀI TẬP BỎ TÚI CHO SINH VIÊN

Câu hỏi: Nếu một Hacker biết được Public Key $(e, n)$, tại sao họ không tự tính $\phi(n) = (p-1)(q-1)$ rồi dùng thuật toán Euclid mở rộng để tìm ra Private Key $d$?

Đáp án:

  • Để tính được $\phi(n)$, Hacker bắt buộc phải biết được $p$ và $q$.

  • Muốn biết $p$ và $q$ từ $n$, Hacker phải phân tích số $n$ thành tích 2 số nguyên tố. Trong thực tế, $n$ có độ dài 2048 đến 4096 bits (hàng trăm chữ số). Với siêu máy tính hiện nay, việc phân tích một số $n$ lớn như vậy sẽ mất hàng triệu năm!