当前位置:首页 > JavaScript

js实现简单rsa

2026-03-16 06:31:01JavaScript

RSA 算法简介

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

密钥生成步骤

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

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

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

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类型用于处理大整数运算,但性能不如专业加密库。

js实现简单rsa

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

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

相关文章

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

vue 实现简单登陆

vue 实现简单登陆

Vue 实现简单登录功能 创建 Vue 项目 使用 Vue CLI 创建一个新项目: vue create login-demo 选择默认配置或手动配置(推荐包含 Vue Router 和 Vuex…

js实现倒计时

js实现倒计时

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

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…