输入一串明文用欧拉公式在C++里实现RAS加密解密算法
时间: 2024-03-24 17:36:41 浏览: 74
下面是在C++里实现RAS加密解密算法的代码,可以输入一串明文并进行加密和解密:
```c++
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
// 快速幂算法
long long pow_mod(long long a, long long b, long long mod) {
long long res = 1;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
// 求最大公约数
long long gcd(long long a, long long b) {
if (b == 0) return a;
return gcd(b, a % b);
}
// 求扩展欧几里得算法
long long exgcd(long long a, long long b, long long &x, long long &y) {
if (b == 0) {
x = 1; y = 0;
return a;
}
long long d = exgcd(b, a % b, x, y);
long long z = x; x = y; y = z - a / b * y;
return d;
}
// RAS加密算法
long long ras_encrypt(long long m, long long e, long long n) {
return pow_mod(m, e, n);
}
// RAS解密算法
long long ras_decrypt(long long c, long long d, long long n) {
return pow_mod(c, d, n);
}
// 生成密钥
void generate_key(long long p, long long q, long long &n, long long &e, long long &d) {
n = p * q;
long long phi = (p - 1) * (q - 1);
do {
e = rand() % (phi - 2) + 2;
} while (gcd(e, phi) != 1);
exgcd(e, phi, d, n);
if (d < 0) d += phi;
}
int main() {
long long p = 61, q = 53; // 选择两个质数
long long n, e, d;
generate_key(p, q, n, e, d); // 生成公钥和私钥
cout << "公钥: (" << e << ", " << n << ")" << endl;
cout << "私钥: (" << d << ", " << n << ")" << endl;
string plaintext;
cout << "请输入明文: ";
getline(cin, plaintext); // 获取一行输入
cout << "明文: " << plaintext << endl;
// 将明文转换为整数
long long m = 0;
for (int i = 0; i < plaintext.size(); i++) {
m = m * 256 + plaintext[i];
}
cout << "整数: " << m << endl;
// 加密
long long c = ras_encrypt(m, e, n);
cout << "密文: " << c << endl;
// 解密
long long m2 = ras_decrypt(c, d, n);
// 将整数转换为明文
string plaintext2;
while (m2) {
plaintext2 += m2 % 256;
m2 /= 256;
}
reverse(plaintext2.begin(), plaintext2.end()); // 反转字符串
cout << "解密: " << plaintext2 << endl;
return 0;
}
```
在这个程序中,我们使用 `getline` 函数获取一行输入,然后将输入的明文转换为整数进行加密。加密后,我们再将密文解密为整数,最后再将整数转换为明文输出。
阅读全文