种一棵树最好的时间是十年前,其次是现在。

公开密钥算法-RSA的原理

在1970年代,个人电脑出现之前,计算机通常是大型、昂贵、专业化的设备,只有少数具有专业知识和资源的机构才能够使用和维护。比如大型企业和机构,比如科研学术机构、政府和军事机构、科技公司和工业企业、金融和医疗机构等。这些机构通常拥有专门的计算机部门或者信息技术团队,负责管理和维护计算机系统,才能满足各自的业务需求。

对称密码非常适合在封闭的组织和机构中使用,因为同属一个组织或机构,用户之间存在信任关系,而且可以通过内部流程和策略来管理对称密码的密钥。后来个人计算机出现了,计算机的使用从封闭的环境向社会和个人,需要跨部门、跨行业、跨地域远距离交换信息,对称密码开始暴露出这些问题:

  • 密钥管理困难: 在共享密钥的情况下,如果密钥泄露,所有使用该密钥加密的消息都将被暴露。这可能导致严重的后果,例如财务损失、身份盗窃等。
  • 密钥认证问题: 很难验证共享密钥的真实来源,这使得攻击者可以伪装成合法用户窃取密钥。
  • 抵赖问题: 由于无法验证消息来源,一方可以否认发送过某条消息,另一方无法证明其真实性。

举个例子,假设小明和小红是好朋友,他们想要通过互联网进行私密交流。他们决定使用对称密码来加密他们的消息,并约定了一个共享密钥,然后通过安全渠道交换了共享密钥,比如通过见面或可信的第三方。

现在,他们两人可以开始愉快地使用共享密钥加密和解密消息了。可是一段时间后,小红发现了一些奇怪的事情:她的银行账户被盗了,个人信息被泄露了。她怀疑是小明泄露了共享密钥,导致这些信息被窃取。小红质问小明,小明矢口否认。由于对称密码系统无法提供消息来源的验证,即使小明确实泄露了密钥,小红也无法证明这一点,因为小红自己也持有相同的密钥。

公开密钥密码

在1970年代中期,出现了公开密钥密码(Public-key cryptography),非对称密码使用一对公钥和私钥。公钥可以公开分享,私钥必须保密。数据可以用公钥加密,只能用对应的私钥解密。公开密钥密码也称为非对称密码(asymmetric cryptography)。

在上面的例子中,如果小明和小红使用非对称密码,他们相互拥有对方的公钥,小红可以使用小明的公钥加密消息,只有小明可以使用他自己的私钥解密消息。即使小红泄露了她自己的私钥,攻击者也无法使用它来解密小明发送的消息。

非对称密码可以解决对称密码存在的一些问题:

  • 简化密钥管理: 每个用户只需要管理自己的私钥,无需共享密钥,降低了密钥泄露的风险。
  • 提供密钥认证: 公钥可以用于数字签名,验证消息来源的真实性(这一点我们会在后续的文章详细说明)。
  • 防止抵赖: 数字签名可以防止一方抵赖发送过某条消息。

1974年,Ralph Charles Merkle 提出了公开密钥加密思想。到了1976年,在麻省理工学院工作的 Ron Rivest、Adi Shamir 和 Leonard Adleman 一起发表了 RSA 算法,RSA 名字来自于他们姓氏首字母。

[!NOTE] 注意

其实早在1973年,在英国政府通讯总部工作的数学家 Clifford Cocks 就已提出与之等效的算法,由于是在内部文件中提出的,一直被英国政府列为机密,直到1997年才得以公开。

RSA 数学原理

RSA 加密和解密过程都很直观,它是个简单的数学计算过程。

