BÍ MẬT CẶP KHÓA PUBLIC KEY & PRIVATE KEY (MÃ HÓA BẤT ĐỐI XỨNG)

Ở Bài 1, chúng ta đã biết Chữ ký số giúp giải quyết bài toán chống giả mạo và chống sửa đổi dữ liệu. Nhưng làm thế nào mà máy tính làm được điều kỳ diệu đó?

Câu trả lời nằm ở trái tim của bảo mật hiện đại: Mã hóa bất đối xứng (Asymmetric Cryptography) và Cặp khóa Khóa công khai (Public Key) - Khóa bí mật (Private Key).

1. KHÁI NIỆM (CONCEPT)

Trước khi hiểu "Mã hóa bất đối xứng", hãy nhớ lại cách chúng ta khóa cửa nhà: Bạn dùng 1 chiếc chìa khóa để khóa cửa, và cũng dùng chính chiếc chìa khóa đó để mở cửa. Đó gọi là Mã hóa đối xứng (Symmetric Cryptography).

Tuy nhiên, trên Internet, nếu gửi chiếc chìa khóa đó cho người khác qua mạng để họ mở khóa, chìa khóa rất dễ bị Hacker "chặn đường" lấy mất.

Mã hóa bất đối xứng giải quyết triệt me vấn đề này bằng cách sử dụng 2 chiếc chìa khóa khác nhau nhưng có mối quan hệ toán học chặt chẽ:

Plaintext
               ┌─────────────────────────────────────────────────────────┐
               │              CẶP KHÓA (KEY PAIR) DO MÁY TÍNH TẠO RA     │
               └────────────────────────────┬────────────────────────────┘
                                            │
                     ┌──────────────────────┴──────────────────────┐
                     ▼                                             ▼
       ┌───────────────────────────┐                 ┌───────────────────────────┐
       │   KHÓA CÔNG KHAI          │                 │   KHÓA BÍ MẬT             │
       │   (PUBLIC KEY)            │                 │   (PRIVATE KEY)           │
       ├───────────────────────────┤                 ├───────────────────────────┤
       │ • Ai cũng có thể biết.    │                 │ • CHỈ DUY NHẤT BẠN GIỮ.   │
       │ • Chia sẻ tự do trên mạng.│                 │ • Tuyệt đối KHÔNG đưa ai. │
       │ • Dùng để XÁC MINH chữ ký.│                 │ • Dùng để TẠO chữ ký.     │
       └───────────────────────────┘                 └───────────────────────────┘

⚙️ Quy tắc toán học vàng:

  1. Dữ liệu được khóa (mã hóa) bằng Private Key $\rightarrow$ Chỉ mở (giải mã) được bằng Public Key tương ứng.

  2. Dữ liệu được khóa (mã hóa) bằng Public Key $\rightarrow$ Chỉ mở (giải mã) được bằng Private Key tương ứng.

  3. Biết Public Key KHÔNG THỂ tính ngược ra Private Key.

2. VÍ DỤ THỰC TẾ & BÀI TOÁN ĐẶT RA (REAL-WORLD EXAMPLE)

Để dễ hình dung cho các bạn, hãy tưởng tượng một hình ảnh ở đời thực: Hòm thư bưu điện.

📮 Chiếc hòm thư nhà bạn

  • Public Key (Khóa công khai) = Địa chỉ hòm thư & Khe thả thư:

    Nhân viên bưu điện, bạn bè, hay bất kỳ ai đi ngang qua đường cũng đều biết địa chỉ hòm thư của bạn và có thể thả thư vào trong. Nhưng một khi thư đã rơi vào trong hòm, không ai có thể thò tay vào lấy thư ra được.

  • Private Key (Khóa bí mật) = Chiếc chìa khóa hòm thư:

    Chỉ có duy nhất bạn giữ chiếc chìa khóa này. Bạn dùng nó để mở đáy hòm thư và lấy thư ra đọc.

🟢 Ứng dụng cặp khóa trong 2 kịch bản thực tế:

