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

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

Affine Cipher là mật mã thay thế đơn bảng (monoalphabetic substitution) dựa trên hàm toán học tuyến tính modulo. Mỗi chữ cái được ánh xạ sang số (A=0, B=1, ..., Z=25), biến đổi, rồi ánh xạ ngược lại.

Toán học

  • Alphabet size m = 26 (A-Z).
  • Khóa: cặp số (a, b) với điều kiện gcd(a, m) = 1 (a nguyên tố cùng nhau với m) để đảm bảo tồn tại nghịch đảo modulo.
  • Mã hóa: E(x) = (a*x + b) mod m
  • Giải mã: D(y) = a⁻¹ * (y - b) mod m, với a⁻¹ là nghịch đảo modulo của a (thỏa a * a⁻¹ ≡ 1 (mod m)).

Tìm nghịch đảo modulo

Với m = 26, có thể duyệt i = 0..25 tìm i sao cho (a * i) % 26 == 1. Hoặc dùng thuật toán Euclid mở rộng cho m lớn.

Chương trình hoàn chỉnh

#include <bits/stdc++.h>
using namespace std;

const int ALPHABET = 26;
int a = 7, b = 6; // Khóa: a=7 (gcd(7,26)=1), b=6

// Tìm nghịch đảo modulo của a
int modInverse(int a, int m) {
    a = a % m;
    for (int x = 1; x < m; ++x)
        if ((a * x) % m == 1) return x;
    return -1; // Không tồn tại
}

string encrypt(const string& plaintext) {
    string cipher;
    for (char ch : plaintext) {
        if (ch >= 'A' && ch <= 'Z') {
            int x = ch - 'A';
            int c = (a * x + b) % ALPHABET;
            cipher += char('A' + c);
        } else if (ch >= 'a' && ch <= 'z') {
            int x = ch - 'a';
            int c = (a * x + b) % ALPHABET;
            cipher += char('a' + c);
        } else {
            cipher += ch; // Giữ nguyên ký tự không phải chữ cái
        }
    }
    return cipher;
}

string decrypt(const string& ciphertext) {
    string plain;
    int a_inv = modInverse(a, ALPHABET);
    if (a_inv == -1) return "ERROR: Invalid key 'a'";
    
    for (char ch : ciphertext) {
        if (ch >= 'A' && ch <= 'Z') {
            int y = ch - 'A';
            int x = (a_inv * (y - b + ALPHABET)) % ALPHABET;
            plain += char('A' + x);
        } else if (ch >= 'a' && ch <= 'z') {
            int y = ch - 'a';
            int x = (a_inv * (y - b + ALPHABET)) % ALPHABET;
            plain += char('a' + x);
        } else {
            plain += ch;
        }
    }
    return plain;
}

int main() {
    string msg = "TUTORIALSPOINT";
    cout << "Ban ro:   " << msg << '\n';
    
    string cipher = encrypt(msg);
    cout << "Ban ma:   " << cipher << '\n';
    
    string decrypted = decrypt(cipher);
    cout << "Giai ma:  " << decrypted << '\n';
    
    return 0;
}

Kết quả

Ban ro:   TUTORIALSPOINT
Ban ma:   JQJAVKGFCHAKTJ
Giai ma:  TUTORIALSPOINT

Phân tích bảo mật

  • Không gian khóa: φ(26) * 26 = 12 * 26 = 312 khóa hợp lệ (rất nhỏ).
  • Dễ bị tấn công phân tích tần suất (frequency analysis) vì là monoalphabetic.
  • Chỉ dùng cho mục đích giáo dục / giải trí.

Lưu ý triển khai

  • Luôn kiểm tra gcd(a, 26) == 1 trước khi dùng khóa.
  • Xử lý riêng chữ hoa/chữ thường để bảo toàn case.
  • Giữ nguyên khoảng trắng, dấu câu, số (không mã hóa).
  • C++: Dùng (y - b + ALPHABET) % ALPHABET để tránh modulo âm.

Affine Cipher là bước đệm tốt để hiểu các khái niệm: arithmetic modulo, nghịch đảo modulo, và cấu trúc mật mã đối xứng cơ bản trước khi học AES, RSA.