公有密钥和私有密钥加密
如果你的朋友给你发送了一封邮件,老朋友多日未见说了些寒暄的话,最后你的朋友又来了一句,今天晚上六点我请你到北京饭店吃饭吧,怎么样?你可能对这句话比较怀疑,这小子今天头脑是不是有问题?在看看这封邮件的地址,还真是他的邮件地址,但认识这小子很多年了,从来没请我吃过饭。今天???一连串的问号在你的头脑中。如果你对这样的问题比较感兴趣,那么让我帮你慢慢的解开谜底吧?
实际上产生这样的问题,原因很简单,你朋友发的邮件信息是很容易被人窃取到的,窃取人窃取到邮件信息后做适当的修改,然后再发送给你。你看到的邮件实际上已经是被其他人修改过的邮件了,他可能只是给了你一个小的恶作剧而已,更大的问题可能在你的生活中就会遇到了。如果是这样的话,那么不是太可怕了吗?其实解决这样的问题也不难,请跟我看消息摘要是如何解决以上问题的?
一、消息摘要
我们可以将我们要发送的消息,通过某种数学上的安全散列算法计算出一个值(这个值后面我们就称之为消息摘要)。消息摘要我们可以把它比喻成指纹,指纹大家都知道每个人都不一样,甚至一个人的不同手指也不一样。这就是说只要我们的消息不同,那么通过这种安全散列算法计算出的消息摘要肯定是不同的,相同的概率是非常低的,到底有多低呢?根据James Walsh的叙述,一个人死于雷击的概率为三万分之一,现在你选出9个人,比如你非常讨厌的9个人,你和这9个人同时死于雷击的概率,你想想有多低,所以你忽略不计吧。姑且认为是不太可能重复的(当然,有可能有10个人是同时死于雷击的,但这10个人不会都是你非常讨厌的人吧 )。
MD5和SHA1都是常见的安全散列算法,当然我们不必关心这些算法的具体细节,我们只需要知道他们要解决什么问题就可以了。最好不要再去使用MD5算法,因为这个算法已经在2004年被山东大学王小云教授破解。
知道了消息摘要是什么,那么我们到底怎么解决如上问题呢?我们来看,如果将你朋友要发给你的消息我们称之为A,通过安全散列算法计算出的消息摘要我们称之为AS,然后你的朋友将A和AS一起发送给你。如果窃取者窃取了信息A,然后将其改为B,再发送给你。这时你接收到的肯定是消息B,之后你计算B的消息摘要我们称之为BS,现在BS和AS的值肯定不一样,所以你就会知道了,这个消息B一定是被修改过的消息,已经非原版了。
消息摘要看似很简单就解决了问题,但是你要小心了,如果窃取者在窃取到了消息A后,将其改为B,如果他还是将消息摘要AS发送给你的话,那么这个窃取者就是个十足的笨蛋,他的水平充其量也就是孙老师这样的水平。他完全可以再重新计算B的消息摘要,这时我们称之为BS,然后将B和BS发送给你。当你收到消息B后,你再计算B的消息摘要,那肯定是BS,那你就可以相信这个消息了吗?很明显,非也。那么我们究竟该怎么办呢?答案是借助数字签名。
二、数字签名
刚刚我们已经知道了如果消息改变了,那么改变后的消息与原消息的消息摘要一定是不同的。我们将消息和消息摘要分别传送,如果消息摘要没有被截获那么我们还是可以知道消息是否被更改了,但是如果消息和消息摘要都被截获的话,那么我们也不会知道消息是否被篡改了。下面我们看一下数字签名如何解决这个问题。
为了了解数字签名的工作原理,我们有必要先了解一下公共密钥加密技术。公共密钥加密技术是基于公共密钥和私有密钥这两个概念的。它的设计思想是你可以将公共密钥告诉世界上的任何人,但是只有你才拥有私有密钥,最重要的是你一定要保护好你的私有密钥,不要将它告诉任何人。公共密钥和私有密钥是有数学关系的,那你可能会担心,很多人都知道我的公共密钥,他们根据公钥密钥会不会推断出我的私有密钥呢?你的担心是有道理的,但是你大可放心,几乎是不可能的?这似乎令人难以相信,但直至今日,还没有人能够找到一种能够通过公共密钥来推断私有密钥的方法。所以在目前看来这种技术是绝对安全的,应该完全去信任它。那么我们怎么去使用这两个密钥呢?非常简单,如果消息用公共密钥去加密,那么只能通过私有密钥去解密。如果消息用私有密钥去加密,那么只能通过公有密钥去解密。看起来非常简单,的确它就是这么简单。基于这两句话,公共密钥加密技术有两个非常有用的应用:
1、数据加密
如果某人给你发送数据,他用你的公共密钥加密数据,那么这个数据就只有你能够看得懂,因为只有你才拥有私有密钥。其他人根本无法解密数据。
2、数据认证
如果你用私有密钥加密一个数据,那么任何持有你公有密钥的人都可以解密数据,当然这个时候并不是为了保密数据,而是为了证明这个数据是不是你发送的。你想想看,如果某人用你的公共密钥解开了数据,他就会知道这个数据一定是你发送的,因为通过其他人的公共密钥是不可能解开数据的。
通过上面的介绍你应该知道了公共密钥加密技术的用途了,那么怎么产生公共密钥和私有密钥呢?有很多的算法,其中比较有名的是RSA和DSA。
好了,现在我们就可以通过使用公共密钥加密技术的数字签名来彻底解决上面的问题了,我们还是用刚才的字母来举例
1) 你的朋友通过某种软件产生一对密钥(公共密钥和私有密钥)。
2)然后你的朋友和你联系,将他的公共密钥告诉你和其他的人。
3)通过产生的私有密钥对A加密,产生加密数据,这个加密的数据我们就称之为数字签名,我们用AS表示。
4)你的朋友将A和AS发送给你,如果发送过程中被窃取了,窃取者将A改为了 B,现在戏剧性的事情发生了,我们来看看这个窃取者怎么伪造数字签名?数字签名是用私有密钥来加密数据产生的,这个窃取者根本就没有你朋友的私有密钥,因为私有密钥没有在网络上传送。如果窃取者也通过一个软件产生了一对密钥,然后用他的私有密钥对B加密产生了新的签名BS,然后他将B和BS一起发送给你。
5)这时我们就能够完全判断出这个数据的真伪了。怎么办?很简单,我们用你朋友的公共密钥去解密数据?结果呢?不能解密?因为这个数据是用窃取者的私有密钥加密的,要解密当然得使用窃取者的公共密钥了。
6)如果A和AS没有被窃取,那么你用你朋友的公共密钥解密,应该是能够顺利解密的,如果不能解密,那么数据肯定是已经被修改了。
通过上面的说明大家应该知道,要想安全的传输数据,其实也并不是什么难的事情,所以我们应该大胆的去使用数字签名。
基于数字签名的应用还有很多,各种网上银行使用的数字证书,国家出台的电子签名等等。如果有机会后面给大家介绍。