#include <iostream>
#include <cmath>
#include <iomanip>
#define T long long
using namespace std;
T gcd(T a, T b) {
if (!a) return b;
return gcd(b % a, a);
}
auto lcm = [](T a, T b)->T { return (a / gcd(a, b) * b); };
/* ----- RSA Cryptosystem ----- */
class RSA {
private:
T
m_p, m_q, // p、q 为质数
m_N, // N 为明文最长长度
m_L, // L 为 p-1、q-1 的最小公倍数
m_D; // D 为解密 Decryption 的乘积次方
void eKey(); // 赋值 E
void dKey(); // 赋值 D
pair<T, T>decryptionKey; // 解密密钥 (D, N)
public:
T
m_E, // E 为加密 Encryption 的乘积次方
C(T), // 函数:加密
C(T, pair<T, T>), // 函数:加密
M(T), // 函数:解密
M(T, pair<T, T>); // 函数:解密
pair<T, T>encryptionKey; // 加密密钥 (E, N)
RSA(); // 构造函数
RSA(T, T); // 构造函数
};
void RSA::eKey() {
for (T E = 2; E < m_L; E++)
if (gcd(E, m_L) == 1) {
m_E = E;
break;
}
}
void RSA::dKey() {
for (T D = 2; D < m_L; D++)
if ((m_E * D) % m_L == 1) {
m_D = D;
}
}
RSA::RSA() : m_p(17), m_q(19) { // 默认 p、q 值
m_N = m_p * m_q;
m_L = lcm(m_p - 1, m_q - 1);
eKey();
dKey();
encryptionKey = make_pair(m_E, m_N); // 加密密钥 (E, N)
decryptionKey = make_pair(m_D, m_N); // 解密密钥 (D, N)
}
RSA::RSA(T x, T y) : m_p(x), m_q(y) {
m_N = m_p * m_q;
m_L = lcm(m_p - 1, m_q - 1);
eKey();
dKey();
encryptionKey = make_pair(m_E, m_N); // 加密密钥 (E, N)
decryptionKey = make_pair(m_D, m_N); // 解密密钥 (D, N)
}
// M = C^D mod N (M 为明文)
// C = M^E mod N (C 为密文)
T RSA::C(T m) {
T
E = m_E,
N = m_N,
res = 1;
while (E--) {
res *= m;
res %= N;
}
return res;
}
T RSA::M(T c) {
T
D = m_D,
N = m_N,
res = 1;
while (D--) {
res *= c;
res %= N;
}
return res;
}
/* ----- 假如有密钥 ----- */
T RSA::C(T m, pair<T, T>Key) {
T
E = Key.first,
N = Key.second,
res = 1;
while (E--) {
res *= m;
res %= N;
}
return res;
}
/* ----- 假如有密钥 ----- */
T RSA::M(T c, pair<T, T>Key) {
T
D = Key.first,
N = Key.second,
res = 1;
while (D--) {
res *= c;
res %= N;
}
return res;
}
int main() {
// 例子:RSA 加密算法
RSA Cryptosystem(127, 1373); // p = 127、q = 1373,初始 p、q 值 (条件:两者都是质数)
T A = 162530; // 明文:长度不可超于 p*q(N)
T B = 65; // 密文
// 对明文加密 Encryption
T X = Cryptosystem.C(A);
// 打印...
cout
<< "明文:"
<< setfill(' ') << setw(6)
<< A
<< " -> 密文:"
<< setfill(' ') << setw(6)
<< X
<< endl;
// 对密文解密 Decryption
T Y = Cryptosystem.M(B);
// 打印...
cout
<< "密文:"
<< setfill(' ') << setw(6)
<< B
<< " -> 明文:"
<< setfill(' ') << setw(6)
<< Y
<< endl;
// 加密密钥 (E, N)
T a = Cryptosystem.encryptionKey.first;
T b = Cryptosystem.encryptionKey.second;
cout
<< "加密密钥:("
<< a
<< ", "
<< b
<< ")"
<< endl;
return 0;
}