当前位置:首页 > JavaScript

js实现elgamal

2026-02-01 04:33:31JavaScript

ElGamal 加密算法实现(JavaScript)

ElGamal 是一种基于离散对数问题的非对称加密算法。以下是一个简单的 JavaScript 实现,包含密钥生成、加密和解密功能。

密钥生成

需要生成一个大素数 p、生成元 g 和私钥 x,公钥为 (p, g, y),其中 y = g^x mod p

function generateKeys() {
  // 选择一个安全的大素数 p 和生成元 g(这里简化处理,实际需用安全素数)
  const p = 23n; // 示例素数(实际应用需更大)
  const g = 5n;  // 生成元
  const x = 6n;  // 私钥(随机选择,1 < x < p-1)

  // 计算公钥 y = g^x mod p
  const y = modExp(g, x, p);

  return {
    publicKey: { p, g, y },
    privateKey: { p, x }
  };
}

加密函数

加密时需要接收方的公钥 (p, g, y) 和明文消息 m

function encrypt(publicKey, m) {
  const { p, g, y } = publicKey;
  const k = 3n; // 临时密钥(随机选择,1 < k < p-1)

  // 计算 c1 = g^k mod p
  const c1 = modExp(g, k, p);
  // 计算 c2 = m * y^k mod p
  const c2 = (m * modExp(y, k, p)) % p;

  return { c1, c2 };
}

解密函数

解密时使用私钥 x 和密文 (c1, c2)

function decrypt(privateKey, ciphertext) {
  const { p, x } = privateKey;
  const { c1, c2 } = ciphertext;

  // 计算 s = c1^x mod p
  const s = modExp(c1, x, p);
  // 计算 s^{-1} mod p(模逆元)
  const sInv = modInv(s, p);
  // 恢复明文 m = c2 * s^{-1} mod p
  const m = (c2 * sInv) % p;

  return m;
}

辅助函数

实现模幂运算和模逆元计算。

// 模幂计算 (base^exp mod mod)
function modExp(base, exp, mod) {
  let result = 1n;
  base = base % mod;
  while (exp > 0n) {
    if (exp % 2n === 1n) {
      result = (result * base) % mod;
    }
    exp = exp >> 1n;
    base = (base * base) % mod;
  }
  return result;
}

// 扩展欧几里得算法求模逆元
function modInv(a, m) {
  let [old_r, r] = [a, m];
  let [old_s, s] = [1n, 0n];

  while (r !== 0n) {
    const quotient = old_r / r;
    [old_r, r] = [r, old_r - quotient * r];
    [old_s, s] = [s, old_s - quotient * s];
  }

  if (old_r !== 1n) throw new Error('Inverse does not exist');
  return (old_s + m) % m; // 保证结果为正
}

示例用法

// 生成密钥对
const { publicKey, privateKey } = generateKeys();

// 加密消息(明文需小于 p)
const message = 12n;
const ciphertext = encrypt(publicKey, message);

// 解密密文
const decrypted = decrypt(privateKey, ciphertext);

console.log('Original:', message);
console.log('Decrypted:', decrypted); // 应输出 12n

注意事项

  • 示例中的素数 p 和密钥大小过小,实际应用需使用安全的大素数(如 2048 位)。
  • 临时密钥 k 应每次加密时随机生成,不可重复使用。
  • 明文 m 需满足 0 < m < p,否则需通过分组处理。
  • 实际项目中建议使用成熟的密码学库(如 node-forgecrypto 模块)。

js实现elgamal

标签: jselgamal
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前…