Mật mã Caesar là cách thay mỗi chữ cái bằng chữ đứng sau nó một số bước cố định trong bảng chữ cái; theo sử gia La Mã Suetonius, Julius Caesar dùng bước dịch 3, tức A thành D, B thành E. Nó dễ phá vì với bảng 26 chữ chỉ có 25 cách dịch khác nhau, thử hết trong vài phút, và kiểu chữ lặp lại của ngôn ngữ vẫn lộ nguyên sau khi mã hoá.
Dù yếu, mật mã Caesar là bài học nhập môn hoàn hảo: nó chứa gần đủ những khái niệm cốt lõi của mật mã học — thuật toán, khoá, và cách tấn công.
Suetonius kể gì về Caesar
Nguồn chính là cuốn Cuộc đời mười hai hoàng đế của Suetonius, viết vào đầu thế kỷ II. Trong phần về Julius Caesar, Suetonius kể rằng khi cần viết điều gì bí mật, Caesar thay mỗi chữ bằng chữ đứng thứ tư tính từ nó trong bảng chữ cái — D thay cho A, và cứ thế. "Thứ tư" theo cách đếm của người La Mã (tính cả chữ gốc) chính là dịch đi 3 bước.
Cũng Suetonius kể về hoàng đế Augustus, người kế vị: Augustus dùng bước dịch 1 — B thay cho A — và không quay vòng về đầu bảng; chữ cuối cùng được viết thành AA. Như vậy cả hai đời hoàng đế đầu tiên của La Mã đều dùng biến thể của cùng một ý tưởng.
Ngoài Suetonius, nhà văn Aulus Gellius ở thế kỷ II cũng nhắc tới việc Caesar có những bức thư viết bằng chữ cái bị đổi chỗ. Chúng ta không có bức thư mã hoá nào của Caesar còn sót lại.
Cách hoạt động: từng bước
Viết hai hàng chữ
Cách dễ hiểu nhất là viết bảng chữ cái thành hai hàng, hàng dưới trượt sang trái 3 ô:
| Chữ gốc | A | B | C | D | E | F | G | H | I | J | K | L | M |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chữ mã | D | E | F | G | H | I | J | K | L | M | N | O | P |
| Chữ gốc | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
| Chữ mã | Q | R | S | T | U | V | W | X | Y | Z | A | B | C |
Ba chữ cuối X, Y, Z quay vòng về A, B, C. Đây là điểm khác so với cách của Augustus.
Thử một câu
Lấy câu tiếng Việt viết không dấu "HEN NHAU BEN GOC DA", dịch mỗi chữ đi 3 bước:
- HEN → KHQ
- NHAU → QKDX
- BEN → EHQ
- GOC → JRF
- DA → GD
Thư mã hoá là "KHQ QKDX EHQ JRF GD". Người nhận biết bước dịch là 3 thì làm ngược lại: lùi mỗi chữ 3 bước.
Viết bằng toán
Đánh số A = 0, B = 1, … Z = 25. Gọi khoá là k. Mã hoá: chữ mã = (chữ gốc + k) chia lấy dư cho 26. Giải mã: chữ gốc = (chữ mã − k) chia lấy dư cho 26. Phép "chia lấy dư" chính là cái vòng quay từ Z về A — giống như kim đồng hồ đi quá 12 thì quay về 1.
Ba khái niệm mật mã nằm sẵn trong Caesar
- Thuật toán: quy tắc chung — "dịch mỗi chữ đi k bước". Thuật toán có thể công khai.
- Khoá: con số k cụ thể. Khoá phải giữ bí mật.
- Không gian khoá: số khoá có thể có. Với bảng 26 chữ, chỉ có 25 khoá có nghĩa (k = 0 thì thư không đổi).
Nguyên tắc mà nhà mật mã học Auguste Kerckhoffs phát biểu năm 1883 — một hệ mã tốt vẫn phải an toàn ngay cả khi đối phương biết thuật toán, chỉ không biết khoá — cho thấy ngay điểm chết của Caesar: biết thuật toán rồi thì 25 khoá là quá ít.
Cách phá thứ nhất: thử hết các khoá
Gặp một thư mã Caesar, bạn chỉ cần viết 25 phiên bản dịch ngược, mỗi phiên bản một khoá, rồi nhìn xem dòng nào đọc ra nghĩa. Với một câu ngắn, làm bằng tay mất vài phút. Kỹ thuật này gọi là vét cạn (brute force): không cần thông minh, chỉ cần kiên nhẫn.
Mẹo nhỏ: chỉ cần thử trên một từ ngắn của thư. Với "GD" ở cuối thư mẫu, lùi 1 bước được "FC", lùi 2 được "EB", lùi 3 được "DA" — một từ tiếng Việt có nghĩa. Thử khoá 3 cho cả thư là xong.
Cách phá thứ hai: đếm tần suất chữ
Phát hiện của al-Kindi
Phương pháp quan trọng hơn được mô tả lần đầu trong một chuyên luận của học giả Ả Rập al-Kindi ở Baghdad, thế kỷ IX, về cách giải các thư mã hoá. Ý tưởng của ông: trong mọi ngôn ngữ, một số chữ cái xuất hiện nhiều hơn hẳn các chữ khác. Đếm chữ trong thư mã, chữ nào nhiều nhất có lẽ ứng với chữ thông dụng nhất của ngôn ngữ đó.
Với mã Caesar, chỉ cần đoán đúng một cặp chữ là biết khoá, vì mọi chữ đều dịch cùng một bước. Trong tiếng Anh, E là chữ thông dụng nhất; thư mã nào có chữ H nhiều nhất thì rất có thể khoá là 3.
Với tiếng Việt viết không dấu
Tiếng Việt bỏ dấu có những chữ xuất hiện dày đặc vì nằm trong các tổ hợp quen như NG, NH, TH, CH và các nguyên âm A, I. Một thư mã Caesar tiếng Việt đủ dài sẽ lộ ra vài chữ nổi trội rất rõ. Dấu cách giữa các từ còn giúp thêm: từ một chữ cái hiếm khi gặp trong tiếng Việt viết không dấu, còn từ hai chữ như "DA", "LA", "CO" thì rất nhiều — đoán một từ ngắn là đủ.
Đó là lý do người dùng mật mã nghiêm túc thời sau bỏ dấu cách và gom chữ thành từng nhóm năm.
Các biến thể của Caesar
| Biến thể | Cách làm | Có khó phá hơn không |
|---|---|---|
| Caesar gốc | Dịch 3 bước | Không: 25 khoá |
| Cách của Augustus | Dịch 1 bước, không quay vòng | Không, còn lộ hơn |
| ROT13 | Dịch 13 bước; làm hai lần thì về lại thư gốc | Không — chỉ dùng để che tạm lời giải, câu đố trên mạng |
| Thay thế đơn bảng | Mỗi chữ thay bằng một chữ bất kỳ theo một bảng xáo trộn | Nhiều khoá hơn hẳn, nhưng vẫn gục trước phép đếm tần suất |
| Vigenère | Mỗi chữ dịch theo một bước khác nhau, lặp theo một từ khoá | Có — đứng vững gần ba thế kỷ |
Bảng thay thế xáo trộn có tới khoảng 400 triệu tỉ tỉ cách sắp (26 giai thừa) — nhiều hơn số hạt cát trên Trái Đất rất nhiều. Nhưng phép đếm tần suất của al-Kindi vẫn phá được, vì mỗi chữ gốc luôn biến thành cùng một chữ mã. Bài học lớn: nhiều khoá chưa chắc đã an toàn, nếu cấu trúc ngôn ngữ vẫn lộ ra ngoài.
Đĩa mã: làm một dụng cụ Caesar bằng bìa
Thế kỷ XV, kiến trúc sư người Ý Leon Battista Alberti mô tả một chiếc đĩa mã gồm hai vòng chữ đồng tâm xoay được. Bạn có thể làm phiên bản đơn giản ở nhà:
- Cắt hai đĩa bìa, một to (đường kính khoảng 12 cm) và một nhỏ (khoảng 9 cm).
- Chia mép mỗi đĩa thành 26 ô bằng nhau (mỗi ô khoảng 13,8 độ), ghi A đến Z theo cùng chiều.
- Chồng đĩa nhỏ lên đĩa to, ghim ở tâm bằng đinh ghim giấy hai chân.
- Xoay đĩa nhỏ sao cho A của vòng ngoài thẳng hàng với D của vòng trong: đó là khoá 3. Tra chữ ở vòng ngoài, đọc chữ mã ở vòng trong.
Với trẻ lớn, đây là bài thủ công kết hợp toán: chia đường tròn, đếm bước, hiểu "quay vòng".
Góc nhìn hôm nay: Caesar vẫn còn ở đâu
- Mật thư đi trại: kiểu mật thư "dịch chuyển" chính là mã Caesar, với khoá ẩn trong một câu đố (xem bài mật thư đi trại).
- ROT13 trên mạng: dùng để giấu lời giải câu đố hay nội dung tiết lộ cốt truyện — ai muốn đọc thì tự giải.
- Lớp học lập trình: viết chương trình mã hoá Caesar là bài tập kinh điển cho người mới học, vì nó dạy vòng lặp, xử lý chuỗi và phép chia lấy dư.
- Đọc thêm: The Code Book (Simon Singh, 1999) kể lịch sử mật mã từ Caesar tới thời hiện đại rất dễ đọc, và đã có bản dịch tiếng Việt.
Điều đáng nhớ: Caesar không an toàn, nhưng hiểu vì sao nó không an toàn là bước đầu tiên để hiểu mọi hệ mã mạnh hơn sau này.
Câu hỏi thường gặp
Mật mã Caesar là gì?
Mật mã Caesar là cách mã hoá thay mỗi chữ cái bằng chữ đứng sau nó một số bước cố định trong bảng chữ cái. Theo Suetonius, Julius Caesar dùng bước dịch 3, tức A thành D, B thành E, và X, Y, Z quay vòng về A, B, C.
Làm sao giải mật mã Caesar khi không biết khoá?
Cách đơn giản nhất là thử lần lượt cả 25 bước dịch, dòng nào đọc ra nghĩa thì đó là khoá đúng. Cách thứ hai là đếm tần suất chữ cái trong thư mã và so với chữ thông dụng nhất của ngôn ngữ.
Vì sao mật mã Caesar dễ phá?
Vì chỉ có 25 khoá khả dĩ với bảng 26 chữ, thử hết rất nhanh. Ngoài ra mỗi chữ gốc luôn biến thành cùng một chữ mã, nên kiểu lặp chữ của ngôn ngữ vẫn lộ nguyên trong thư mã hoá.
ROT13 có phải là mật mã Caesar không?
Có, ROT13 là mật mã Caesar với bước dịch 13. Vì bảng chữ Latinh có 26 chữ, mã hoá hai lần bằng ROT13 sẽ ra lại thư gốc. Nó chỉ dùng để che tạm nội dung, không dùng để bảo mật.
Ai phát minh cách phá mã bằng đếm tần suất chữ?
Mô tả sớm nhất được biết thuộc về học giả Ả Rập al-Kindi ở Baghdad vào thế kỷ IX. Ông nhận ra mỗi ngôn ngữ có những chữ cái xuất hiện nhiều hơn hẳn, và dùng điều đó để đoán chữ gốc từ chữ mã.