Mật mã Vigenère
Mật mã Vigenère là một mật mã nổi tiếng dùng nhiều bảng chữ cái mã, nhờ đó chống lại phân tích tần suất cổ điển tốt hơn nhiều.
Nguyên tắc mã hoá và giải mã
Cách mã hoá có thể giải thích qua mật mã Caesar. Khoá của mật mã Vigenère là một từ bất kì gồm các chữ cái Latinh không dấu, tức là từ a đến z. Chẳng hạn, khoá có thể là từ “bcf”. Để mã hoá, ta viết bản rõ, ngay bên dưới viết khoá và lặp lại khoá cho đến khi dòng khoá dài bằng bản rõ. Với bản rõ “xinchaoban”, ta được:
| Bản rõ: | x | i | n | c | h | a | o | b | a | n |
| Khoá: | b | c | f | b | c | f | b | c | f | b |
Bây giờ ta mã hoá từng chữ cái của bản rõ bằng mật mã Caesar với khoá tương ứng, tức là khoá nằm cùng cột. Mật mã Caesar là mật mã dịch chuyển: khoá cho biết phải dịch chữ cái của bản rõ đi bao nhiêu chữ, tính từ chữ “a”. Chẳng hạn, chữ “b” nghĩa là dịch 1 chữ cái “sang phải” trong bảng chữ cái, chữ “d” nghĩa là dịch 3 chữ cái sang phải. Với mật mã Caesar và khoá “b”, từ “chao” được mã hoá thành “dibp”.
Mật mã Caesar mã hoá cả văn bản bằng một chữ cái, còn mật mã Vigenère thường mã hoá bằng nhiều chữ cái. Mã hoá văn bản “xinchaoban” với khoá “bcf” cho kết quả:
| Bản rõ: | x | i | n | c | h | a | o | b | a | n |
| Khoá: | b | c | f | b | c | f | b | c | f | b |
| Bản mã: | y | k | s | d | j | f | p | d | f | o |
Chữ đầu tiên “x” được mã hoá với khoá “b”, tức là dịch 1 chữ cái, nên ta được chữ “y”. Chữ “i” được mã hoá với khoá “c”, tức là dịch 2 chữ cái, ta được chữ “k”. Cứ như vậy với các chữ còn lại.
Giải mã làm hoàn toàn tương tự, chỉ khác là thay vì dịch các chữ cái “sang phải”, ta dịch chúng “sang trái”.
Công cụ mã hoá và giải mã mật mã Vigenère trực tuyến
Hình vuông Vigenère
Toàn bộ quá trình mã hoá và giải mã cũng có thể giải thích bằng hình vuông Vigenère (bảng Vigenère) – một công cụ hỗ trợ khi mã hoá. Hình vuông Vigenère là một bảng có 26 dòng và 26 cột. Mỗi dòng ghi bảng chữ cái, và mỗi dòng được dịch đi 1 chữ cái so với dòng trước:
Với hình vuông Vigenère này, mã hoá thực hiện như sau: lấy chữ cái của bản rõ và tìm dòng bắt đầu bằng chữ đó. Sau đó lấy chữ cái của khoá và tìm cột bắt đầu bằng chữ đó. Chữ cái của bản mã là chữ nằm ở giao của dòng và cột ấy.
Trong ví dụ trên, ta mã hoá “xinchaoban” với khoá “bcf”. Ta tìm dòng bắt đầu bằng “x” và cột bắt đầu bằng “b”. Ở giao của dòng và cột này là chữ “y” – chữ cái của bản mã.
Khi giải mã, ta làm ngược lại. Muốn giải mã chữ “y” với khoá “b”, ta tìm cột “b”, trong cột đó tìm dòng chứa chữ “y”; chữ đứng đầu dòng này là chữ cái của bản rõ.
Sức mạnh chính của mật mã Vigenère
Vì sao vào thời ấy, mật mã Vigenère lại mạnh như vậy? Vì mật mã này gây khó khăn lớn cho phân tích tần suất cổ điển. Chẳng hạn, trong mật mã Caesar, hai chữ cái giống nhau của bản rõ luôn được mã hoá thành hai chữ cái giống nhau trong bản mã. Với mật mã Vigenère thì điều này không đúng, ít nhất là không phải lúc nào cũng đúng.
Nếu mã hoá văn bản “hanoi hanoi hanoi” với khoá “stan”, ta được bản mã “ztnba aaagb hnfhi”. Ta thấy dù bản rõ gồm 3 từ giống nhau, trong bản mã mỗi từ lại trông hoàn toàn khác. Từ ở giữa, “aaagb”, thậm chí có 3 chữ “a” liên tiếp, được tạo ra từ 3 chữ cái khác nhau của bản rõ: “han”.
Chọn khoá
Cách chọn khoá ảnh hưởng rất lớn đến độ an toàn của mật mã Vigenère. Với mật mã Caesar, chọn chữ cái nào cũng như nhau, miễn là khác “a”; còn với mật mã Vigenère, các khoá khác nhau cho mức độ an toàn khác nhau.
- Khoá chỉ gồm 1 chữ cái đưa mật mã Vigenère trở về mật mã Caesar.
- Khoá gồm nhiều chữ cái giống nhau, chẳng hạn “mmm”, cũng đưa về mật mã Caesar.
- Văn bản mã hoá bằng khoá ngắn rất dễ bị phá.
- Bản mã đủ dài, được mã hoá bằng khoá không quá ngắn (khoảng 50 kí tự), cũng rất dễ bị phá: trên máy tính chỉ mất vài giây.
- Văn bản mã hoá bằng khoá hoàn toàn ngẫu nhiên và dài bằng chính văn bản thì không thể phá được.