[Thuật toán] Mã Caesar (Mã vòng)

1. Giới thiệu mã Caesar

Trong mật mã học, mật mã Caesar, còn gọi là mật mã dịch chuyển, là một trong những mật mã đơn giản và được biết đến nhiều nhất. Mật mã là một dạng của mật mã thay thế, trong đó mỗi ký tự trong văn bản được thay thế bằng một ký tự cách nó một đoạn trong bảng chữ cái để tạo thành bản mã. Vĩ dụ, nếu độ dịch là 3, A sẽ được thay bằng D, B sẽ được thay bằng E và cứ thế đến hết. Phương pháp được đặt tên theo Caesar, vị hoàng đế đã sử dụng nó thường xuyên trong công việc.

Xem thêm: [Mật mã học] Mã Caesar

Ví dụ:

Bảng chữ cái thường:   ABCDEFGHIJKLMNOPQRSTUVWXYZ
Bảng chữ cái mật mã:   DEFGHIJKLMNOPQRSTUVWXYZABC

Với bảng chữ cái tiếng Việt:

Bảng chữ cái thường:   AĂÂBCDĐEÊGHIKLMNOÔƠPQRSTUƯVXY
Bảng chữ cái mật mã:   BCDĐEÊGHIKLMNOÔƠPQRSTUƯVXYAĂÂ

Khi mã hóa hay giải mã, người ta thay thế mỗi chữ cái với chữ cái cùng hàng trong bảng trên. Phép thế vẫn giữ nguyên cho toàn bộ văn bản.
Mật mã cũng có thể được thực hiện bằng số học modulo. Đầu tiên ta chuyển đổi các chữ cái sang số, A = 0, Ă = 1, Â = 2, B = 3,... Y = 28. Mã hóa ký tự x có thể được mô tả bằng công thức toán học dưới đây:
{\displaystyle E_{n}(x)=(x+n)\mod {29}.}
Và giải mã:
{\displaystyle D_{n}(x)=(x-n)\mod {29}.}
Tương tự với bảng chữ cái Latin, ta thay modulo của công thức bằng 26 sẽ có kết quả.

Bây giờ ta đi vào ví dụ cụ thể:
Đầu tiên ta có văn bản Help we are being attacked với khóa mã là 15 
Mã hóa:

Bảng chữ cái thường:   ABCDEFGHIJKLMNOPQRSTUVWXYZ
Bảng chữ cái mật mã:   PQRSTUVWXYZABCDEFGHIJKLMNO

Ta sẽ thay các chữ H=W, E=T, L=A,...

Văn bản ban đầu: Help we are being attacked
Văn bản mã hóa:  Wtae Lt Pgt Qtxcv Piiprzts
 
Giải mã:
Cũng theo bảng trên, ta thay các chữ W=H, T=E, L=A,...

Văn bản mã hóa:  Wtae Lt Pgt Qtxcv Piiprzts
Văn bản ban đầu: Help we are being attacked
 
 
Ngoài ra, còn có vài biến thể của mã này như thay thế chữ -  chữ, số - số, mã hóa nhiều lần để tăng độ khó, tuy nhiên với sức mạnh của máy móc thì đó không còn là vấn đề nữa. 
2. Thuật toán

Sử dụng công thức toán học bên trên, ta có thuật toán như sau:



const string sAlpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
void Caesar(string sEncrypt, int key){ int iMod = 0, i, j; for(i = 0; i < sEncrypt.length(); ++i){ sEncrypt[i] = toupper(sEncrypt[i]); if(sEncrypt[i] == 32) cout << " "; for(j = 0; j < sAlpha.length(); ++j) if(sEncrypt[i] == sAlpha[j]){ iMod = (j + key) % 26; if(iMod < 0) iMod = 26 + iMod; cout << sAlpha[iMod]; break; } } }
Lưu trữ một chuỗi lưu các kí tự chữ cái (hoặc sử dụng luôn bảng mã ASCII nếu không có các kí tự unicode), với chuỗi sEncrypt là chuỗi cần mã hóa (hoặc giải mã) , key là số chữ cái cần dịch chuyển, ta có thể mã hóa với mọi số nguyên. Thuật toán này không có gì phức tạp nên cũng không cần giải thích nhiều. Chỉ cần biết về modulo số học là bạn có thể tự giải quyết dễ dàng.

Code đầy đủ có thể xem tại đây, trong này bao gồm cả chương trình mã hóa với các trường hợp biến thể của Caesar: https://ideone.com/ntUgw0
Previous
Next Post »