目录
5.3.4 通过 Diffie-Hellman 密钥交换来解决密钥配送问题
5.1 投币寄物柜的使用方法
无重要内容。
5.2 本章学习的内容
- 公钥密码。
- 密钥配送问题
- 最常用的公钥密码-RSA
5.3 密钥配送问题
5.3.1 什么是密钥配送问题
密钥配送问题是对称密码所面临的问题:密钥必须要发送,但是又不能直接发送。
举例:Alice给Bob发邮件时,不发送密钥,Bob无法解密,发送密钥,Eve也可以解密。
解决密钥配送问题的方法:
- 通过事先共享密钥来解决
- 通过密钥分配中心来解决
- 通过 Diffie-Hellman 密钥交换来解决
- 通过公钥密码来解决
5.3.2 通过事先共享密钥来解决
事先共享尽管有效,但是确具有一定的局限性。
1)需要一种安全的方式将密钥交给对方
2)体量很大的时候,所需要的密钥数量较大。如有1000人,则需要密钥数量为1000X999÷2=499500个。
5.3.3 通过密钥分配中心来解决
密钥分配中心(Key Distribution Center,KDC),每个人只要和密钥分配中心事先共享密钥就可以了。也就是说如果有1000人,数据库中就会保存1000个密钥就够了。
举例,Alice向Bob发送加密邮件时候,需要的步骤如下:
- Alice向密钥分配中心发出想要和Bob通信的请求
- 密钥分配中心通过伪随机数生成器生成一个会话密钥,这个密钥是供Alice和Bob本次通信中临时使用的密钥
- 密钥分配中心从数据库中取出Alice和Bob的密钥
- 密钥分配中心用Alice的密钥加密会话密钥,发送给Alice;用Bob的密钥加密会话密钥,发送给Bob
- Alice用自己的密钥解密,得到会话密钥
- Alice用会话密钥加密邮件,发送给Bob
- Bob对来自分配中心的消息进行解密(用自己的密钥),得到会话密钥
- Bob用会话密钥对Alice的邮件进行解密
- Alice和Bob删除会话密钥
KDC的局限性在于:
- 随着数量的增加,KDC的负荷也会随之增加。
- 如果KDC计算机发生故障,全部的加密通信就会瘫痪。
- KDC面临被攻击者入侵的风险,盗取密钥数据库。
5.3.4 通过 Diffie-Hellman 密钥交换来解决密钥配送问题
Diffie-Hellman 密钥交换,进行加密通信的双方需要交换一些信息,依据所交换的信息,双方可以各自生成相同的密钥。具体的实现细节,将在第11章中详述探讨。
传送门——>
5.3.5 通过公钥密码来解决密钥配送问题
发送者使用公钥密码进行加密,接收者使用私钥进行解密。
5.4 公钥密码
5.4.1 什么是公钥密码
公钥密码中,密钥分为加密密钥(公钥)和解密密钥(私钥)两种。加密密钥一般是公开的,但是解密密钥一定不能公开。
5.4.2 公钥密码的历史
1976年,发表了关于公钥密码的设计思想。
1978年,设计了具体的公钥密码算法-RSA。
5.4.3 公钥通信的流程
在公钥密码通信中,通信过程是由接受者Bob来启动的。
5.4.3 各种术语
公钥密码,也称为非对称密码。
5.4.5 公钥密码无法解决的问题
公钥密码解决了密钥配送问题。但是还有一下两个问题:
1)在公钥通信中,我们需要判断所得到的公钥是否正确合法,这个问题被称为公钥认证问题。
2)公钥密码的处理速度只有对称密码的几百分之一。这个问题的解决,将在第6章中进行介绍。
5.5 时钟运算
5.5.1 加法
mod:除法求余数的运算。和“ X ”、“ ÷ ”等符号会被同等处理。
例如:(7+6)mod 12 即 13 mod 12 = 1;就是13除以12的余数是1.
5.5.2 减法
减法是加法的逆运算。
满足(X+Y)mod 12 = 0可计算出X、Y的组合,即:“减去X”与“加上Y”这两个运算是等价的。
5.5.3 乘法
7X4 mod 12 = 28 mod 12 = 4
5.5.4 除法
除法可看成乘法的逆运算。
看看下面这个算式:
A X B mod 12 = 1;即在以12为模的世界中,A与B互为倒数。
某个数是否存在倒数,可以通过这个数与12的最大公约数为1这个条件来进行判断。
和12的最大公约数为1的数(5、7、11),在数学上称为“和12互质的数”。也可以理解为“相对于12的质数”。
5.5.5 乘方
例如下面的计算:在乘方的中间步骤求mod,结果是一样的,可以避免计算大整数的乘积。
这种在计算过程中求mod来计算乘方的方法,是RSA的加密和解密算法中所使用的方法。
5.5.6 对数
乘方的逆运算称为对数。
对数 与 离散对数:
想学习了解更多关于离散对数的详细内容,请移步——>离散对数密码学原理
5.5.7 从时钟到RSA
RSA的加密和解密过程中所使用的正式这样的运算。
5.6 RSA
5.6.1 什么是RSA
RSA是三位开发者的姓氏的首字母组成,RSA可以被用于公钥密码和数字签名。关于数字签名,将在第9章进行详解。
5.6.2 RSA加密
RSA加密可以用下面的公式来表达:
RSA的密文是对代表明文的数字的E次方求mod N的结果。
E是加密(Encryption)的首字母,N是数字(Number)的首字母。
E和N是RSA加密的密钥,也就是说,E和N的组合就是公钥,一般写成公钥是 (E, N)。
5.6.3 RSA解密
RSA的解密可以用下面的公式来表达:
RSA的明文是 对代表密文的数字的D次方求mod N的结果。
D是解密(Decryption)的首字母,N是数字(Number)的首字母。
解密的N和加密的N相等,D和N的组合就是私钥。
5.6.4 生成密钥对
求E、D和N这三个数就是生成密钥对。RSA密钥对的生成步骤如下:
- 求N
- 求L(L是仅在生成密钥对的过程中使用的数)
- 求E
- 求D
(1)求N
N = p x q (p 、q为质数。注意不是互质)
质数:“是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
p、q是需要通过伪随机数生成器生成的数,生成后要先判断是不是质数,如果不是就重新生成。p和q不能太小,太小的话容易被破译,太大的话计算时间又会变长。
(2)求L
L只出现在生成密钥对的过程中。
L = lcm(p-1,q-1) (L是p-1和q-1的最小公倍数)
(3)求E
1 < E < L; 第一步是伪随机数生成器在这个范围类生成E的候选数。
gcd(E,L) = 1; 第二步就是判断是否满足这个条件。E与L的最大公约数为1(E和L互质)。
简单来说,之所以要加上 “gcd(E,L) =1” 这个条件,是为了保证一定存在解密时需要使用的数D。
到目前,求出了E和N,就已经生成了密钥对中的公钥。
(4)求D
D是由E计算得到的。D、E、L之间必须具备下列关系
- 1 < D < L;
- E x D mod L =1; 要保证存在满足条件的D,就需要E和L的最大公约数为1(见上一节的时钟运算),同事也正是(3)中对E的要求条件。
简单来说,E x D mod L =1保证了对密文进行解密时能够得到原来的明文。
到目前,求出了D和N,就已经生成了密钥对中的私钥。
RSA中密钥对的生成汇总
(1)求N | (3)求E |
用伪随机数生成器求p和q,p和q都是质数 N = p × q | 1 < E < L; gcd(E,L) = 1;E与L的最大公约数为1(E和L互质)。 |
(2)求L | (4)求D |
L = lcm(p-1,q-1) L是p-1和q-1的最小公倍数 | 1 < D < L; E × D mod L =1; |
5.6.5 具体实践一下吧
举例计算如下:
(1)求N
取p=17, q=19;那么:N=p x q = 17 x 19 = 323;
(2)求 L
L = lcm(p-1, q-1)= lcm(16,18)= 144(16和18的最小公倍数)
(3)求E
gcd(E,L)= 1; E=5,7,11,13,17...有很多满足的数,我们取E=5。那么E=5,N=323,这就是公钥。
(4)求D
E x D mod L = 1; 5 x D mod 144 = 1计算得到 D=29
公钥(E,N)= (5,323),私钥(D,N)=(29,323)
下面进行加密和解密计算:
要加密的明文必须是<N的数,也就是小于323的数。原因在结尾处再写。我们取明文为123
加密和解密:
为什么 明文 < N :
因为解密运算需要mod N,而mod N的结果必定小于N,因此如果明文本身大于N,则解密后无法得到正确的明文。
5.7 对RSA的攻击
5.7.1 通过密文来求得明文
目前没有发现求离散对数的高效算法。
5.7.2 通过暴力破解来找出D
由于现在RSA所使用的p和q的长度都是1024比特以上,N的长度为2048比特以上。在这样的长度下暴力破解极其困难。
5.7.3 通过E和N求出D
破译者不知道p和q,就不能计算出D。所以对p和q的求解是非常关键的
-
对N进行质因数分解攻击:N = p x q,N是公开的,p和q都是质数,因此由N求p和q只能通过将N进行质因数分解来完成。 我们可以说:一旦发现了对大整数进行质因数分解的高效算法,RSA就能够被破译。然而目前并没有。
- 通过推测p和q进行攻击:由于p和q是通过伪随机数生成器产生的,如果生成器的算法很差,密码破译者也可能推测处p和q。
5.7.4 中间人攻击
Mallory混入发送者和接收者中间,对发送者伪装成接收者,对接收者伪装成发送者。
Alice准备向Bob发送一封邮件,中间人攻击的简单过程:
- Alice向Bob索取公钥
- Mallory拦截了Bob的邮件,使其无法发送给Alice。Mallory把Bob的公钥保存起来,然后把自己伪装成Bob,把自己的公钥发给Alice
- Alice用收到的公钥(Mallory的公钥)加密邮件,发送给Bob
- Mallory拦截了邮件,用自己的私钥解密邮件。
- Mallory篡改邮件后,再用Bob的公钥进行加密,然后伪装成Alice,发送给Bob
- Bob接收到邮件解密后,就看到了Mallory篡改后的邮件,但是他以为是Alice发送的
要防御中间人攻击,还需要一种手段来确认收到的公钥是否真的来自Bob,这就是认证。我们可以使用公钥的证书。关于证书,会在第10章进行探讨。
5.7.5 选择密文攻击
选择密文攻击:发送任意数据,服务器都会将其当做密文来解密并返回解密的结果,这种服务称为解密提示。
如何改进RSA才能地狱选择密文攻击呢:RSA-OAEP,是一种RSA改良算法(RFC2437)。
5.8 其他公钥加密
5.8.1 ElGamal方式
RSA:利用质因数分解的困难度;
ElGamal:利用mod N下求离散对数的困难度。
缺点:加密的密文会变成明文的两倍。
5.8.2 Rabin方式
Rabin:利用mod N下求平方根的困难度。破解难度与质因数分解是相当的。
5.8.3 椭圆曲线密码(ECC)
特点:所需的秘钥长度比RSA短。
是通过将椭圆曲线上的特定点进行特殊的乘法运算来实现的,利用了这种乘法运算的逆运算非常困难这个特性。
5.9 关于公钥密码的Q&A
5.9.1 公钥密码的机密性
Q:公钥密码比对称密码的机密性更高吗?
A:不是,机密性的高低根据密钥长度而变化的。
5.9.2 公钥密码与对称密码的密钥长度
Q:RSA1024 比 AES-256安全性更高吗?
A:不是。不同加密算法,不能直接通过密钥的长短比较安全性。比较复杂。