输出一个C语言编程的ElGamal算法
时间: 2023-04-01 13:04:03 浏览: 124
ElGama 算法C代码
4星 · 用户满意度95%
ElGamal算法是一种非对称加密算法,它包括密钥生成、加密和解密三个部分。以下是C语言编程的ElGamal算法示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define MAX 100
int gcd(int a, int b) {
if (b == ) {
return a;
} else {
return gcd(b, a % b);
}
}
int power(int a, int b, int p) {
int res = 1;
a = a % p;
while (b > ) {
if (b & 1) {
res = (res * a) % p;
}
b = b >> 1;
a = (a * a) % p;
}
return res;
}
int main() {
int p, g, x, y, k, a, b, i;
int prime[MAX], isPrime[MAX];
int cnt = , flag = ;
// 生成素数表
for (i = 2; i < MAX; i++) {
isPrime[i] = 1;
}
for (i = 2; i < MAX; i++) {
if (isPrime[i]) {
prime[cnt++] = i;
for (int j = i + i; j < MAX; j += i) {
isPrime[j] = ;
}
}
}
// 随机选择一个素数p
srand((unsigned)time(NULL));
while (!flag) {
p = prime[rand() % cnt];
for (i = 2; i <= sqrt(p - 1); i++) {
if ((p - 1) % i == ) {
flag = ;
break;
}
}
if (i > sqrt(p - 1)) {
flag = 1;
}
}
// 随机选择一个原根g
flag = ;
while (!flag) {
g = rand() % (p - 1) + 1;
for (i = 2; i <= p - 2; i++) {
if (power(g, i, p) == 1) {
flag = ;
break;
}
}
if (i > p - 2) {
flag = 1;
}
}
// 随机选择一个私钥x
x = rand() % (p - 2) + 1;
// 计算公钥y
y = power(g, x, p);
printf("p = %d, g = %d, x = %d, y = %d\n", p, g, x, y);
// 随机选择一个加密密钥k
k = rand() % (p - 2) + 1;
// 加密明文a
printf("请输入要加密的明文a:");
scanf("%d", &a);
b = (power(g, k, p) * a) % p;
printf("加密后的密文为:(%d, %d)\n", power(g, k, p), b);
// 解密密文b
a = (b * power(power(g, x, p), p - 2 - k, p)) % p;
printf("解密后的明文为:%d\n", a);
return ;
}
```
阅读全文