Kịch bản A: Muốn bảo mật thông tin (Mã hóa tin nhắn)

  • Mục tiêu: Bạn Bob muốn gửi cho bạn Alice một bí mật mà không ai trên mạng đọc được.

  • Cách làm:

    1. Bob lấy Public Key của Alice (được công khai trên mạng) để khóa tin nhắn lại.

    2. Bob gửi gói tin đã khóa qua Internet.

    3. Dù Hacker có chặn được gói tin cũng không mở được, vì gói tin đã khóa bằng Public Key của Alice thì chỉ có Private Key của Alice mới mở được.

Kịch bản B: Muốn chứng minh chính chủ (Tạo Chữ ký số)

  • Mục tiêu: Alice muốn gửi một thông báo và chứng minh "Chính tôi là Alice viết tin này!".

  • Cách làm:

    1. Alice dùng Private Key của chính mình để khóa (ký) tin nhắn.

    2. Alice gửi tin nhắn + chữ ký đó cho mọi người.

    3. Bất kỳ ai (Bob, thầy giáo, bạn bè) cũng có thể dùng Public Key của Alice để mở thử. Nếu mở được thành công, họ chắc chắn 100% tin nhắn này do Alice tạo ra (vì chỉ có Alice mới có Private Key tương ứng để ký).

3. GIẢI THÍCH CHI TIẾT (EXPLANATION)

Tại sao lại có mối quan hệ kỳ diệu giữa Public Key và Private Key?

Các nhà toán học đã dựa vào các bài toán rất dễ tính theo chiều thuận nhưng cực kỳ khó tính theo chiều ngược lại. Ví dụ điển hình nhất là Bài toán Nhân số nguyên tố (Thuật toán RSA):

  • Chiều thuận (Máy tính làm trong 0.0001 giây):

    Cho hai số nguyên tố $p = 61$ và $q = 53$. Tính tích $n = p \times q$.

    $$\rightarrow n = 61 \times 53 = 3233$$
  • Chiều ngược (Máy tính phải mất hàng nghìn năm nếu số cực lớn):

    Cho số $n = 3233$. Hãy tìm lại 2 số nguyên tố ban đầu $p$ và $q$?

    $$\rightarrow \text{Máy tính phải thử chia rất nhiều lần mới tìm ra } 61 \text{ và } 53.$$

Trong thuật toán RSA:

  • Cặp số nguyên tố ban đầu $(p, q)$ được dùng để tạo ra Private Key.

  • Tích $n$ và hằng số đi kèm được dùng để tạo ra Public Key.

Nhờ sự chênh lệch về năng lực tính toán này, bạn có thể thoải mái công khai Public Key ($n$) mà không sợ ai đoán ra Private Key ($p, q$).

  •  

4. MINH HỌA BẰNG PYTHON CƠ BẢN (PURE PYTHON)

Để thấy rõ cặp khóa hoạt động như thế nào, chúng ta hãy viết một đoạn mã Python ngắn (chỉ dùng các hàm số học có sẵn của Python) để minh họa việc tạo khóa và mã hóa/giải mã.

# =====================================================================
# BÀI 2: MINH HỌA NGUYÊN LÝ CẶP KHÓA RSA BẰNG PYTHON THUẦN
# =====================================================================

# 1. Chọn 2 số nguyên tố nhỏ (Trong thực tế sẽ dùng số nguyên tố có hàng trăm chữ số)
p = 61
q = 53

# 2. Tính n (Modulus) và Euler's totient (phi_n)
n = p * q            # n = 3233
phi_n = (p - 1) * (q - 1) # phi_n = 3120

# 3. Chọn e (Public Exponent) nguyên tố cùng nhau với phi_n
e = 17

# 4. Tính d (Private Exponent) sao cho: (d * e) % phi_n == 1
# Trong Python, pow(e, -1, phi_n) sẽ tính nghịch đảo mô-đun
d = pow(e, -1, phi_n) # d = 2753

