js实现简单rsa
RSA 算法基础概念
RSA 是一种非对称加密算法,基于大数分解的数学难题。核心步骤包括密钥生成、加密和解密。密钥分为公钥(用于加密)和私钥(用于解密)。
密钥生成步骤
-
选择两个大质数
选取质数p和q(实际应用中需为非常大的质数,此处仅为演示):const p = 61; const q = 53; -
计算模数
nn是 RSA 算法的模数,也是公钥和私钥的一部分:
const n = p * q; // 3233 -
计算欧拉函数
φ(n)φ(n)表示小于n且与n互质的数的个数:const phi = (p - 1) * (q - 1); // 3120 -
选择公钥指数
ee需满足1 < e < φ(n)且与φ(n)互质。通常选择 65537:
const e = 17; // 常见值 -
计算私钥指数
dd是e的模反元素,满足(d * e) % φ(n) === 1。使用扩展欧几里得算法计算:function modInverse(e, phi) { let [a, b] = [e, phi]; let [x0, x1] = [0, 1]; while (a > 1) { const q = Math.floor(a / b); [a, b] = [b, a % b]; [x0, x1] = [x1 - q * x0, x0]; } return x1 < 0 ? x1 + phi : x1; } const d = modInverse(e, phi); // 2753
加密与解密实现
-
加密函数
使用公钥(e, n)加密消息m(需满足m < n):function encrypt(m, e, n) { return BigInt(m) BigInt(e) % BigInt(n); } const ciphertext = encrypt(65, e, n); // 65 的密文为 2790 -
解密函数
使用私钥(d, n)解密密文c:function decrypt(c, d, n) { return BigInt(c) BigInt(d) % BigInt(n); } const plaintext = decrypt(2790, d, n); // 解密结果为 65
注意事项
- 大整数处理
JavaScript 的Number类型无法处理大数运算,需使用BigInt。 - 实际应用
真实场景需使用库(如node-rsa或crypto),避免手动实现安全漏洞。 - 填充方案
RSA 需结合 OAEP 等填充方案,防止明文攻击。
完整代码示例
// 密钥生成
const p = 61n, q = 53n;
const n = p * q; // 3233n
const phi = (p - 1n) * (q - 1n); // 3120n
const e = 17n;
const d = modInverse(e, phi); // 2753n
// 加密解密
const m = 65n;
const c = encrypt(m, e, n); // 2790n
const decrypted = decrypt(c, d, n); // 65n
以上代码演示了 RSA 的核心流程,实际应用需结合安全库和更复杂的实现。






