用c语言程序写(1) 编程实现模n的大数幂乘的快速算法,随机输入3个较大的数x, e, n,输出计算x的e次方 mod n (2) 编程实现模n求逆的算法,计算私钥。 (3) 编写RSA解密程序,完成文件data.txt中内容的解密,以字符形式输出明文。已知系统公开参数为n=18923, e=1261。并且给出实验过程和实验心得
时间: 2023-12-10 20:38:07 浏览: 174
密码学 模n的大数幂乘的快速算法
4星 · 用户满意度95%
(1)模n的大数幂乘的快速算法的实现:
```c
#include <stdio.h>
// 模n的大数幂乘的快速算法
long long fastPowMod(long long x, long long e, long long n) {
long long res = 1;
while (e > 0) {
if (e & 1) {
res = (res * x) % n;
}
x = (x * x) % n;
e >>= 1;
}
return res;
}
int main() {
long long x, e, n;
printf("请输入x, e, n:");
scanf("%lld%lld%lld", &x, &e, &n);
printf("x的e次方mod n = %lld\n", fastPowMod(x, e, n));
return 0;
}
```
(2)模n求逆的算法的实现:
```c
#include <stdio.h>
// 扩展欧几里得算法
void extendedEuclid(long long a, long long b, long long *x, long long *y) {
if (b == 0) {
*x = 1;
*y = 0;
return;
}
long long x1, y1;
extendedEuclid(b, a % b, &x1, &y1);
*x = y1;
*y = x1 - (a / b) * y1;
}
// 求模n的逆元
long long modInverse(long long a, long long n) {
long long x, y;
extendedEuclid(a, n, &x, &y);
return (x % n + n) % n;
}
int main() {
long long a, n;
printf("请输入a和n:");
scanf("%lld%lld", &a, &n);
long long aInverse = modInverse(a, n);
printf("a关于模n的逆元为:%lld\n", aInverse);
return 0;
}
```
(3)RSA解密程序的实现:
```c
#include <stdio.h>
// 模n的大数幂乘的快速算法
long long fastPowMod(long long x, long long e, long long n) {
long long res = 1;
while (e > 0) {
if (e & 1) {
res = (res * x) % n;
}
x = (x * x) % n;
e >>= 1;
}
return res;
}
int main() {
FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
printf("文件打开失败\n");
return -1;
}
char c;
long long cipher = 0;
while ((c = fgetc(fp)) != EOF) {
cipher = cipher * 10 + (c - '0');
}
fclose(fp);
long long n = 18923, e = 1261;
long long d = 0; // 私钥
for (int i = 1; i < n; i++) {
if ((e * i) % (n - 1) == 1) {
d = i;
break;
}
}
long long plain = fastPowMod(cipher, d, n); // 解密
printf("解密后的明文为:%lld\n", plain);
return 0;
}
```
实验心得:在本次实验中,我通过编写 C 语言程序实现了模 n 的大数幂乘的快速算法、模 n 求逆的算法和 RSA 解密程序。通过这些实验,我更深入地了解了 RSA 加密算法的原理和实现方法,也锻炼了我的编程能力。
阅读全文