用C语言写一个基于模运算的加解密算法
时间: 2024-02-25 12:58:36 浏览: 12
以下是一个基于模运算的加解密算法的C语言实现代码:
```c
#include <stdio.h>
// 求a和b的最大公约数
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
// 求a在模m下的乘法逆元
int mod_inverse(int a, int m) {
int b = m, x = 0, y = 1, lastx = 1, lasty = 0;
while (b != 0) {
int quotient = a / b;
int tmp = a;
a = b;
b = tmp % b;
tmp = x;
x = lastx - quotient * x;
lastx = tmp;
tmp = y;
y = lasty - quotient * y;
lasty = tmp;
}
if (lasty < 0) {
lasty += m;
}
return lasty;
}
// 加密函数
void encrypt(char *plaintext, char *ciphertext, int a, int b) {
int len = strlen(plaintext);
for (int i = 0; i < len; i++) {
if (plaintext[i] >= 'a' && plaintext[i] <= 'z') {
int ai = plaintext[i] - 'a';
int ci = (ai * a + b) % 26;
ciphertext[i] = ci + 'a';
} else if (plaintext[i] >= 'A' && plaintext[i] <= 'Z') {
int ai = plaintext[i] - 'A';
int ci = (ai * a + b) % 26;
ciphertext[i] = ci + 'A';
} else {
ciphertext[i] = plaintext[i];
}
}
ciphertext[len] = '\0';
}
// 解密函数
void decrypt(char *ciphertext, char *plaintext, int a, int b) {
int len = strlen(ciphertext);
int a_inv = mod_inverse(a, 26);
for (int i = 0; i < len; i++) {
if (ciphertext[i] >= 'a' && ciphertext[i] <= 'z') {
int ci = ciphertext[i] - 'a';
int ai = (ci - b + 26) * a_inv % 26;
plaintext[i] = ai + 'a';
} else if (ciphertext[i] >= 'A' && ciphertext[i] <= 'Z') {
int ci = ciphertext[i] - 'A';
int ai = (ci - b + 26) * a_inv % 26;
plaintext[i] = ai + 'A';
} else {
plaintext[i] = ciphertext[i];
}
}
plaintext[len] = '\0';
}
int main() {
int a = 3;
int b = 5;
char plaintext[] = "Hello, world!";
char ciphertext[100];
char decrypted[100];
// 加密
encrypt(plaintext, ciphertext, a, b);
printf("Plaintext: %s\n", plaintext);
printf("Ciphertext: %s\n", ciphertext);
// 解密
decrypt(ciphertext, decrypted, a, b);
printf("Decrypted: %s\n", decrypted);
return 0;
}
```
这个实现中,我们使用了求最大公约数和求乘法逆元的函数,然后分别实现了加密和解密函数。加密函数将明文转换为数字序列,逐数字加密并映射为字母序列,得到密文;解密函数将密文转换为数字序列,逐数字解密并映射为字母序列,得到明文。在这个例子中,我们使用了a=3和b=5这样的固定参数,实际使用中可以根据需要动态生成这些参数。