1. 非对称加密与RSA的独特价值现代密码学中加密算法主要分为对称加密和非对称加密两大类。对称加密就像用同一把钥匙锁门和开门加解密使用相同的密钥比如常见的AES算法。虽然速度快但密钥分发是个难题——如果双方能安全传递密钥那直接传递信息不就好了这就是著名的密钥分发困境。非对称加密的巧妙之处在于使用数学上关联的公私钥对公钥可以公开发布就像电话号码簿里的联系方式私钥必须严格保密相当于保险箱的专属钥匙用公钥加密的数据只能用对应私钥解密反之亦然RSA算法正是基于这一原理其安全性建立在大数分解的数学难题上将两个大质数的乘积分解回原质数在现有计算能力下几乎不可能完成。举个例子分解一个300位的合数需要约15万年而RSA-2048使用的数字有617位。2. RSA的数学之美从原理到实现2.1 密钥生成的核心步骤生成RSA密钥本质上是寻找满足特定条件的整数随机选择两个大质数p和q通常使用Miller-Rabin算法检测计算模数n p × q计算欧拉函数φ(n) (p-1)(q-1)选择公钥指数e通常为65537计算私钥d ≡ e⁻¹ mod φ(n)// 示例简单质数检测 function isPrime(num) { for(let i 2; i Math.sqrt(num); i) if(num % i 0) return false; return num 1; }2.2 加密解密过程解析加密过程可以表示为数学运算加密c ≡ mᵉ mod n m是明文c是密文解密m ≡ cᵈ mod n实际操作中我们会对数据进行填充如OAEP以防止攻击。举个数字例子设p61, q53, 则n3233选择e17, 计算d2753加密数字123123¹⁷ mod 3233 855解密855²⁷⁵³ mod 3233 1233. 前端JavaScript完整实现3.1 使用jsencrypt库实战现代前端通常使用现成的库处理RSA下面是典型实现流程script srchttps://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.3.2/jsencrypt.min.js/script script // 初始化加密对象 const encryptor new JSEncrypt(); encryptor.setPublicKey( -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1... -----END PUBLIC KEY----- ); // 加密敏感数据 const secretData 信用卡号 1234 5678; const encrypted encryptor.encrypt(secretData); console.log(加密结果:, encrypted); // 解密通常在后端进行 const decryptor new JSEncrypt(); decryptor.setPrivateKey(privateKey); const original decryptor.decrypt(encrypted); /script3.2 手动实现核心算法理解底层原理很重要以下是简化版的实现// 大整数幂模运算核心算法 function modPow(b, e, m) { let result 1n; b BigInt(b) % BigInt(m); while (e 0n) { if (e % 2n 1n) result (result * b) % BigInt(m); e e 1n; b (b * b) % BigInt(m); } return Number(result); } // 生成密钥对简化版 function generateKeys(p, q) { const n p * q; const phi (p-1)*(q-1); let e 65537; // 常见公钥指数 const d modInverse(e, phi); return { publicKey: { e, n }, privateKey: { d, n } }; } // 示例使用 const { publicKey, privateKey } generateKeys(61, 53); const encrypted modPow(123, publicKey.e, publicKey.n); const decrypted modPow(encrypted, privateKey.d, privateKey.n);4. 安全实践与常见陷阱4.1 必须遵守的安全准则密钥管理前端永远不要存储私钥使用HTTPS传输公钥定期更换密钥对数据规范加密前进行PKCS#1 v1.5或OAEP填充限制加密数据长度小于模数长度-11字节性能优化// Web Worker中进行高强度运算 const cryptoWorker new Worker(crypto-worker.js); cryptoWorker.postMessage({ type: encrypt, data: payload });4.2 真实项目中的经验教训在一次电商项目审计中我们发现开发者犯的典型错误直接加密JSON字符串导致长度超标解决方案分段加密或改用对称加密非对称加密密钥// 错误示范 encryptor.encrypt(JSON.stringify(bigObject)); // 可能失败 // 正确做法 const aesKey generateAESKey(); const encryptedData aesEncrypt(data, aesKey); const encryptedKey encryptor.encrypt(aesKey);5. 进阶应用场景5.1 数字签名实现RSA不仅可以加密还能用于验证数据完整性// 签名 function sign(message, privateKey) { const hash sha256(message); return modPow(hash, privateKey.d, privateKey.n); } // 验证 function verify(message, signature, publicKey) { const hash sha256(message); const decryptedSig modPow(signature, publicKey.e, publicKey.n); return hash decryptedSig; }5.2 与HTTPS的配合现代Web应用中RSA通常这样发挥作用客户端生成临时对称密钥如AES用服务器RSA公钥加密该密钥服务器用私钥解密获取对称密钥后续通信使用对称加密这种混合加密方案既保证了安全性又兼顾了性能。在实现支付功能时我们实测RSA-2048加密耗时约15ms而AES-256仅需0.3ms。