首先,我們需要引入必要的庫,並定義一些輔助函數:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;
// 輔助函數: 快速模冪運算
long long power_mod(long long base, long long exp, long long mod) {
    long long result = 1;
    base %= mod;
    while (exp > 0) {
        if (exp & 1)
            result = (result * base) % mod;
        base = (base * base) % mod;
        exp >>= 1;
    }
    return result;
}
// 輔助函數: 生成一個範圍內的隨機數
long long random(long long min, long long max) {
    return min + rand() % (max - min + 1);
}
接下來,我們實現ElGamal加密系統的主要部分:
class ElGamal {
private:
    long long p; // 大質數
    long long g; // 生成元
    long long x; // 私鑰
    long long y; // 公鑰
public:
    ElGamal(long long p, long long g) : p(p), g(g) {
        srand(time(NULL));
        x = random(2, p-2);  // 隨機選擇私鑰
        y = power_mod(g, x, p);  // 計算公鑰
    }
    // 加密函數
    pair<long long, long long> encrypt(long long message) {
        long long k = random(2, p-2);  // 隨機數k
        long long c1 = power_mod(g, k, p);
        long long c2 = (message * power_mod(y, k, p)) % p;
        return make_pair(c1, c2);
    }
    // 解密函數
    long long decrypt(pair<long long, long long> ciphertext) {
        long long c1 = ciphertext.first;
        long long c2 = ciphertext.second;
        long long s = power_mod(c1, x, p);
        long long s_inv = power_mod(s, p-2, p);  // 使用費馬小定理計算模逆
        return (c2 * s_inv) % p;
    }
    // 獲取公鑰
    long long get_public_key() {
        return y;
    }
};
最後,我們可以寫一個簡單的主函數來測試我們的ElGamal實現:
int main() {
    // 選擇一個大質數p和生成元g
    long long p = 23;  // 在實際應用中,這應該是一個更大的質數
    long long g = 5;
    ElGamal elgamal(p, g);
    long long message = 20;  // 要加密的消息
    cout << "原始消息: " << message << endl;
    // 加密
    pair<long long, long long> ciphertext = elgamal.encrypt(message);
    cout << "加密後: (" << ciphertext.first << ", " << ciphertext.second << ")" << endl;
    // 解密
    long long decrypted = elgamal.decrypt(ciphertext);
    cout << "解密後: " << decrypted << endl;
    return 0;
}
ElGamal加密系統的基本元素:密鑰生成、加密和解密。但請注意,這只是一個簡化的版本,。在實際應用中,你需要考慮以下幾點:
使用更大的質數p(通常至少2048位)。
實現更安全的隨機數生成器。
添加錯誤處理和輸入驗證。
考慮使用更高效的大數運算庫,如GMP(GNU Multiple Precision Arithmetic Library)。
實現填充方案以增強安全性。