当前位置:首页 > 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;
}

辅助函数

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

js实现elgamal

// 模幂计算 (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 模块)。

标签: jselgamal
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

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

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 c…