对称|非对称加密,数字签名,数字证书
现代密码学中,加密算法包括两部分
- 算法,一组规定如何进行加解密的规则,描述加解密的具体操作步骤。为了方便使用及保证算法可靠性,算法都是公开的
- 密钥,用于算法的秘密参数
先介绍下对称加密与非对称加密的概念。
- 对称加密:加密和解密都采用同一个密钥,常见的对称加密算法如DES、AES、IDEA、Blowfish、RC4、RC5、RC6等
- 非对称加密:加密解密分别使用不同的密钥,分为公钥和私钥,一般公钥所有人都可以知道,但是私钥只有自己知道。私钥加密公钥可解密,反之依然。常见的非对称加密如RSA、ECC等
对称加密相对于非对称加密,速度更加快捷,因此对于大量内容进行加密传输时,一般使用对称加密进行加密通讯。但是对称加密的密钥如何安全的让对方知道是一个问题。因此使用对称加密进行通讯之前,往往需要使用非对称加密交换密钥,然后再使用对称加密进行通讯。
DH算法
明文传过去也可以使用一定的算法使得即使黑客截获了这段明文也不知道密钥是啥,这就是著名的DH密钥协商算法。
我们来看DH算法交换密钥的步骤,里面涉及一些幂与取余运算,对数学要求比较高,我这里简化一下,假设有一个函数f,输入a,b得到f(a,b)
,但是不能通过f(a,b)
和b推出a,a和b可以交换。假设A和B要在网上明文协商一个密钥。
- A和B都生成一个自己的随机数,就自己知道,分别叫ra和rb。
- A将ra和c输入函数f得到f1,并将c和f1发送给B
- B利用rb和c输入函数得到f2,并将f2发送给A,自己利用rb和f1输入f得到密钥s
- A利用f2和ra输入函数得到密钥s
这样由于黑客不知道ra或rb,即使知道了f1/f2/c 依然无法得出密钥s。这里的函数f还有这样的特性,就是f(ra,f(rb,c)) = f(rb,f(ra,c))
,反正伟大的数学家就是能想到这样的函数,咱不用管。但是DH算法并不能解决中间人攻击的问题:如果黑客截获了B消息,伪装B的身份与A进行密钥协商,那A是不清楚自己的协商对象居然是黑客的,因此还不能算安全。非对称加密本身也无法从根本上解决这个问题,而需要借助第三方CA机构才能解决。
这里涉及到三个问题:
- 非对称加密如何传输密钥?
- 数字签名什么,怎么工作的?
- 安全证书是什么,如何工作的?
密钥加密传输
考虑这样的场景,A想要与B进行加密通讯,但是A和B并没有机会线下告诉对方使用什么密钥加密信息,于是准备使用非对称加密的方法先将密钥传过去。由于非对称密钥公钥大家都可以知道,因此A知道B的公钥,B也知道A的公钥,但是他两的私钥都只有自己知道。于是A使用B的公钥加密密钥,然后发送给B。由于公钥加密的信息只有对应的私钥能解,于是B使用自己的私钥解密后就可以得到密钥,接下来就可以使用密钥与A进行加密通讯了。
数字签名
但故事到这里并没有结束,假如有个黑客H,他拦截了A发送给B的信息,因为他也有B的公钥,那么他也可以用B的公钥加密一个假密钥发送给B,B同样能用自己的私钥解密,从此B和H使用假密钥进行加密通讯,A反而成了外人。。。因此这里就有一个问题,B需要确认这个消息是A发来的而不是H或者其它人发来的才行!于是引来了数字签名这个概念。
数字签名这个与我们日常生活中的签名作用是一样的,就是我们的签名别人是很难伪造的,计算机里也一样。什么是数字签名?A在发送内容之前,首先使用HASH算法对数据生成一段摘要,然后再使用A自己的私钥对这个摘要进行加密,生成的密文就是这段内容的数字签名(思考:为什么不直接对内容签名?)。然后A使用B的公钥加密内容(这里我们加密的是密钥),并将加密后的内容以及签名一起发过去。B收到消息后,使用自己的私钥解密内容(密钥),得到内容明文,然后使用同样的HASH算法对内容生成摘要1。接着,再使用A的公钥解密签名,得到摘要2,再对比摘要1和摘要2,如果一致,就说明确实是A发来的,并且内容没有篡改,从而这个数字签名的确起到辨认身份的作用了。
数字证书
故事到这里依然没有结束:虽然A和B的公钥是公开的,但是A怎么知道自己手上拿到的公钥就是B的呢?在B向A发送公钥的时候,黑客就可以拦截,将自己的公钥发给A呀,那这样的话,B又成了外人。。。所以A需要确认公钥是B本人发的,而不是黑客H或其它人发的。数字签名可以解决这点,但是数字签名的前提是A知道B的公钥,才行啊,否则加密内容使用的是H的公钥,那H不就可以解开了吗。这样套娃下去是没有止境的,因此需要引入第三方权威机构来帮助进行身份认证。
假设我们有一个权威机构,叫CA,大家都认为他是可信的(如果他也有坏心思,那么就不安全了)。我们所有的计算机浏览器里面,都会将他的公钥内置到浏览器。然后B首先向CA注册自己的公钥,CA会利用上面的数字签名这套机制生成公钥密文以及数字签名作为B的数字证书。由于B在向CA注册公钥时,需要经过比较严格的认证,因此认为这个过程也是可信的。然后A想要得到B的公钥,就向CA询问,CA就将B的数字证书发给A,A就能利用CA的公钥来验证数字签名,确保的确是CA发送过来的,并且内容没有做过篡改,然后就得到了B的密钥了。
总结
故事到这里就结束了,A和B终于可以安全的交换密钥,然后使用对称加密的方式进行秘密通讯了。上面有一个思考就是为什么不直接对内容签名,因为对内容签名的话,黑客也可以用A的公钥解密这个签名,那就直接得到加密内容了,肯定不行。另一方面,摘要比较简短,签名也更快点。
然后不要下载不正规的浏览器,因为里面可能包含不合法的CA证书,引起一些安全漏洞。