RSA (Rivest-Shamir-Adleman, 1977) là thuật toán mật mã khóa công khai (asymmetric) phổ biến nhất. Dựa trên độ khó của bài toán phân tích thừa số nguyên lớn.
Quy trình toán học
- Chọn 2 số nguyên tố lớn
p, q. - Tính
n = p * q(modulus). - Tính
φ(n) = (p-1)(q-1)(Euler's totient). - Chọn
e(public exponent):1 < e < φ(n)vàgcd(e, φ(n)) = 1. Thường dùnge = 65537. - Tính
d(private exponent):d ≡ e⁻¹ (mod φ(n))— nghịch đảo modulo. - Khóa công khai:
(n, e). Khóa riêng:(n, d). - Mã hóa:
c = m^e mod n. - Giải mã:
m = c^d mod n.
Chương trình minh họa (số nhỏ, dùng double - CHỈ DẠY)
#include <iostream>
#include <cmath>
using namespace std;
// GCD đệ quy
long long gcd(long long a, long long b) {
return b == 0 ? a : gcd(b, a % b);
}
// Lũy thừa modulo nhanh (binary exponentiation)
long long modPow(long long base, long long exp, long long mod) {
long long res = 1;
base %= mod;
while (exp > 0) {
if (exp & 1) res = (res * base) % mod;
base = (base * base) % mod;
exp >>= 1;
}
return res;
}
// Nghịch đảo modulo bằng Extended Euclid
long long modInverse(long long a, long long m) {
long long m0 = m, x0 = 0, x1 = 1;
if (m == 1) return 0;
while (a > 1) {
long long q = a / m;
long long t = m;
m = a % m; a = t;
t = x0;
x0 = x1 - q * x0;
x1 = t;
}
if (x1 < 0) x1 += m0;
return x1;
}
int main() {
// ⚠️ CHỈ DÙNG SỐ NHỎ DEMO — THỰC TẾ p,q 1024-2048 BIT
long long p = 61, q = 53; // Số nguyên tố
long long n = p * q; // 3233
long long phi = (p-1) * (q-1); // 3120
long long e = 17; // Public exponent (gcd(17,3120)=1)
long long d = modInverse(e, phi); // Private exponent = 2753
cout << "p = " << p << ", q = " << q << '\n';
cout << "n = " << n << ", phi = " << phi << '\n';
cout << "Public key: (n=" << n << ", e=" << e << ")\n";
cout << "Private key: (n=" << n << ", d=" << d << ")\n";
long long message = 123; // Bản rõ (số nguyên < n)
cout << "\nBan ro (m): " << message << '\n';
long long cipher = modPow(message, e, n);
cout << "Ban ma (c = m^e mod n): " << cipher << '\n';
long long decrypted = modPow(cipher, d, n);
cout << "Giai ma (m = c^d mod n): " << decrypted << '\n';
// Ký số (Digital Signature)
long long signature = modPow(message, d, n);
cout << "\nChu ky so (sign = m^d mod n): " << signature << '\n';
long long verified = modPow(signature, e, n);
cout << "Xac thuc (verify = sign^e mod n): " << verified
<< (verified == message ? " [HOP LE]" : " [SAI]") << '\n';
return 0;
}
Kết quả
p = 61, q = 53 n = 3233, phi = 3120 Public key: (n=3233, e=17) Private key: (n=3233, d=2753) Ban ro (m): 123 Ban ma (c = m^e mod n): 855 Giai ma (m = c^d mod n): 123 Chu ky so (sign = m^d mod n): 123 Xac thuc (verify = sign^e mod n): 123 [HOP LE]
⚠️ Cảnh báo quan trọng
- Code trên chỉ để minh họa toán học — dùng
long longvà số nhỏ. - RSA thực tế yêu cầu:
- Số nguyên tố
p, q1024-2048 bit (khoảng 300-600 chữ số thập phân). - Thư viện bignum: OpenSSL (BIGNUM), GMP, Botan, Crypto++.
- Padding: OAEP (mã hóa), PSS (ký số) — không bao giờ dùng raw RSA (textbook RSA không an toàn).
- Bảo vệ side-channel (timing attack, power analysis).
- Số nguyên tố
- Không tự triển khai crypto cho production — dùng thư viện đã được kiểm chứng (OpenSSL, libsodium, NaCl).
Ứng dụng thực tế
- TLS/HTTPS (trao đổi khóa, chứng chỉ số).
- Chữ ký số (PGP, S/MIME, blockchain).
- Mã hóa email, file, VPN.
RSA là nền tảng của PKI (Public Key Infrastructure) và an ninh mạng hiện đại. Hiểu toán học cốt lõi giúp sử dụng đúng và an toàn các thư viện crypto.