js实现elgamal
ElGamal 加密算法的 JavaScript 实现
ElGamal 是一种基于离散对数问题的非对称加密算法。以下是一个简单的 JavaScript 实现示例:
密钥生成
生成公钥和私钥:
function generateKeys(p, g) {
const privateKey = BigInt(Math.floor(Math.random() * (p - 2)) + 1);
const publicKey = modPow(g, privateKey, p);
return { publicKey, privateKey };
}
加密过程
使用接收者的公钥加密消息:
function encrypt(message, p, g, publicKey) {
const k = BigInt(Math.floor(Math.random() * (p - 2)) + 1);
const c1 = modPow(g, k, p);
const c2 = (BigInt(message) * modPow(publicKey, k, p)) % BigInt(p);
return { c1, c2 };
}
解密过程
使用接收者的私钥解密消息:
function decrypt(c1, c2, p, privateKey) {
const s = modPow(c1, privateKey, p);
const sInverse = modInverse(s, p);
const decrypted = (c2 * sInverse) % BigInt(p);
return decrypted;
}
辅助函数
实现模幂运算和模逆运算:

function modPow(base, exponent, modulus) {
if (modulus === 1n) return 0n;
let result = 1n;
base = base % modulus;
while (exponent > 0n) {
if (exponent % 2n === 1n) {
result = (result * base) % modulus;
}
exponent = exponent >> 1n;
base = (base * base) % modulus;
}
return result;
}
function modInverse(a, m) {
a = ((a % m) + m) % m;
for (let x = 1n; x < m; x++) {
if ((a * x) % m === 1n) {
return x;
}
}
return 1n;
}
使用示例
// 选择一个大素数 p 和它的原根 g
const p = 23n;
const g = 5n;
// 生成密钥对
const { publicKey, privateKey } = generateKeys(p, g);
// 加密消息
const message = 12n;
const { c1, c2 } = encrypt(message, p, g, publicKey);
// 解密密文
const decrypted = decrypt(c1, c2, p, privateKey);
console.log('Original:', message);
console.log('Encrypted:', { c1, c2 });
console.log('Decrypted:', decrypted);
注意事项
- 实际应用中应使用更大的素数(至少2048位)
- 随机数生成应使用安全的随机数生成器
- 模逆运算的实现可以改用扩展欧几里得算法以提高效率
- 对于生产环境,建议使用成熟的加密库如WebCrypto API






