公钥密码
密钥配送问题:在对称密码中,由于加密和解密的密钥是相同的,因此必须事先向接收者配送密钥。
如果使用公钥密码,则无需向接收者配送用于解密的密钥,这就相当于解决了密钥配送问题。
对称密码通过将明文转换为复杂的形式来保证机密性,公钥密码则是基于数学难题来保证机密性。 例如RSA利用了大整数的质因数分解问题的困难度。
即使已经有了公钥密码,对称密码也不会消失。
公钥密码的运行速度远远低于对称密码,因此一般通信过程中,往往会配合使用这两种密码,即用对称密码提高处理速度,用公钥密码解决密钥配送问题。这样的方式称为混合密码系统。
密钥配送问题
密钥配送问题指的是如何安全地将密钥发送给接收者,用以解密密文。
解决密钥配送问题的方法有以下几种:
事先共享密钥
事先用安全的方式将密钥交给对方,称为密钥的事先共享。(比如当面共享,邮寄等)
密钥分配中心
当需要进行加密通信时,密钥分配中心会生成一个通信密钥,每个人只需要和密钥分配中心事先共享密钥。
通信流程:
- 密钥分配中心将通信密钥使用通信双方各自的密钥进行加密,并分别发送给通信双方。
- 通信双方各自使用自己的密钥解密获得通信密钥。
- 通信双方使用通信密钥进行通信。
缺点:
- 通信方数量很大时,密钥分配中心负荷会剧增。
- 密钥分配中心出现故障,则所有通信中断。
Diffie-Hellman密钥交换
在Diffie-Hellman密钥交换中,进行加密通信的双方需要交换一些信息,而这些信息即便被窃听到也没有问题。
根据所交换的信息,双方可以各自生成相同的密钥,而窃听者却无法生成相同的密钥。
公钥密码
在公钥密码中,加密密钥和解密密钥是不同的。
只要拥有加密密钥,任何人都可以进行加密,但没有解密密钥是无法解密的。因此,公钥密码的一个重要性质是只有拥有解密密钥的人才能够进行解密。
通信流程如下:
- 接收者事先将加密密钥发送给发送者,该加密密钥即使被窃听也没有关系。
- 发送者使用加密密钥对通信内容进行进行加密并发送给接收者。
- 接收者使用解密密钥进行解密。
因此对称密码的密钥配送问题可以使用公钥密码来解决。
公钥密码
公钥密码中,密钥分为加密密钥和解密密钥两种。
发送者使用加密密钥对消息进行加密,接收者用解密密钥对密文进行解密。
特点
- 发送者只需要加密密钥。
- 接收者只需要解密密钥。
- 解密密钥不可以被窃取。
- 加密密钥被窃取也没关系。
公钥密码中,加密密钥一般是公开的,因此该密钥被称为公钥。解密密钥是绝对不能公开的,这个密钥只能接收者来使用,称为私钥。
公钥和私钥是一一对应的,一对公钥和私钥统称为密钥对(key pair)。公钥加密的密文,只有配对的私钥才能够解密。
公钥密码的使用者需要生成一个包括公钥和私钥的密钥对,其中公钥发送给别人,私钥仅供自己使用。
历史
时间 | 作者 | 说明 |
---|---|---|
1976年 | Whitfield Diffie和Martin Hellman | 公钥密码的设计思想,提出应该将加密密钥和解密密钥分开,并且描述了公钥密码应具备的性质 |
1977年 | Ralph Merkle和Martin Hellman | 公钥密码算法:Knapsack |
1978年 | Ron Rivest、Adi Shamir和Reonard Adleman | RSA,现在公钥密码的事实标准 |
通信流程
在公钥密码通信中,通信过程是由接收者来启动的。
问题
问题 | 说明 |
---|---|
公钥认证 | 公钥密码解决了密钥配送问题,但这并不意味着它能够解决所有的问题,因为需要判断所得到的公钥是否正确合法 |
处理速度 | 公钥密码的另一个问题就是其处理速度只有对称密码的几百份之一。 |
数学基础
mod运算
除法求余数的运算即mod,和乘除同级。
模逆元:对于正整数$a$ 和 $m$ ,如果有 $a * x = 1 (\mod m)$,那么把这个同余方程中的 $x$ 的最小整数解称为 $a$ 模 $m$ 的逆元。
RSA
RSA是一种公钥加密算法,它的名字取自其三位开发者,即Ron Rivest、Adi Shamir和Leonard Adleman的姓氏的首字母。
RSA可以被用于公钥密码和数字签名。
RSA加密
在RSA中,明文、密钥和密文都是数字。
加密公式如下:
$$ 密文 = 明文^{E}\mod N$$ 即RSA的密文是对代表明文的数字的 $E$ 次方求 $\mod N$ 的结果,或者是将明文和自己做 $E$ 次乘法,然后用其结果对 $N$ 取余,这个余数就是密文。
因此加密公式中出现的两个数 $E$ 和 $N$ 的组合就是公钥。
RSA解密
解密公式如下:
$$ 明文 = 密文 ^{D} \mod N $$ 即对表示密文的数字的 $D$ 次方求 $\mod N$ 就可以得到明文。
这里所使用的数字 $N$ 和加密时使用的是相同的。 数 $D$ 和数 $N$ 组合起来就是RSA的解密密钥。只有知道 $D$ 和 $N$ 两个数的人才能够完成解密的运算。
术语 | 说明 |
---|---|
公钥 | 数 $E$ 和数 $N$ |
私钥 | 数 $D$ 和数 $N$ |
加密 | $密文 = 明文^{E} \mod N$ |
解密 | $明文=密文^{D} \mod N$ |
生成密钥对
由于 $E$ 和 $N$ 是公钥, $D$ 和 $N$ 是私钥,因此求 $E$、$D$ 、$N$ 这三个数就是生成密钥对。
第一步:求N
- 准备两个很大的质数为 $p$ 和 $q$。
- 将两个很大的质数相乘,其结果就是 $N$,即$$N=p * q$$ 。
特点:$p$ 和 $q$ 太小的话,密码容易被破译,太大的话计算时间会变得很长。
判断一个数是否为质数,可以通过费马测试和米勒拉宾测试。
第二步:求L(中间过程使用)
$L$ 是 $p-1$ 和 $q-1$ 的最小公倍数(least common multiple,lcm),即$$L=lcm(p-1,q-1) \tag{L是p-1和q-1的最小公倍数}$$
第三步:求E
$E$ 是一个比 $1$大、比 $L$ 小的数。
$E$ 和 $L$ 的最大公约数(greatest common divisor,gcd)必须为1,即
$$ \begin{align} 1 < E < L \\ gcd(E,L)=1 \tag {E和L互质} \end{align} $$
第四步:求D
数 $D$ 是由数 $E$ 计算得到的。$D$、$E$、$L$ 之间必须具备如下关系:
$$ \begin{align} 1<D<L \tag{1} \\ E * D \mod L=1 \tag{2} \end{align} $$
只要数 $D$ 满足上述条件,则通过 $E$ 和 $N$ 进行加密的密文,就可以通过 $D$ 和 $N$ 进行解密。
要保证存在满足条件的 $D$, 就需要保证 $E$ 和 $L$ 互质。
实践
求N
取$p=17$ 和 $q=19$ ,求 $N=pq=1719=323$
求L
$L=lcm(p-1,q-1)=lcm(16,18)=144$
求E
满足条件: $gcd(E,L)=1$
例如 $5,7,11,13,17,19,23,25,29,31,…$
因此,取$E=5, N=232$ 为公钥。
求D
$D$ 满足条件 $E*D \mod L =1$。
取 $D=29$ 满足 $$ \begin {align} E*D \mod L &= 5 * 29 \mod 144 \\ &= 145 \mod 144 \\ &= 1 \end {align} $$
此时已经生成了密钥对, 即公钥 $E=5,N=323$ 私钥 $D=29,N=323$ 。
加密
要加密的明文必须是小于$N$的数,因为在解密过程中需要求$\mod N$,其结果一定小于$N$。
假设加密的明文是$123$,加密时使用的是公钥$E=5,N=323$,则有
$$ \begin{align} 明文^{E} \mod N &= 123^{5} \mod 323 \\ &= 225 \end{align} $$
解密
对密文$225$进行解密, 解密密钥是$D=29, N=323$,有
$$ \begin{align} 密文^{D} \mod N &= 225^{29} \mod 323 \\ &= (225^{10} * 225^{10} * 225^{9}) \mod 323 \\ &= ((225^{10} \mod 323) * (225^{10} \mod 323) * (225^{9} \mod 323)) \mod 323 \\ &= (16 * 16 * 191) \mod 323 \\ &= 48896 \mod 323 \\ &= 123\\ 225^{10} &= 332525673007965087890625 \\ 225^{9} &= 1477891880035400390625 \end{align} $$
RSA的攻击方式
密码破译者知道的信息:密文、数 $E$ 和 $N$。
通过密文来求明文
$密文=明文^{E} \mod N$ 的求解,等同于求离散对数的问题。
暴力破解
现在RSA中所使用的 $p$ 和 $q$ 都是2048位以上,除非量子计算机出现。
对 $N$ 进行质因数分解攻击
一旦发现了对大整数进行质因数分解的高效算法,RSA就能够在算法层面被破译。
其他公钥密码
公钥密码 | 数学原理 | 说明 |
---|---|---|
ElGamal方式 | $\mod N$ 下求离散对数的困难度 | 缺点是经过加密的密文长度会是明文的两倍,GnuPG软件中支持这种方式 |
Rabin方式 | $\mod N$ 下求平方根的困难度 | 和质因数分解的难度相当 |
椭圆曲线密码 | 椭圆曲线上的特定点进行特殊的乘法运算来实现的 | 乘法运算的逆运算非常困难,所需的密钥长度比RSA短 |
Q&A
RSA使用的人原来越多,质数会不会被用光?
512比特能够容纳的质数大约有10的150次方,2048比特则更多。
RSA加密过程中,需要对大整数进行质因数分解么?
不需要,RSA只有在需要由 $N$ 求 $p$ 和 $q$ 的密码破译过程中才需要对大整数进行质因数分解。
- 原文作者:生如夏花
- 原文链接:https://blduan.top/post/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF/%E5%85%AC%E9%92%A5%E5%AF%86%E7%A0%81/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。