RSA算法原理回顾

在开始迁移之前,咱得先把RSA的老底摸清楚。很多同学找我做咨询时,对RSA的理解停留在「会用openssl命令」的层面。这事儿其实挺危险的——你要是连原理都不清楚,迁移SM2的时候很容易踩坑。

我个人的习惯是,不管学什么算法,先抓住三件事:密钥怎么来的、数据怎么变的、安全性靠什么。RSA的核心绕不开大整数分解,这是它的命根子。

一句话总结:RSA的安全基石就是「两个大素数相乘很容易,但反过来分解很难」。你想想看,如果你能快速分解一个2048位的合数,RSA就当场失效。

密钥生成机制

RSA的密钥生成看着步骤多,其实逻辑很清晰。我画了个流程图,咱们对着看:

RSA 密钥生成与加解密流程 1. 选择大素数 p, q 2. 计算 n = p × q 3. φ(n) = (p−1)(q−1) 4. 选公钥 e 5. 计算私钥 d 加密:c = m^e mod n 解密:m = c^d mod n 公钥 (n, e) 私钥 (n, d) 核心公式对照 密钥对:p, q → n, φ(n) → e (公钥), d (私钥) 加解密:c = m^e mod n, m = c^d mod n 签名/验签:s = m^d mod n, m' = s^e mod n

步骤拆开来看:

  1. 选两个大素数:p 和 q,通常都上百位十进制数。我见过新人用 openssl 默认参数,结果 p 和 q 太接近,导致 n 很容易被费马分解法干掉。嗯,这里要注意,p 和 q 的差值一定要大。
  2. 算 n:n = p × q。RSA 的加密解密都在模 n 下进行。
  3. 算欧拉函数 φ(n):φ(n) = (p−1)(q−1)。这个值只掌握在私钥持有者手里,外部攻击者不知道 p 和 q,就算不出 φ(n)。
  4. 选公钥指数 e:e 必须满足 1 < e < φ(n) 且 gcd(e, φ(n)) = 1。最常用的 e 是 65537,二进制里头只有两个 1,模幂运算时效率高。
  5. 算私钥指数 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 原理时,就会发现很多思想是相通的——都是公钥密码、都是陷门函数、都需要安全参数和填充方案。