今天我们要讲的是非对称加密算法。
课程分三个步骤
- 为什么要用到非对称加密算法(why)
- 什么是非对称加密算法(what)
- 如何用 Python 实现加密算法(how)
why
非对称加密提供了数据加密和数字签名两个功能。
而这两个功能分别有更简单的实现方式对称加密和散列运算。
那为什么还需要非对称加密呢?
先来看一个例子。
小明和小红是一对恋人,他们分居上海和北京,路途遥远不便见面,只能通过网络联系,这种方式快捷方便,开始两人并没有觉得不妥。
有一天两人到了谈婚论嫁的年纪,开始讨论结婚事宜,说到了彩礼的事情。
小明很有安全意识,他觉得涉及到钱的问题,应该小心翼翼,网络并不安全,如果谈的是 5 万,结果在网络中被人篡改了,变成 10 万怎么办?他想到了使用数字签名的方式,将数据进行 MD5 加密,并将加密过的签名,一起发给小红,并让小红对数据再次使用 MD5 加密,并将自己计算的结果跟小明发过来的进行对比,一致则数据没有被篡改。
在这个方案下,两人安全的将结婚事宜谈妥,小红很高兴,想对小明说些悄悄话,但是她又不想让网络中其他人听到她说的是什么。她想到了数据加密的方式,她先将要说的话使用 AES 算法做对称加密,然后将加密后密文和加密使用的秘钥发给小明,然后小明使用秘钥对密文进行解密,即可看到小红要说的话。
然而事情真的像他们想的这么安全吗?
小明的签名算法必须是公开的,小红才能用相同的算法验证,只要是公开的,别人就可以使用相同的算法,先将明文篡改,再对新明文进行签名再发给小红,这样小红验证到的只是被篡改的数据。
同样的道理,小红的对称加密算法,想要让小明对其进行解密,必须将加密用的秘钥公开出来。这样小明可以解密,别人也可以解密。
那怎么解决呢?你会想不公开不就行了吗,小明自己写一个签名算法偷偷告诉小红,小红将加密的秘钥偷偷告诉小明。说起来简单,做起来难,怎么偷偷告诉?小明先坐飞机到北京告诉小红,然后每次发现算法有漏洞,修改算法后在坐飞机到北京?
没有必要,此时非对称加密可以出场了。
what
什么是非对称加密?
对称加密是用相同的秘钥对数据进行加解密,那非对称加密顾名思义就是用不同的秘钥对数据进行加解密。
非对称加密算法有两个秘钥,公有秘钥和私有秘钥,两个秘钥是一对。每个人都可以生成属于自己的公私钥,公钥可以公布给任何人知道,所以它也叫公开密钥算法,私钥只能自己保留,不能泄露。
现在我们再来看小明的问题,小明使用非对称加密算法做数字签名,他先使用私钥将明文做签名,然后将明文、签名和公钥一起发给小红,小红可以使用公钥对签名进行验证。此时其他及时拿到了公钥也无济于事,因为签名只能使用私钥。
而小红的问题也很简单,她可以使用小明的公钥对明文进行加密,再将密文发给小明,小明使用自己的私钥对数据进行解密,即可拿到明文。此时其他人及时拿到公钥和密文也无济于事,因为公钥加密的密文只能用对应的秘钥进行解密
然后小红再生成自己的公私钥,双方互换公钥,各自保留私钥,加密和签名双管齐下,互发消息都可以做到非常安全。
总结一下
公钥用来加密,对应秘钥解密
私钥用来签名,对应公钥验证
how
下面我们来看看如何使用 Python 实现加密算法
生成公私钥
1 | $ ssh-keygen -t rsa -C your_email |
安装依赖
1 | $ pip install pycrypto |
代码
youtube 视频
youku 视频