答:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 计算最大公约数
long gcd(long a, long b) {
if (b == 0) return a;
return gcd(b, a % b);
}
// 快速幂取模
long fast_pow(long base, long exponent, long mod) {
long result = 1;
base = base % mod;
while (exponent > 0) {
if (exponent % 2 == 1)
result = (result * base) % mod;
exponent = exponent >> 1;
base = (base * base) % mod;
}
return result;
}
// 模逆运算
long mod_inverse(long a, long m) {
long m0 = m, t, q;
long x0 = 0, x1 = 1;
if (m == 1)
return 0;
while (a > 1) {
// q 是商
q = a / m;
t = m;
// m 是余数
m = a % m, a = t;
t = x0;
x0 = x1 - q * x0;
x1 = t;
}
return x1 + m0;
}
void generate_keys(long *e, long *d, long *n, long *p, long *q) {
long phi;
srand((unsigned int)time(NULL));
*p = rand() % 10000 + 101; // 随机选择两个小的质数
*q = rand() % 10000 + 101;
while (*p % 2 == 0 || *q % 2 == 2) { // 选择奇数质数
*p = rand() % 10000 + 101;
*q = rand() % 10000 + 101;
}
while (gcd(*p - 1, *q - 1) != 1) { // 保证p和q互质
*p = rand() % 10000 + 101;
*q = rand() % 10000 + 101;
}
*n = (*p) * (*q); // n是p和q的乘积
phi = (*p - 1) * (*q - 1); // phi是欧拉函数
*e = 3; // 选择一个大于1的整数e
while (*e < phi) {
if (gcd(*e, phi) == 1) // 确保e和phi互质
break;
else
(*e)++;
}
*d = mod_inverse(*e, phi); // 计算e的模逆得到d
}
// 加密
long encrypt(long plaintext, long e, long n) {
return fast_pow(plaintext, e, n);
}
// 解密
long decrypt(long ciphertext, long d, long n) {
return fast_pow(ciphertext, d, n);
}
int main() {
long e, d, n, p, q;
generate_keys(&e, &d, &n, &p, &q);
printf("Public Key (e, n): (%ld, %ld)\n", e, n);
printf("Private Key (d, n): (%ld, %ld)\n", d, n);
long plaintext = 42; // 明文
long ciphertext = encrypt(plaintext, e, n);
printf("Ciphertext: %ld\n", ciphertext);
long decrypted = decrypt(ciphertext, d, n);
printf("Decrypted: %ld\n", decrypted);
return 0;
}