先用下面公式加密 X,得出的结果 Y 便是密文:$$X^E \bmod N = Y$$ 根据费马小定理,按照下面公式计算解密,便可得出明文 X: $$ Y^D \bmod N = X$$ 这里的关键确保解密过程能恢复原文。加密和解密过程用到了三个值:NED,其中 (E, N) 是公钥, (D, N) 是私钥,N 是公钥和私钥的共同部分,把公钥和私钥联系起来的是费马小定理欧拉定理,它们确定了私钥的 D 是公钥的 E 的唯一解,只有知道私钥才能解密成正确的明文。

费马小定理

费马小定理是一个关于质数和整数之间关系的数学定理。它的内容是:

如果 p 是一个质数,并且 a 是一个整数(但不是 p 的倍数),那么 ap−1 次方减去 1 一定可以被 p 整除:$(a^{p-1} - 1) \bmod p \equiv 0$,写成更常用的格式:$a^{p-1}\equiv 1\pmod{p}$。

假设我们有一个质数 p=7,并且 a=3(3 不是 7 的倍数),那么根据费马小定理: $(3^{7-1} - 1) \mod 7 = 0$。

欧拉函数

如果 an 互质,那么 $a^{\varphi(n)} \equiv 1\pmod{n}$,跟费马小定理是不是很像?因为欧拉函数扩展自费马小定理,这里的 $\varphi(n)$ 是欧拉函数,表示小于等于 n 且与 n 互质的正整数的个数。

原理

先准备两个很大的质数 pq

计算模数 N:$N = p \times q$,N 是公钥和私钥的一部分。

计算欧拉函数 $\varphi(n)$:$\varphi(n) = (p-1) \times (q-1)$。

选择公钥指数 E:选择一个与欧拉函数$\varphi(n)$互质的整数,比如 3、5、7、11...... 通常选一个小的。

计算私钥指数 D:私钥指数 D 是公钥指数 E 的模 $\varphi(n)$ 的乘法逆元:$D \times E \equiv 1\pmod{\varphi(n)}$,这里确保了 DE 加密的唯一解。

证明解密的正确性

根据私钥 D 和公钥 E 的定义:$D \cdot E \equiv 1\pmod{\varphi(n)}$,也就是说,存在整数 K 满足: $$D \cdot E = 1 + K \cdot \varphi(N)$$ 要证明:$X = Y^D \bmod N$ 其实等同于证明 $X^{E\cdot D} \equiv X \pmod N$。根据整数 K ,则有: $$X^{E \cdot D} = X^{1+K\cdot \varphi(N)} = X \cdot (X^{\varphi(N)})^K$$ 根据欧拉定理,对于与 N 互质的任意整数 X,有:$X^{\varphi(n)} \equiv 1\pmod{N}$,因此: $$X^{E \cdot D} = X \cdot 1^K = X$$ 指数 ED 就这样消去了,这就表明解密过程能够正确地恢复原始消息 X

[!NOTE] 注意

计算机只认识二进制,底层存储的所有数据也是二进制的。对文本加密的时候,其实操作的是字符对应的 Unicode 编码或其它编码的。解密的时候,也是操作一长串二进制数字,如果密钥不正确,解密计算也会得出一长串二进制数字,只不过这串二进制没有对应有效的字符,结果是没有意义的,如果用文本编辑器打开后看起来像一堆乱码

针对RSA的攻击

RSA 算法的安全性建立在数学原理上,因为分解大质数很困难。RSA 生成的密钥选用的 pq 通常都在1024位以上,那合数 N 的长度就有2048位以上,以目前的计算能力,想要通过穷举的方式分解 N 的两个质因子 pq 是极其困难的。私钥中的 D 依赖公钥 E 和模数 N 的关系,这种关系是建立在数论中复杂的数学运算之上,想要从公钥计算出私钥也是极其困难的。

假如有人能够找到一种分解大整数因子的有效算法的话,RSA 就会变得不安全;或者量子计算机有朝一日实用了,在远超当前算力的情况下,RSA 也会变得不安全。但是在这些到来之前,只要密钥足够长,RSA 算法仍然是安全的。

版权声明: 本文为原创内容,未经许可,不得转载。