Caesar Cipher (Shift Cipher) là mật mã thay thế đơn bảng đơn giản nhất: mỗi chữ cái được dịch chuyển một số vị trí cố định trong bảng chữ cái.
Nguyên lý
- Khóa: số nguyên
k(0 ≤ k ≤ 25) — độ dịch chuyển. - Mã hóa:
C = (P + k) mod 26 - Giải mã:
P = (C - k + 26) mod 26 - Chỉ áp dụng cho chữ cái (A-Z, a-z), giữ nguyên case, bỏ qua ký tự khác.
Ví dụ: k = 3
Plain: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Cipher: D E F G H I J K L M N O P Q R S T U V W X Y Z A B C "tutorial" → "wxwruldo"
Chương trình hoàn chỉnh (Menu chọn mã/giải)
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
string caesarEncrypt(const string& text, int key) {
string result;
key = key % 26; // Chuẩn hóa khóa
if (key < 0) key += 26;
for (char ch : text) {
if (isupper(ch)) {
result += char('A' + (ch - 'A' + key) % 26);
} else if (islower(ch)) {
result += char('a' + (ch - 'a' + key) % 26);
} else {
result += ch; // Giữ nguyên space, punctuation, số
}
}
return result;
}
string caesarDecrypt(const string& text, int key) {
// Giải mã = mã hóa với khóa (26 - key)
return caesarEncrypt(text, (26 - key) % 26);
}
int main() {
string message;
int key, choice;
cout << "Nhap ban tin: ";
getline(cin, message);
cout << "Nhap khoa (0-25): ";
cin >> key;
cout << "1. Ma hoa\n2. Giai ma\nChon: ";
cin >> choice;
if (choice == 1) {
cout << "Ban ma: " << caesarEncrypt(message, key) << '\n';
} else if (choice == 2) {
cout << "Ban ro: " << caesarDecrypt(message, key) << '\n';
} else {
cout << "Lua chon khong hop le!\n";
}
return 0;
}
Kết quả chạy
--- Ma hoa --- Nhap ban tin: tutorial Nhap khoa (0-25): 3 1. Ma hoa 2. Giai ma Chon: 1 Ban ma: wxwruldo --- Giai ma --- Nhap ban tin: wxwruldo Nhap khoa (0-25): 3 1. Ma hoa 2. Giai ma Chon: 2 Ban ro: tutorial
Phân tích bảo mật
- Không gian khóa: 26 — cực nhỏ.
- Dễ bị tấn công brute-force (thử hết 26 khóa).
- Dễ bị phân tích tần suất (frequency analysis) — cấu trúc ngôn ngữ không thay đổi.
- Chỉ dùng cho: giáo dục, puzzle, ROT13 (k=13, tự giải mã).
Biến thể: ROT13
Caesar với k = 13. Vì 13 + 13 = 26 ≡ 0, mã hóa và giải mã dùng cùng một hàm. Thường dùng che spoiler trên forum/email.
Mở rộng: Generalized Caesar (Affine)
Caesar là trường hợp đặc biệt của Affine với a = 1. Affine: E(x) = (a*x + b) mod 26 cho phép "xáo trộn" tốt hơn nhưng vẫn yếu.
Lưu ý triển khai
- Dùng
isupper/islowertừ<cctype>để phân loại. - Modulo âm trong C++:
(x - k + 26) % 26đảm bảo kết quả không âm. - Khóa có thể lớn hơn 26 → dùng
key % 26. - Bảo toàn case và non-alpha là thói quen tốt.
Caesar Cipher là "Hello World" của mật mã học — đơn giản, lịch sử, và nền tảng để hiểu các khái niệm: substitution, khóa, modulo arithmetic, tấn công brute-force/frequency.