公钥密码用公钥加密,私钥解密。
在对称密码中,由于加密和解密的密钥都是相同的,因此必须向接收者配送密钥。而在Alice将密钥发送给Bob时,会被Eve窃听,因此Eve就能像Bob一样完成密文的解密。
Alice感到一筹莫展。不发送密钥吧,接收者Bob无法解密;发送密钥吧,连窃听者Eve也可以解密了。密钥必须要发送,但又不能发送,这就是对称密码的密钥配送问题。
公钥密码(public-key cryptography)中,密钥分为加密密钥和解密密钥。发送者用加密密钥对消息进行加密,接收者用解密密钥对密文进行解密。
加密密钥和解密密钥的区别:
由于加密密钥可以任意公开,因此该密钥被称为公钥(public key)。而解密密钥时绝对不能公开的,因此称为私钥(private key)。公钥和私钥是一一对应的,一对公钥和私钥统称为密钥对(key pair)。
公钥通信的流程:
在这个过程中,Alice和Bob之间传输的信息只有Bob的公钥和用Bob的公钥加密的密文。由于Bob的私钥没有出现在通信内容中,因此窃听者Eve无法对密文进行解密。
公钥密码无法解决的问题:
公钥密码除了能保证数据传输的机密性,还能用作数字签名,提供认证功能。例如,假设现在Alice希望把一个数字签署的信息 M ′ M' M′发送给Bob,那么:
RSA是一种公钥密码算法,它的名字是由它的三位开发者,即Ron Rivest、Adi Shamir和Leonard Adleman的姓氏首字母组成的(Rivest-Shamir-Adleman)。
在这里,数 E E E和数 N N N共同组成了公钥 ( E , N ) (E, N) (E,N),数 D D D和数 N N N共同组成了私钥 ( D , N ) (D, N) (D,N)。其中 E E E是加密(Encryption)的首字母, D D D是解密(Decryption)的首字母, N N N是数字(Number)的首字母。同时,被加密的明文需要小于 N N N,否则就要将明文分解。
那么,如何生成密钥对?通过上面可以知道, E E E和 N N N是公钥, D D D和 N N N是私钥,因此求 E E E、 D D D和 N N N这三个数就是生成密钥对(这里涉及到了一些数学问题,不感兴趣可以跳过):
求 N N N:选择两个很大的(例如 1024 1024 1024bit)质数 p p p和 q q q,那么:
N = p × q N = p \times q N=p×q
求 L L L: L L L这个数在RSA加密和解密中都不出现,它只出现在生成密钥对的过程中。 L L L是 p − 1 p - 1 p−1和 q − 1 q - 1 q−1的最小公倍数(least common multiple,lcm):
L = l c m ( p − 1 , q − 1 ) L = lcm(p - 1, q - 1) L=lcm(p−1,q−1)
求 E E E: E E E是一个比 1 1 1大、比 L L L小的数,并且 E E E与 L L L互质,即 E E E和 L L L的最大公约数为 1 1 1:
{ 1 < E < L g c d ( E , L ) = 1 \begin{cases} 1 < E < L \\ gcd(E, L) = 1 \end{cases} {1<E<Lgcd(E,L)=1
求 D D D:数 D D D是由数 E E E计算得到的。 D D D、 E E E和 L L L之间必须具备下列关系:
{ 1 < D < L E × D m o d L = 1 \begin{cases} 1 < D < L\\ E \times D\, mod\, L = 1 \end{cases} {1<D<LE×DmodL=1
要保证存在满足条件的 D D D,就需要保证 E E E和 L L L的最大公约数为 1 1 1,这也是 ( 3 ) (3) (3)中对 E E E所要求的条件。
这里面可能会有一些疑问,例如:
RSA的安全性主要来源于对大整数进行因式分解的困难性。如果破译者能对公钥中的 E × D m o d L = 1 E \times D\, mod\, L = 1 E×DmodL=1进行分解,就可以根据公钥推导出密钥。要由 E E E计算出 D D D,就需要数字 L L L,因此就需要知道 p p p和 q q q。
如果分解大整数是困难的,那么打破RSA也是困难的。经过20多年的研究,人们还没有发现比分解 E × D m o d L = 1 E \times D\, mod\, L = 1 E×DmodL=1更容易的方法来打破RSA加密系统。事实上,对大整数的分解是相当困难的。通过随机地选取两个 1024 1024 1024bit的质数并求出它们的积,就可以创建出一把无法用现行技术在可行的时间内“破解”的公钥。
中间人攻击(man-in-the-middle attack)不仅是针对RSA,而是可以针对任何公钥密码。它虽然不能破译公钥密码,但却是一种针对机密性的有效攻击。
所谓中间人攻击,就是主动攻击者Mallory混入发送者和接收者的中间,对发送者伪装成接收者,对接收者伪装成发送者的攻击方式,在这里“Mallory”就是“中间人”。
在这个过程中,公钥密码并没有被破译,所有的密码算法也都正常工作并确保了机密性。然而,所谓的机密性并非在Alice和Bob之间,而是在Alice和Mallory之间,以及Mallory和Bob之间。仅靠公钥密码本身,是无法防御中间人攻击的。
公钥密码可以避免密钥配送问题,但它的处理速度远远低于对称密码。而混合密码系统可以解决对称密码的密钥配送问题,还能解决公钥密码速度慢的问题。
混合密码系统(hybrid cryptosystem)是将对称密码和公钥密码的优势相结合的方法。它用快速的对称密码来对消息进行加密,用公钥密码对加密消息时使用的对称密码的密钥进行加密。由于对称密码的密钥一般比消息本身要短,因此公钥密码速度慢的问题就可以忽略了。
混合密码系统的组成机制:
混合密码系统的加密:
混合密码系统的解密:
混合密码系统是将对称密码和公钥密码相结合,从而构建出一种同时发挥两者优势的系统。密码学中还有一些多种技术组合而成的技术,我们先做个简单的介绍: