今天我们要讲的是非对称加密算法。

课程分三个步骤

  • 为什么要用到非对称加密算法(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 视频

03-16 19:46