RSA 加密算法的数学原理

IT知识
327
0
0
2022-04-24

AES 加密是一种对称加密算法,密钥必须传递给对方才能解密,如何保证密钥安全成为一个重要问题。1977 年,三位数学家 Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密,也就是本文要讨论的 RSA 算法。使用非对称加密算法需要生成公钥和私钥,使用公钥加密,使用私钥解密。

RSA 加密算法的数学原理

互质关系

首先回顾一下质数的定义。质数 (prime number) 又称素数,有无限个。一个大于 1 的自然数,除了 1 和它本身外,不能被其他自然数整除,换句话说就是该数除了 1 和它本身以外不再有其他的因数;否则称为合数。

如果两个正整数,除了 1 以外,没有其他公因子,我们就称这两个数是互质关系。互质关系不要求两个数都是质数,合数也可以和一个质数构成互质关系。

欧拉函数

对正整数 n,欧拉函数是小于 n 的正整数中与 n 互质的数的数目,用 φ(n) 表示。例如 φ(8) = 4,因为 1 3 5 7 均和 8 互质。欧拉函数可以表示为

RSA 加密算法的数学原理

其中 p1, p2 …… pn 为 x 的所有质因数,x 是不为 0 的整数。且 φ(1) = 1。每种质因数只用一个。比如 12 = 2 * 2 * 3 那么

φ(12) = 12 * ( 1 - 1 / 2) * ( 1 - 1 / 3 ) = 4

若 n 是质数 p 的 k 次幂,除了 p 的倍数外,其他数都跟 n 互质,则


若 m,n 互质,则


当 n 为奇数时,则


当 n 为质数时,则


模反元素

如果两个正整数 a 和 n 互质,那么一定可以找到整数 b,使得 ab - 1 被 n 整除,或者说 ab 被 n 除的余数是 1。这时,b 就叫做 a 的 “模反元素”。表示如下:

ab ≡ 1 (mod n)

比如,3 和 11 互质,那么 3 的模反元素就是 4,因为 (3 × 4) - 1 可以被 11 整除。显然,模反元素不止一个,4 加减 11 的整数倍都是 3 的模反元素 {…, -18, -7, 4, 15, 26, …},即如果 b 是 a 的模反元素,则 b + k n 都是 a 的模反元素。

欧拉定理

欧拉定理是一个关于同余的性质。欧拉定理表明,若 n,a 为正整数,且 n,a 互质,则有

a^φ(n) ≡ 1 (mod n)

证明过程较复杂,此处略过。

假设正整数 a 与质数 p 互质,因为 φ(p) = p-1,则欧拉定理可以写成

a^(p-1) ≡ 1 (mod p)

RSA 公钥与私钥的生成

生成密钥的过程如下:

  1. 首先选择两个质数 p 和 q,并且越大越好。
  2. 计算出 n = pq ,n 的二进制位数即为密钥的位数。
  3. 计算出 n 的欧拉函数
  4. φ(n) = φ(p)φ(q) = (p-1) (q-1)
  5. 随机选择一个整数 e,条件是 1 < e < φ(n),且 e 与 φ(n) 互质
  6. 计算 e 对于 φ(n) 的模反元素 d
  7. ed ≡ 1 (mod φ(n))
  8. 上面的公式等价于如下的一元二次方程,d 和 k 有无穷多种组合方式,选取一个 d 值即可
  9. ed + k φ(n) = 1
  10. 将 n 和 e 封装成公钥,n 和 d 封装成私钥

RSA 加密与解密

使用公钥 (n,e) 进行加密的过程,可以表示为如下公式,实际上就是根据明文 m

计算出密文 c 的过程。m 必须是整数(字符串可以取 ascii 值或 unicode 值),且 m 必须小于 n。

m^e ≡ c (mod n)

使用私钥 (n,d) 进行解密的过程,可以表示为如下公式,实际上就是根据密文 c 计算出明文 m 的过程。此处证明比较复杂,感兴趣的朋友可以自己看一下。

c^d ≡ m (mod n)

RSA 加解密过程示例

首先生成密钥:

  1. 取 p = 61, q = 53
  2. 计算出 n = 61 * 53 = 3233
  3. 计算出 n 的欧拉函数 φ(3233) = 60 * 52 = 3120
  4. 随机选择一个整数 e = 17
  5. 计算 e 对于 φ(n) 的模反元素 d = 2753

使用公钥进行加密,假设明文 m = 65,表示大写字母 A,根据公式计算出密文为 2790。

65^17 ≡ 2790 (mod 3233)

使用私钥进行解密,密文为 2790,根据公式可以计算出明文为 65,表示大写字母 A。

2790^2753 ≡ 65 (mod 3233)

分享学习笔记和技术总结,内容涉及 Java 进阶、架构设计、前沿技术、算法与数据结构、数据库、中间件等多个领域,欢迎关注。本文首发于微信公众号“后端开发那点事儿”。