C语言源码RSA对任意长度的消息进行消息的分割及加密,并完成相关的解密
时间: 2024-01-21 15:16:34 浏览: 116
以下是基于C语言的RSA加密和解密代码,支持分块加密任意长度的消息:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MAX_LEN 1024
long int p, q, n, phi, e, d;
char message[MAX_LEN];
int message_blocks[MAX_LEN], encrypted_blocks[MAX_LEN], decrypted_blocks[MAX_LEN];
int gcd(long int a, long int b) {
if (a == 0) return b;
if (b == 0) return a;
return gcd(b, a % b);
}
int is_prime(long int num) {
int i;
for (i = 2; i <= sqrt(num); i++) {
if (num % i == 0) return 0;
}
return 1;
}
void generate_key_pair() {
do {
p = rand() % 100;
} while (!is_prime(p));
do {
q = rand() % 100;
} while (!is_prime(q));
n = p * q;
phi = (p - 1) * (q - 1);
do {
e = rand() % (phi - 2) + 2;
} while (gcd(e, phi) != 1);
int k = 0;
while (1) {
k++;
d = (1 + k * phi) / e;
if ((1 + k * phi) % e == 0) break;
}
}
void print_key_pair() {
printf("Public key: (%ld, %ld)\n", e, n);
printf("Private key: (%ld, %ld)\n", d, n);
}
void encrypt() {
int i, len = strlen(message);
for (i = 0; i < len; i++) {
message_blocks[i] = message[i];
encrypted_blocks[i] = fmod(pow(message_blocks[i], e), n);
}
}
void decrypt() {
int i, len = strlen(message);
for (i = 0; i < len; i++) {
decrypted_blocks[i] = fmod(pow(encrypted_blocks[i], d), n);
message[i] = decrypted_blocks[i];
}
}
int main() {
printf("Please enter the message to be encrypted: ");
fgets(message, MAX_LEN, stdin);
generate_key_pair();
print_key_pair();
encrypt();
printf("Encrypted message: ");
int i, len = strlen(message);
for (i = 0; i < len; i++) {
printf("%d ", encrypted_blocks[i]);
}
printf("\n");
decrypt();
printf("Decrypted message: %s\n", message);
return 0;
}
```
这个代码使用随机生成的两个质数 p 和 q,计算出 n 和 phi,然后随机选择一个数字 e,计算出 d,从而生成公钥和私钥。接着,将消息分成块,每个块使用 RSA 算法进行加密,得到密文。最后,使用私钥进行解密,得到原始消息。
需要注意的是,RSA 加密只能对比 RSA 模数 n 小的整数进行加密,因此需要将消息分成块,并将每个块转换为整数进行加密。在本代码中,每个字符对应一个 ASCII 码,将 ASCII 码作为块进行加密。在解密时,需要将每个块解密,再将所有块拼接起来得到原始消息。
阅读全文