Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Cài đặt Caesar Cipher (Mật mã Caesar) trong C++

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/islower từ <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.