C语言源代码rsa使用平方乘法对输入的数字型消息进行加解密
时间: 2023-07-11 20:06:29 浏览: 105
以下是使用平方乘法实现RSA加解密的C语言源代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
// 求a^b mod n的值(平方乘法)
int power_mod(int a, int b, int n) {
int res = 1;
while (b) {
if (b & 1)
res = (res * a) % n;
a = (a * a) % n;
b >>= 1;
}
return res;
}
// 判断一个数是否为质数
int is_prime(int n) {
if (n <= 1)
return 0;
int sqr = sqrt(n);
for (int i = 2; i <= sqr; i++) {
if (n % i == 0)
return 0;
}
return 1;
}
// 求最大公约数
int gcd(int a, int b) {
if (b == 0)
return a;
return gcd(b, a % b);
}
// 扩展欧几里得算法,用于求解模逆元
int exgcd(int a, int b, int *x, int *y) {
if (b == 0) {
*x = 1;
*y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
*y -= (a / b) * (*x);
return d;
}
// 生成公钥和私钥
void gen_key(int p, int q, int *n, int *e, int *d) {
*n = p * q;
int fn = (p - 1) * (q - 1);
for (int i = 2; i < fn; i++) {
if (gcd(i, fn) == 1) {
*e = i;
break;
}
}
exgcd(*e, fn, d, NULL);
*d = (*d % fn + fn) % fn;
}
// RSA加密
int rsa_encrypt(int m, int e, int n) {
return power_mod(m, e, n);
}
// RSA解密
int rsa_decrypt(int c, int d, int n) {
return power_mod(c, d, n);
}
int main() {
int p = 61, q = 53, n, e, d;
char message[100];
printf("请输入要加密的消息:");
scanf("%s", message);
gen_key(p, q, &n, &e, &d);
printf("生成的公钥为:(%d, %d),私钥为:%d\n", n, e, d);
int len = strlen(message);
int *cipher = malloc(sizeof(int) * len);
int *decipher = malloc(sizeof(int) * len);
printf("加密后的密文为:");
for (int i = 0; i < len; i++) {
cipher[i] = rsa_encrypt(message[i], e, n);
printf("%d ", cipher[i]);
}
printf("\n解密后的明文为:");
for (int i = 0; i < len; i++) {
decipher[i] = rsa_decrypt(cipher[i], d, n);
printf("%c", decipher[i]);
}
printf("\n");
free(cipher);
free(decipher);
return 0;
}
```
在这个例子中,我们使用61和53这两个质数作为RSA算法的参数,并且通过扩展欧几里得算法求解了模逆元。输入要加密的消息后,程序会生成公钥和私钥,然后对消息进行加密和解密操作,并输出结果。
阅读全文