当前位置:首页 > JavaScript

js实现elgamal

2026-04-05 20:58:01JavaScript

ElGamal 加密算法的 JavaScript 实现

ElGamal 是一种基于离散对数问题的非对称加密算法。以下是一个简单的 JavaScript 实现示例:

密钥生成

生成公钥和私钥:

js实现elgamal

function generateKeys(p, g) {
    const privateKey = BigInt(Math.floor(Math.random() * (p - 2)) + 1);
    const publicKey = modPow(g, privateKey, p);
    return { publicKey, privateKey };
}

加密过程

使用接收者的公钥加密消息:

js实现elgamal

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);

注意事项

  1. 实际应用中应使用更大的素数(至少2048位)
  2. 随机数生成应使用安全的随机数生成器
  3. 模逆运算的实现可以改用扩展欧几里得算法以提高效率
  4. 对于生产环境,建议使用成熟的加密库如WebCrypto API

标签: jselgamal
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

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

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…

js实现左右滑动

js实现左右滑动

实现左右滑动的 JavaScript 方法 监听触摸事件 通过 touchstart、touchmove 和 touchend 事件来检测用户的手势操作。记录触摸的起始位置和移动距离,判断滑动方向。…

js实现刷新

js实现刷新

刷新当前页面 使用 location.reload() 方法可以强制刷新当前页面。该方法接受一个布尔参数,默认为 false,表示从缓存中加载页面;设为 true 时强制从服务器重新加载。 // 从…