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ệngcd(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ớia⁻¹là nghịch đảo modulo củaa(thỏaa * 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 = 312khó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) == 1trướ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.