Haorui: 对称密码系统我们己经使用了至少4000年,但是在有些应用场景下就显得力不从心。首先是密钥个数问题,比如一个1000人的公司,每个员工之间都要进行加密通信。得需要多少密码?
Lauren: 相当于每个人要1000个密码,也就是1000乘以1000,要100万个密码。
Haorui: 正确答案应该是大约50万个,也很多了。而且在通信双方之间,必须事先通过安全信道传输密码才能通信。也就是说,消息与密钥必须通过两个信道发送。否则攻击者就有可能窃听到密钥,并解密密文。见图6.1
Lauren: 是的。另外,我觉得密钥必须在通信双方间共享,万一密钥泄密。双方都有嫌疑,无法确定责任人。
Haorui: 所以有人就提出了一个Idea,应该将加密密钥与解密密钥分开。也就是加解密的时候用不同的密钥。这就是今天要讲的非对称密码。
非对称密码系统有两个密钥,我们称之为密钥对,一个称之为公钥(图2.1就是我生成的一个RSA算法的公钥),一个称之为私钥。公钥可以被公开的,私钥是绝对保密的,只有接收者拥有。发送者用公钥加密,接收者用私钥解密。见下图6.2.
Haorui: 再看看它的通信流程,见图6.3
首先,在通信之前,Bob将自己的公钥发给Alice。Alice用Bob的公钥对消息进行加密并发送给Bob,Bob用自己的私钥进行解密。因为只有Bob一个人有私钥,所以其它人是无法知道Alice给Bob消息的内容。
Lauren: 但是Bob的公钥在Internet上传输,万一被窃听了怎么办?
Haorui: 没有关系,公钥是可以被公开的。即便窃听者知道Bob的公钥,他还是没有办法知道Alice发给Bob的消息内容。我们再看看非对称密钥系统是否解决了上面说的密钥个数问题。
Lauren: 可以解决了,只需要1000个非对称密钥对就可以了。每个人都共享自己的公钥给其它人,则其它人就可以给自己发消息了。那么这个从技术上是怎么实现的,非对称加密算法长啥样?
Haorui: 非对称加密算法比较复杂,这里给个RSA算法的公式。稍为有一个感觉。具体的算法内容可以参照具体的标准,很多书上都有讲。见图6.4
公式中E和N一起组成公钥,D与N组成私钥。有一点要注意的是,因为其算法的复杂性,所以导致其加解密速度相对于对称密码算法而言要慢很多。所有在实际应用中,两者加密算法都有使用。
Lauren: 的确有点复杂。
Haorui: 没关系,这都是70年代产生的技术。实际使用过程中只需直接使用就好。不需要了解太多的技术细节。再仔细看看图6.3,看看这个技术有啥缺陷没?
Lauren: Bob的公钥是通过不安全的信道传给Alice的。是不是会生产什么问题呢?
Haorui: 是的,这里面有个大问题。称之为中间人攻击。如果攻击者截获了Bob的公钥,并替换成自己的公钥,发给Alice。Alice误以为是Bob的公钥,用攻击者的公钥加密的信息,攻击者都可以解密。
Lauren: 有办法解决这个问题吗?
Haorui: 当然,需要用到电子证书来解决这个问题。这个后续再讲。
常用的非对称密码有RSA、DSA、ECC(Elliptic Curves Cryptography, 椭圆曲线密码编码学) 、ECDSA (ECC与DSA的结合) 、ElGamal方式、Rabin方式等。