# --- ĐÓNG GÓI CẶP KHÓA ---
public_key = (e, n)   # (17, 3233)  -> Công khai cho mọi người
private_key = (d, n)  # (2753, 3233) -> CHỈ Alice giữ

print(f"🔑 Public Key  (dùng để mở/xác minh): {public_key}")
print(f"🔒 Private Key (dùng để khóa/ký):     {private_key}\n")

# --- THỬ NGHỆM MÃ HÓA VÀ GIẢI MÃ ---
# Giả sử ta có 1 con số bí mật cần gửi (Message)
secret_number = 65  # Giả sử là mã ASCII của chữ 'A'
print(f"Dữ liệu ban đầu: {secret_number}")

# KÝ/MÃ HÓA bằng Private Key của Alice: C = (M ^ d) % n
signed_data = pow(secret_number, d, n)
print(f"Dữ liệu sau khi KÝ bằng Private Key (Chữ ký): {signed_data}")

# XÁC MINH/GIẢI MÃ bằng Public Key của Alice: M = (C ^ e) % n
restored_data = pow(signed_data, e, n)
print(f"Dữ liệu khôi phục lại bằng Public Key: {restored_data}")

# Kiểm tra kết quả
if restored_data == secret_number:
    print("\n✅ THÀNH CÔNG: Public Key và Private Key khớp hoàn toàn với nhau!")

 

5.NGUYÊN LÝ TOÁN HỌC CỦA RSA (Dành cho bạn nào tò mò)

Để minh họa bằng Python cơ bản, chúng ta sử dụng phiên bản thu nhỏ của RSA:

  1. Chọn 2 số nguyên tố $p$ và $q$. Tính $n = p \times q$.

  2. Tính hàm Euler: $\phi(n) = (p - 1) \times (q - 1)$.

  3. Chọn $e$ sao cho $1 < e < \phi(n)$ và $e$ nguyên tố cùng nhau với $\phi(n)$. (Cặp $(e, n)$ là Public Key).

  4. Tính $d$ sao cho $(d \times e) \pmod{\phi(n)} = 1$. (Cặp $(d, n)$ là Private Key).

Quy trình Ký & Xác minh:

  • Ký số (Sign): $\text{Signature} = (\text{Hash})^{\,d} \pmod n$

  • Xác minh (Verify): $\text{Hash}' = (\text{Signature})^{\,e} \pmod n$

  • Nếu $\text{Hash}' == \text{Hash}$ gốc $\rightarrow$ Chữ ký hợp lệ!

(Phần chứng minh sẽ được thảo luận trong các bài học sau).

 

5. TÓM TẮT & BÀI TẬP BỎ TÚI

Bảng tóm tắt công dụng của cặp khóa:

Hành động Dùng Khóa nào để thực hiện? Ai là người thực hiện?
Mã hóa tin nhắn bí mật Public Key của người nhận Người gửi (Bất kỳ ai)
Giải mã tin nhắn bí mật Private Key của mình Người nhận (Chủ sở hữu)
Tạo Chữ ký số Private Key của mình Người ký (Chủ sở hữu)
Xác minh Chữ ký số Public Key của người ký Người kiểm tra (Bất kỳ ai)

 

✏️ CÂU HỎI BÀI TẬP BỎ TÚI 

Câu hỏi: Nếu bạn làm mất Private Key của mình thì điều gì tồi tệ nhất sẽ xảy ra? Bạn có thể xin ai cấp lại Private Key đó không?

Đáp án:

  1. Hậu quả: Bạn sẽ không thể tạo chữ ký số được nữa, đồng thời không thể đọc bất kỳ tài liệu nào được người khác mã hóa gửi riêng cho bạn.

  2. Không ai cấp lại được: Trong mã hóa bất đối xứng, Private Key không được lưu ở bất kỳ máy chủ nào. Nếu mất Private Key, bạn phải hủy bỏ cặp khóa cũ và tạo lại một cặp khóa hoàn toàn mới.