当前位置:首页 > JavaScript

js实现简单rsa

2026-03-16 06:31:01JavaScript

RSA 算法简介

RSA 是一种非对称加密算法,广泛应用于数据加密和数字签名。其核心基于大数分解的数学难题,涉及公钥和私钥的生成。

密钥生成步骤

生成两个大质数 p 和 q,计算 n = p q 和 φ(n) = (p-1)(q-1)

js实现简单rsa

选择一个整数 e 满足 1 < e < φ(n) 且与 φ(n) 互质

计算 d 使得 (d * e) % φ(n) = 1,即 d 是 e 的模反元素

js实现简单rsa

JavaScript 实现

// 简单RSA实现(仅用于教学演示,不适用于生产环境)
function modInverse(e, phi) {
    let m0 = phi, t, q;
    let x0 = 0, x1 = 1;

    if (phi === 1) return 0;

    while (e > 1) {
        q = Math.floor(e / phi);
        t = phi;
        phi = e % phi;
        e = t;
        t = x0;
        x0 = x1 - q * x0;
        x1 = t;
    }

    if (x1 < 0) x1 += m0;
    return x1;
}

function isPrime(num) {
    if (num <= 1) return false;
    if (num <= 3) return true;

    if (num % 2 === 0 || num % 3 === 0) return false;

    for (let i = 5; i * i <= num; i += 6) {
        if (num % i === 0 || num % (i + 2) === 0) return false;
    }

    return true;
}

function generateKeys(p, q) {
    if (!isPrime(p) || !isPrime(q)) {
        throw new Error('Both numbers must be prime.');
    }

    const n = p * q;
    const phi = (p - 1) * (q - 1);
    let e = 2;

    while (e < phi) {
        if (gcd(e, phi) === 1) break;
        e++;
    }

    const d = modInverse(e, phi);

    return {
        publicKey: { e, n },
        privateKey: { d, n }
    };
}

function gcd(a, b) {
    while (b !== 0) {
        let temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

function encrypt(message, publicKey) {
    const { e, n } = publicKey;
    return BigInt(message)  BigInt(e) % BigInt(n);
}

function decrypt(encrypted, privateKey) {
    const { d, n } = privateKey;
    return BigInt(encrypted)  BigInt(d) % BigInt(n);
}

使用示例

// 选择两个质数(实际应用中应使用更大的质数)
const p = 61;
const q = 53;

// 生成密钥对
const keys = generateKeys(p, q);

// 加密消息
const message = 65;
const encrypted = encrypt(message, keys.publicKey);

// 解密消息
const decrypted = decrypt(encrypted, keys.privateKey);

console.log('Original:', message);
console.log('Encrypted:', encrypted);
console.log('Decrypted:', decrypted);

注意事项

该实现仅为教学演示,使用了小质数以便理解。实际RSA应用需要2048位或更大的密钥。

JavaScript的BigInt类型用于处理大整数运算,但性能不如专业加密库。

生产环境应使用成熟的加密库如Web Crypto API或Node.js的crypto模块。

标签: 简单js
分享给朋友:

相关文章

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li><…

js实现滑动

js实现滑动

实现滑动效果的方法 在JavaScript中实现滑动效果可以通过多种方式完成,以下是几种常见的实现方法: 使用CSS过渡和JavaScript触发 通过CSS定义过渡效果,JavaScript控制触…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…