Entropy Là Gì — Từ Nhiệt Động Học Đến Tin Học & Mật Mã

Entropy — Đo Lường Sự Bất Định

1. Entropy Trong Vật Lý: Nhiệt Động Học

Thuật ngữ 'entropy' (Ἐντροπία) được Rudolf Clausius đặt năm 1865, từ tiếng Hy Lạp ἐν (en = trong) + τροπή (tropē = biến đổi). Trong nhiệt động học:

Entropy (S) = Đo lường mức độ hỗn loạn (disorder) của hệ thống

Định luật Nhiệt động II: Entropy của hệ cô lập luôn tăng theo thời gian. Đá tan trong nước ấm — entropy tăng. Không bao giờ tự đóng băng lại — entropy không tự giảm.

Công thức Boltzmann (khắc trên bia mộ ông):

S = k_B × ln(Ω)

Trong đó:
  S   = Entropy
  k_B = Hằng số Boltzmann (1.380649 × 10⁻²³ J/K)
  Ω   = Số vi trạng thái (microstates) khả dĩ
  ln  = Logarithm tự nhiên

2. Entropy Trong Tin Học: Shannon Entropy

Claude Shannon (1948) 'A Mathematical Theory of Communication' — Shannon mượn thuật ngữ entropy từ vật lý để đo lường lượng thông tin (information content) trong một thông điệp.

Shannon Entropy: H(X) = −Σ p(x) × log₂ p(x)

Đơn vị: bit (khi dùng log₂) hoặc nat (khi dùng ln).

Ví dụ tính toán:

import math

def shannon_entropy(probabilities):
    """Tính Shannon entropy (bits)"""
    return -sum(p * math.log2(p) for p in probabilities if p > 0)

# Đồng xu công bằng: H = 1 bit
fair_coin = [0.5, 0.5]
print(f"Đồng xu công bằng: {shannon_entropy(fair_coin):.2f} bits")  # 1.00

# Đồng xu gian lận (90% head): H < 1 bit
biased = [0.9, 0.1]
print(f"Đồng xu gian lận:  {shannon_entropy(biased):.2f} bits")  # 0.47

# Xúc xắc 6 mặt: H = log₂(6) ≈ 2.585 bits
dice = [1/6] * 6
print(f"Xúc xắc 6 mặt:    {shannon_entropy(dice):.2f} bits")  # 2.58

# 1 byte ngẫu nhiên: H = 8 bits (maximum)
uniform_byte = [1/256] * 256
print(f"Byte ngẫu nhiên:   {shannon_entropy(uniform_byte):.2f} bits")  # 8.00

Ý nghĩa trực quan:

  • H = 0 bit: Hoàn toàn xác định — biết chắc kết quả (không có thông tin mới)
  • H = 1 bit: Tương đương 1 câu hỏi có/không — đồng xu công bằng
  • H = 8 bit: 1 byte ngẫu nhiên hoàn toàn — cần 8 câu hỏi yes/no để xác định
  • H = 128 bit: UUID v4 — 2¹²² khả năng (6 bit dành cho version/variant)
  • H = 256 bit: Private key Bitcoin/Ethereum — vũ trụ sẽ chết nhiệt trước khi brute-force xong

3. Entropy Trong Mật Mã (Cryptographic Entropy)

Trong mật mã, entropy là thước đo sức mạnh của randomness. CSPRNG cần thu thập đủ entropy từ các nguồn vật lý trước khi sinh số:

3.1. Nguồn Entropy trong OS

  • /dev/random (Linux): Block nếu entropy pool cạn — an toàn nhất (Linux < 5.6)
  • /dev/urandom (Linux): Không block — dùng CSPRNG khi pool cạn — khuyến nghị cho hầu hết trường hợp
  • getrandom() syscall (Linux 3.17+): Block chỉ khi boot chưa đủ entropy — best practice hiện đại
  • CryptGenRandom (Windows): Thu thập từ nhiều nguồn hardware
  • getentropy() (macOS/OpenBSD): Tương tự getrandom()

3.2. Nguồn Entropy Vật Lý

  • Hardware RNG: Intel RDRAND/RDSEED — đọc thermal noise từ transistor
  • Mouse/keyboard timing: Thời điểm chính xác (microsecond) khi user di chuột, gõ phím
  • Disk I/O timing: Jitter từ seek time, rotational latency
  • Network packet timing: Jitter từ mạng
  • Quantum RNG: Đo photon polarization — entropy thật sự ngẫu nhiên (theo cơ học lượng tử)

Linux kernel entropy pool:

# Kiểm tra entropy hiện tại trong Linux
cat /proc/sys/kernel/random/entropy_avail
# Output: 256 (bits available — nếu > 256 thì getrandom() không block)

# Xem thông tin chi tiết
cat /proc/sys/kernel/random/poolsize
# Output: 256 (bits — từ Linux 5.18, fixed at 256)

# Thêm entropy từ hardware RNG
rngd -r /dev/hwrng  # rng-tools daemon

4. Entropy Trong Password

Entropy đo sức mạnh mật khẩu: số bits cần thiết để brute-force.

def password_entropy(length, charset_size):
    """Tính entropy của mật khẩu"""
    import math
    return length * math.log2(charset_size)

# Ví dụ:
print(f"8 chữ thường:     {password_entropy(8, 26):.1f} bits")   # 37.6
print(f"8 chữ hoa+thường:  {password_entropy(8, 52):.1f} bits")   # 45.6
print(f"8 mixed+digits:    {password_entropy(8, 62):.1f} bits")   # 47.6
print(f"8 tất cả ký tự:    {password_entropy(8, 95):.1f} bits")   # 52.6
print(f"12 mixed+digits:   {password_entropy(12, 62):.1f} bits")  # 71.5
print(f"4 từ tiếng Anh:    {password_entropy(4, 7776):.1f} bits") # 51.7 (diceware)
print(f"6 từ tiếng Anh:    {password_entropy(6, 7776):.1f} bits") # 77.5 (diceware)

# Khuyến nghị: >= 80 bits cho người dùng, >= 128 bits cho system key

5. Entropy Trong Lý Thuyết Thông Tin

Shannon entropy có các ứng dụng quan trọng:

  • Nén dữ liệu (Data Compression): Entropy = giới hạn dưới của nén. Không thể nén file nhỏ hơn entropy của nó. ZIP, GZIP, Brotli đều tiệm cận giới hạn Shannon
  • Mã hóa tối ưu (Huffman/Arithmetic Coding): Mã hóa ký tự thường gặp bằng ít bits hơn
  • Cross-Entropy Loss (Machine Learning): Hàm loss phổ biến nhất cho classification — đo khoảng cách giữa predicted distribution và true distribution
  • KL Divergence: D_KL(P||Q) = Σ P(x) × log(P(x)/Q(x)) — đo sự khác biệt giữa 2 phân phối

6. Tổng Kết: 4 Ý Nghĩa Của Entropy

  1. Vật lý: Đo mức hỗn loạn — luôn tăng trong hệ cô lập (Nhiệt động II)
  2. Tin học (Shannon): Đo lượng thông tin — bits cần thiết để mã hóa thông điệp
  3. Mật mã: Đo sức mạnh ngẫu nhiên — bits entropy trong key/password/seed
  4. Machine Learning: Cross-entropy — đo chất lượng dự đoán của model