ElGamal加密解密算法C++源代码
时间: 2023-07-09 21:21:20 浏览: 110
elgamal的C++加密算法代码.zip
以下是ElGamal加密解密算法的C++源代码实现:
```c++
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
// 生成大素数
bool is_prime(long long n) {
if (n == 2 || n == 3) return true;
if (n == 1 || n % 2 == 0) return false;
for (long long i = 3; i <= sqrt(n); i += 2) {
if (n % i == 0) return false;
}
return true;
}
long long get_prime(int bits) {
long long p;
do {
p = rand() % (1 << bits) + (1 << bits);
} while (!is_prime(p));
return p;
}
// 计算模重复平方
long long mod_pow(long long a, long long b, long long m) {
long long res = 1;
while (b) {
if (b & 1) res = (res * a) % m;
a = (a * a) % m;
b >>= 1;
}
return res;
}
// 选择生成元
long long get_generator(long long p) {
long long phi = p - 1;
long long g;
do {
g = rand() % (p - 2) + 2;
} while (mod_pow(g, phi / 2, p) == 1 || mod_pow(g, phi / 3, p) == 1 || mod_pow(g, phi / 5, p) == 1);
return g;
}
// 选择私钥
long long get_private_key(long long p) {
return rand() % (p - 2) + 1;
}
// 计算公钥
long long get_public_key(long long g, long long x, long long p) {
return mod_pow(g, x, p);
}
// 加密
void encrypt(long long msg, long long y, long long g, long long p, long long& a, long long& b) {
long long k = rand() % (p - 2) + 1;
a = mod_pow(g, k, p);
b = (msg * mod_pow(y, k, p)) % p;
}
// 解密
long long decrypt(long long a, long long b, long long x, long long p) {
long long msg = (b * mod_pow(a, p - 1 - x, p)) % p;
return msg;
}
int main() {
srand(time(NULL));
// 生成大素数
long long p = get_prime(1024);
// 选择生成元
long long g = get_generator(p);
// 选择私钥
long long x = get_private_key(p);
// 计算公钥
long long y = get_public_key(g, x, p);
// 加密
long long msg = 123456789;
long long a, b;
encrypt(msg, y, g, p, a, b);
// 解密
long long res = decrypt(a, b, x, p);
cout << "明文:" << msg << endl;
cout << "密文:(" << a << ", " << b << ")" << endl;
cout << "解密后的明文:" << res << endl;
return 0;
}
```
其中,`is_prime()`函数用于判断一个数是否为素数,`get_prime()`函数用于生成指定位数的大素数,`mod_pow()`函数用于计算模重复平方,`get_generator()`函数用于选择一个生成元,`get_private_key()`函数用于生成私钥,`get_public_key()`函数用于计算公钥,`encrypt()`函数用于加密,`decrypt()`函数用于解密。
需要注意的是,在实际应用中,需要对加密密钥进行保护,避免被攻击者获取。同时,需要对数据进行填充和认证,防止被篡改和重放攻击。
阅读全文