当前位置:首页 > JavaScript

js实现elgamal

2026-04-05 20:58:01JavaScript

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

辅助函数

实现模幂运算和模逆运算:

js实现elgamal

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 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现防洪

js实现防洪

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