RSA算法原理回顾
在开始迁移之前,咱得先把RSA的老底摸清楚。很多同学找我做咨询时,对RSA的理解停留在「会用openssl命令」的层面。这事儿其实挺危险的——你要是连原理都不清楚,迁移SM2的时候很容易踩坑。
我个人的习惯是,不管学什么算法,先抓住三件事:密钥怎么来的、数据怎么变的、安全性靠什么。RSA的核心绕不开大整数分解,这是它的命根子。
一句话总结:RSA的安全基石就是「两个大素数相乘很容易,但反过来分解很难」。你想想看,如果你能快速分解一个2048位的合数,RSA就当场失效。
密钥生成机制
RSA的密钥生成看着步骤多,其实逻辑很清晰。我画了个流程图,咱们对着看:
步骤拆开来看:
- 选两个大素数:p 和 q,通常都上百位十进制数。我见过新人用 openssl 默认参数,结果 p 和 q 太接近,导致 n 很容易被费马分解法干掉。嗯,这里要注意,p 和 q 的差值一定要大。
- 算 n:n = p × q。RSA 的加密解密都在模 n 下进行。
- 算欧拉函数 φ(n):φ(n) = (p−1)(q−1)。这个值只掌握在私钥持有者手里,外部攻击者不知道 p 和 q,就算不出 φ(n)。
- 选公钥指数 e:e 必须满足 1 < e < φ(n) 且 gcd(e, φ(n)) = 1。最常用的 e 是 65537,二进制里头只有两个 1,模幂运算时效率高。
- 算私钥指数 d:d ≡ e⁻¹ mod φ(n)。说白了就是找一个数,让 e×d 除以 φ(n) 余 1。
我踩过的坑:有一次生产环境升级,有人图方便直接 n 复用只换了 e 和 d。结果私钥泄露后,攻击者用同一个 n 和旧 e 就能算出 φ(n),然后反推新 d。所以记住:n 必须和私钥一起更换。
加密解密流程
RSA 的加解密本质就是模幂运算。加密时用公钥,解密时用私钥。公式很简单:
- 加密:c = m^e mod n(m 是明文块,c 是密文块)
- 解密:m = c^d mod n
这里有个关键点——RSA 不能直接加密任意长度的消息。为什么呢?因为 m 必须小于 n。所以实际应用中一定要做分块加密或使用混合加密方案。
我最早做 PKI 方案时,测试阶段直接用了 RSA 加密 4KB 文件,结果程序爆了个「Data too large」异常。后来学乖了,果断上 AES 会话密钥+RSA 加密会话密钥的混合方案。
签名验签原理
签名和加密刚好反过来:用私钥签名,公钥验证。这跟现实中的印章逻辑一样——个人私章只有自己能用,但任何人都可以拿着你的公开印鉴去比对。
流程如下:
- 签名:s = hash(m)^d mod n。先对消息算哈希,再用私钥加密哈希值。
- 验签:计算 hash(m'),再用公钥解密签名得到 hash',对比两者是否相等。
重要提醒:签名不是直接对消息加密!一定要先哈希。我见过有人偷懒直接签原文,结果攻击者利用 RSA 的乘法同态性质伪造签名。具体来说就是,如果 s1 = m1^d mod n,s2 = m2^d mod n,那么 s1×s2 就是 m1×m2 的有效签名。这种事在真实生产环境出过事故,千万小心。
数学基础:大整数分解难题
说了这么多,RSA 到底凭什么安全?说白了就是 大整数分解 是一个公认的 NP 问题。给你两个 512 位素数相乘容易,给你 1024 位数让你分解回去,目前最好的算法(如 GNFS)也需要天文级别的时间。
我来列个对照表,让你直观感受下密钥长度和安全性的关系:
| RSA密钥长度(位) | 安全等级(对标对称加密) | 当前状态 | 我的建议 |
|---|---|---|---|
| 1024 | 相当于 80 位对称密钥 | 已被破解(512位因子分解已实现) | 别用了,马上迁移 |
| 2048 | 相当于 112 位对称密钥 | 短期安全(2030年前) | 可作为过渡,但建议上 SM2 |
| 3072 | 相当于 128 位对称密钥 | 长期安全 | 性能可接受可保留 |
| 4096 | 相当于 192 位对称密钥 | 过度安全 | 性能开销大,不推荐 |
看到这个表你应该能理解,为什么国密局推荐用 SM2 替代 RSA。SM2 基于椭圆曲线,256 位密钥就能达到 128 位安全等级,而 RSA 需要 3072 位才能对标。同样的安全强度,SM2 的密钥长度只有 RSA 的十分之一不到。
核心观点:RSA 的密钥越长,加解密和签名的性能衰减越厉害。特别是签名场景,2048 位 RSA 签名一次大约 1-2 毫秒,而 SM2 签名只需要 0.1 毫秒左右。你想想看,如果每秒签名 1000 次,差距就出来了。
说实话,RSA 再撑几年也不是不能用。但如果你要对接政务、金融、关基系统,国密合规是硬指标。提前搞懂 RSA 的原理,等你学完本书后面章节的 SM2 原理时,就会发现很多思想是相通的——都是公钥密码、都是陷门函数、都需要安全参数和填充方案。