Mục tiêu: cung cấp nền tảng thực tiễn và mã nguồn minh họa cho các phương pháp mật mã chính — từ các giải thuật cổ điển đến các cơ chế mật mã hiện đại (hàm băm, mã hóa đối xứng, mã hóa bất đối xứng). Các ví dụ bằng mã nguồn Python nhằm giúp học viên nắm được nguyên lý và thực hành nhanh.
I. Mật mã cổ điển — ví dụ thực hành
- Caesar cipher (dịch chuyển ký tự)
- Nguyên lý: dịch mỗi ký tự trong bảng chữ cái theo một bước cố định k.
- Hạn chế: dễ giải mã bằng tấn công brute force hoặc phân tích tần suất.
Python (ví dụ đơn giản chỉ xử lý chữ thường a-z):
def caesar_encrypt(plaintext, k):
res = []
for ch in plaintext:
if 'a' <= ch <= 'z':
res.append(chr((ord(ch) - ord('a') + k) % 26 + ord('a')))
else:
res.append(ch)
return ''.join(res)
def caesar_decrypt(ciphertext, k):
return caesar_encrypt(ciphertext, -k % 26)
# Ví dụ
plain = "hello world"
k = 3
cipher = caesar_encrypt(plain, k)
print("Cipher:", cipher) # khoang: khoor zruog
print("Decrypt:", caesar_decrypt(cipher, k))
- Vigenere cipher
- Nguyên lý: dùng khóa chữ (key) lặp lại, mỗi ký tự dịch theo giá trị tương ứng của ký tự khóa.
- Hạn chế: nếu khóa ngắn và có thể phân tích chuỗi, dễ bị tấn công Kasiski hoặc phân tích tần suất theo nhóm.
Python (ví dụ với chỉ chữ thường a-z):
def vigenere_encrypt(plaintext, key):
res = []
ki = 0
for ch in plaintext:
if 'a' <= ch <= 'z':
shift = ord(key[ki % len(key)]) - ord('a')
res.append(chr((ord(ch) - ord('a') + shift) % 26 + ord('a')))
ki += 1
else:
res.append(ch)
return ''.join(res)
def vigenere_decrypt(ciphertext, key):
res = []
ki = 0
for ch in ciphertext:
if 'a' <= ch <= 'z':
shift = ord(key[ki % len(key)]) - ord('a')
res.append(chr((ord(ch) - ord('a') - shift) % 26 + ord('a')))
ki += 1
else:
res.append(ch)
return ''.join(res)
# Ví dụ
plain = "attack at dawn"
key = "lemon"
cipher = vigenere_encrypt(plain.replace(" ", ""), key)
print("Cipher:", cipher)
print("Decrypt:", vigenere_decrypt(cipher, key))
II. Hàm băm (Hash functions)
- Vai trò
- Tính toàn vẹn dữ liệu, lưu trữ mật khẩu (kết hợp salt), chữ ký số, blockchain.
- Yêu cầu: không đảo ngược được (one-way), kháng va chạm (collision resistant) càng cao càng tốt.
- Ví dụ SHA-256 bằng Python (thư viện chuẩn hashlib):
import hashlib
def sha256_hex(data: bytes) -> str:
h = hashlib.sha256()
h.update(data)
return h.hexdigest()
# Ví dụ
print(sha256_hex(b"hello world"))
- Lưu ý thực tế
- Không dùng MD5 hay SHA-1 cho mục đích bảo mật mới.
- Lưu mật khẩu bằng hàm băm: dùng salt + hàm băm chuyên dụng (bcrypt, scrypt, Argon2).
III. Mã hóa đối xứng (symmetric encryption)
- Nguyên lý
- Một khóa chia sẻ cho mã hóa và giải mã.
- Ưu: nhanh, phù hợp cho dữ liệu lớn. Nhược: quản lý khóa khó khi nhiều bên.
- AES (Advanced Encryption Standard)
- Chuẩn phổ biến: AES-128, AES-192, AES-256.
- Các mode phổ biến: CBC, GCM (GCM cung cấp cả tính bảo mật và tính toàn vẹn — authenticated encryption).
- Ví dụ mã hóa AES-GCM bằng thư viện cryptography (cần pip install cryptography):
# Cần cài: pip install cryptography
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os
def aes_gcm_encrypt(plaintext: bytes, key: bytes) -> tuple:
# key: 16/24/32 bytes (AES-128/192/256)
aesgcm = AESGCM(key)
nonce = os.urandom(12) # 96-bit nonce recommended for GCM
ct = aesgcm.encrypt(nonce, plaintext, associated_data=None)
return nonce, ct # ct includes ciphertext || tag
def aes_gcm_decrypt(nonce: bytes, ct: bytes, key: bytes) -> bytes:
aesgcm = AESGCM(key)
return aesgcm.decrypt(nonce, ct, associated_data=None)
# Ví dụ
key = AESGCM.generate_key(bit_length=128)
nonce, ct = aes_gcm_encrypt(b"Secret message", key)
pt = aes_gcm_decrypt(nonce, ct, key)
print(pt)
- Lưu ý triển khai
- Không dùng chế độ ECB.
- Sử dụng nonce/IV an toàn (không tái sử dụng cùng key cho GCM).
- Kết hợp authenticated encryption để tránh các tấn công sửa đổi dữ liệu.
IV. Mã hóa bất đối xứng (asymmetric encryption)
- Nguyên lý
- Khóa công khai (public key) dùng để mã hóa; khóa riêng (private key) dùng để giải mã.
- Ứng dụng: trao đổi khóa (key exchange), chữ ký số, chứng thực.
- RSA (ví dụ dùng thư viện cryptography)
- RSA phù hợp cho trao đổi khóa hoặc mã hóa dữ liệu nhỏ; dữ liệu lớn thường dùng mã hóa đối xứng + mã hóa khóa đối xứng bằng RSA (hybrid).
Ví dụ tạo khóa RSA, mã hóa, giải mã (cryptography):
# pip install cryptography
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
# Tạo cặp khóa
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
public_key = private_key.public_key()
# Mã hóa
message = b"Secret small message"
ciphertext = public_key.encrypt(
message,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
# Giải mã
plaintext = private_key.decrypt(
ciphertext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
print(plaintext)
- Chữ ký số (digital signature)
- Dùng để đảm bảo tính xác thực và non-repudiation.
- Ví dụ ECDSA hoặc RSA-PSS. (cryptography hỗ trợ cả hai).
V. Mật mã thực tiễn: mô hình hybrid và vận hành
- Hybrid encryption
- Quy trình điển hình: tạo khóa đối xứng tạm thời (session key), mã hóa dữ liệu bằng AES-GCM, mã hóa session key bằng RSA hoặc X25519-derived key (hoặc sử dụng ECDH để trao đổi khóa).
- Lý do: tận dụng tốc độ AES và lợi ích quản lý khóa của khóa công khai.
- Trao đổi khóa an toàn
- ECDH (Elliptic Curve Diffie-Hellman) phổ biến trong TLS 1.3.
- Sử dụng các đường cong chuẩn (curve) và thực hiện ký/tính toàn vẹn để ngăn giả mạo.
- Thực hành triển khai an toàn
- Luôn dùng thư viện đã được duy trì (không tự viết crypto ở production).
- Sử dụng chế độ AEAD (authenticated encryption with associated data).
- Hệ thống phải có quản lý vòng đời khóa (rotation, revocation).
- Quản lý entropy: tránh nguồn ngẫu nhiên yếu.
VI. Bài tập thực hành (khuyến nghị)
- Cài đặt và thử nghiệm:
- Viết chương trình Python cho Caesar và Vigenere (đã có ví dụ).
- Dùng hashlib để kiểm tra va chạm nhỏ (tạo hai chuỗi khác nhau thử SHA-256).
- Cài cryptography và mã hóa/giải mã bằng AES-GCM; thử tái sử dụng nonce và quan sát hậu quả.
- Bài tập nâng cao:
- Xây dựng ứng dụng nhỏ: upload file được mã hóa bằng AES; khóa AES được mã hóa bằng RSA, lưu kèm nonce và ciphertext. Viết hàm phục hồi file.
- Thực hiện thử nghiệm “chosen-ciphertext attack” giả định trên một cài đặt không dùng AEAD để thấy tấn công có thể xảy ra.
Tài liệu tham khảo gợi ý để nghiên cứu sâu (tên chủ đề để tìm): AES standard (FIPS 197), RSA và OAEP padding, SHA-2 family, Argon2, AEAD modes (GCM, EAX), ECDH, ECDSA, thực hành cryptography với thư viện cryptography (Python).
Leave a Comment