对称加密算法 VS 非对称加密算法
对称加密算法(Symmetric-key algorithm)和非对称加密算法(asymmetric key encryption algorithm)只不过就是密码学(cryptography)中的两种加密算法罢了,什么是算法,你就可以理解成为是一种规则吧,这种规则可以将信息从一种形式转变成另一种形式,不懂没关系,继续往下看。
对称加密
首先,让我们先从一个情景开始讲起,想当初我们在初中,高中,甚至于大学,每次考试都有人在试图如何更加隐蔽的作弊!那大家都想了什么方法呢?比如张三学习比李四好,李四就想在考试的时候让张三“帮助”一下自己,当然,他们俩不可能像我们平常对话一样说,第一题选A,第二题选B等等,为什么?因为监考老师明白他俩在谈论什么,也就是说这种沟通交流方式属于“明文”,所以李四就想:“我需要发明一种,只有我和张三明白的交流方式”,那李四做了什么呢?恩,李四去找张三说:“当我连续咳嗽三声的时候你看我,然后如果我摸了下左耳朵,说明你可以开始给我传答案了,如果没反应,那说明我真的是在咳嗽。。。。”, 然后,怎么传答案呢?很简单,“你摸左耳朵代表A, 摸右耳朵代表B,左手放下代表C,右手放下代表D”,好了,这就是他们的“算法(规则)”,将信息的一种形式(A,B,C,D),这里我们称为“明文”,转换成了另一种形式(摸左耳朵,摸右耳朵,放左手,放右手),这里称为“密文”,经过这种转换,很显然监考老师不会明白这些“密文”,这样,张三和李四就通过“密文”的形式实现了信息的交换。
其实,密码学不就是为了人们更好的加密传输么?有很多学者,科学家成年累月的工作,为的就是改进或者发明更好的加密算法,让这些加密算法加密的文本难以破解,达到数据安全传输的目的。
OK,回归正题,上面这个“作弊”的例子,其实就是一种对称加密算法!好了,我们来看一下对称加密算法的定义(来源:wikipedia):
对称密钥加密(英语:Symmetric-key algorithm)又称为对称加密、私钥加密、共享密钥加密,是密码学中的一类加密算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。实务上,这组密钥成为在两个或多个成员间的共同秘密,以便维持专属的通讯联系。与公开密钥加密相比,要求双方取得相同的密钥是对称密钥加密的主要缺点之一
这里我想说一点的是,wikipedia的把Symmetric-key algorithm中文翻译是 对称密钥加密,我不想把这个key翻译成密钥,因为key仅仅是一个“钥”,这里翻译成密钥会让大家对后面所说的“公钥”,“密钥”,“私钥”等等的概念弄混,好了,所以我还是比较喜欢称之为“对称加密算法”,而后面说又称“私钥”加密,共享“密钥”,这里,“私钥”就等于“密钥”,没有任何区别,英文是“private key”。
ok,我们将定义结合我们前面的例子对应一下,“这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥”,其实在我们例子中,密钥就是“将(A,B,C,D)转换成(摸左耳朵,摸右耳朵,放左手,放右手)”这么一个规则。“实务上,这组密钥成为在两个或多个成员间的共同秘密,以便维持专属的通讯联系。” 这句话很好理解了吧,密钥是张三和李四间共同的秘密!只有他俩事先知道。
所以,为什么叫对称加密呢,你可以这么理解,一方通过密钥将信息加密后,把密文传给另一方,另一方通过这个相同的密钥将密文解密,转换成可以理解的明文。他们之间的关系如下:
明文 <->密钥<->密文
这样看,是不是感觉对称比较好理解了。ok,那么我们现在有哪些现成的对称加密算法可以用么?当然有:
常见的对称加密算法有DES、3DES、AES、Blowfish、IDEA、RC5、RC6。
想深入了解的同学,可以自行查阅资料了。
非对称加密
我们再来说说非对称加密,非对称加密是一种比对称加密更加优秀的加密算法,当然算法有利有弊,对称加密速度快但是安全性相对于非对称加密来说低,为什么呢,你想啊,要想使用对称加密,那么分享信息的各个个体之间都需要分享这个密钥,比如你们1000个人之间都使用同一个密钥进行密文传输,只要其中一个人密钥被盗窃了,那么整体加密的信息将都被破解了。好了,那么我们开始说说非对称加密。
就从上面提到的这个对称加密的缺点开始,怎么做到即时一个人的密钥被盗窃了,最起码保证你给其他人发送密文不被破解。于是,人们就想出了这么个办法,首先,我们停止分享共同的密钥,因为上面的bug就是来源于共享一个密钥,那么怎么办呢?每个人生成一个“私钥-公钥”对,这个私钥需要每个人自行进行保护!公钥可以随便分享,后面详细说,同时,生成的这个“私钥-公钥”对还有个强大的功能就是,使用私钥加密的信息,只能由该私钥对应的公钥才能解密,使用公钥加密的信息,只能由该公钥对应的私钥才能解密!
好了,比如说张三生成了他自己的一个“私钥-公钥”对,叫做“张三私钥-张三公钥”,李四生成了他自己的一个“私钥-公钥”对,叫做“李四私钥-李四公钥”,之前我们说过私钥要每个个体自己进行保存,公钥可以随便分享,目的是为什么呢?是为了加密信息!
比如,李四想给张三发送密文。
于是李四开始给张三发QQ
李四:“hi哥们,我想给你发个密文,把你的公钥给我发过来用用。”
张三:“没问题的,这是我的公钥: d#8yHE8eU#hb*!neb,用这个公钥加密你的信息后给我发过来吧”
李四:“这是我想对你说的话: *&#@uehuu(**#eehu&$##bfeu&&”
恩?你是不是有点疑问呢?咳咳,李四这是作死的节奏?为什么公开问公钥?不怕被网警查水表?哈哈,非对称解密算法的威力就在这里!无所谓!随便谁截取!我们上面说了,公钥可以随意分发,所以即使别人截取了,也只是知道该公钥而已,但是要是想解密使用该公钥加密的密文!只有一个人可以办得到!就是张三! 为什么?李四使用张三的公钥加密的信息,只有张三的公钥所对应的私钥,这里就是“张三私钥”,该私钥才可以解密!所以,没有张三私钥的第三方即时截取了这些密文,也破解不了!或者更严格的说在有限时间内比如说几千年内是暴力破解不出的!
懂了吧?所以网警们哭了,本以为想监视他们的对话,可惜一无所获!
我们来看看非对称加密的官方定义:
公开密钥加密(英语:public-key cryptography,又译为公开密钥加密),也称为非对称加密(asymmetric cryptography),一种密码学算法类型,在这种密码学方法中,需要一对密钥(其实这里密钥说法不好,就是“钥”),一个是私人密钥,另一个则是公开密钥。这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。称公开的密钥为公钥;不公开的密钥为私钥。
hmm。。这个定义有点绕,不过就是说,要想使用非对称加密算法,首先要有一对key,一个被称为private key私钥,一个成为public key公钥,然后可以把你的public key分发给想给你传密文的用户,然后用户使用该public key加密过得密文,只有使用你的private key才能解密,也就是说,只要你自己保存好你的private key,就能确保,别人想给你发的密文不被破解,所以你不用担心别人的密钥被盗,没关系。
正因为,这种加密是单向的,所以被称为非对称加密算法。
这种加密算法应用非常广泛,SSH, HTTPS, TLS,电子证书,电子签名,电子身份证等等。
这篇文章先写到这里,接下来我将像大家挨个介绍这些加密算法的应用,不过我在这里先埋个伏笔,上面我提到的李四和张三发qq,即时使用非对称加密算法,大家有没有发现仍然有哪些隐患呢?
给点提示,比如说,某个网警想知道到底李四要给张三发什么信息?网警想破解李四的密文,那么网警有什么办法可以获得李四要发的信息呢?很显然获得密文直接暴力破解是不可能的!
小提示,网警可以冒充张三!!!!发送给李四“网警的公钥”,而不是“张三的公钥”,那么当李四收到该公钥的时候,就不假思索的使用该公钥加密了他的信息,然后毫不犹豫的将加密的密文发了过去,然后网警得意的笑了。
OSI模型,TLS/SSL 及 HTTPS
上回我们白话了密码学中的两种算法,对称加密算法和非对称加密算法,我们有了这两种算法,我们就要将他们应用到实际生活中,就像我们学会了99乘法表,就可以让我们在实际生活中快速的计算啦!
所以本节课程的先决条件就是,看并掌握我之前白话的这篇文章:对称加密算法vs非对称加密算法。
我们先从互联网开始说起,说到互联网我们就不得不提一下计算机,因为计算机是互联网组成的一个很重要的部分,我们要想使用互联网进行交流就必须使用计算机(注意!我这里的“计算机”是一个统称,爱钻牛角尖的童鞋,不要说,除了计算机还有手机啊,ipad啊,智能手表啊!!!!恩,好了,别闹了)。
然后问题来了,要想形成互联网,计算机和计算机之间就必须相连起来(废话!),于是我们就有了“网线”,当然这里的“网线”也是泛指,因为现在大家家里都用的是无线网!不过无论有线网还是无线网,他们都是通过“物理”途径进行传播信号的!有了这些“联系”,我们计算机和计算机之间有了传递信息的“途径”了,但是!这里仅仅是提供了一个途径,但是如果想让计算机之间彼此了解传输的信息,那么我们必须定义一系列的协议,这些协议是计算机之间都能够明白的,同时发送和接受要严格按照协议去做!就像张三是中国人和王石头是印度人,他们俩要想交流,就要先建立一个途径,无论是加qq还是发邮件,同时他们俩还得说一样的话,不能张三说中国话,王石头说印度话。
所以,这就是好多互联网协议的来历,比如IPv4, IPv6, TCP,UDP,HTTP,FTP,SMTP,TLS/SSL,HTTPS等等。
那么我们再来想一下,比如,张三想通过QQ发送给李四一句“踢球去不?”,那么谁来将我们发出去的信息转换成协议规定的形式呢?QQ这个软件?操作系统?网卡?路由器?网线?还是我们的ISP(网络服务提供商,你可以理解成电信,移动,网通等等)。
其实,这些都会涉及到,所以即使你简简单单的发送一句“踢球去不?”需要涉及到这么多内容,所以,这里要引入一个模型,叫做OSI模型,全称“开放式系统互联通信参考模型”(英语:Open System Interconnection Reference Model)。
这个模型是干嘛的呢?就是将计算机和计算机之间信息交换“概念化”成不同的层次,每层分别有它自己的“实现”,每层有它自己的任务,同时“向上”提供“抽象”的“接口”供上层使用。一般分成7层或者5层。为了简便期间我这里按照5层架构说一下,这五层分别是:
- 应用层(application layer)
- 传输层(transport layer)
- 网络层(network layer)
- 数据链路层(data link layer)
- 物理层(physical layer)
回到我们的例子,当张三用QQ向李四发送一条信息时,首先QQ属于应用层,应用层需要将信息发送给传输层,传输层经过处理之后传给网络层,以此类推传给物理层,这样一层层向下“包装”,每层有对应的协议,这样最后通过物理层传出去,传到李四的物理层,然后李四那边通过一层层向上按照协议“解包”,最后到应用层,传到李四的qq里。
所以每层都有相对应的协议比如我们的物理层和数据链路层通过无线网传输使用的802.2传输协议,有线网的Ethernet(以太网)传输协议,还有网络层的IPv4, IPv6协议,传输层的TCP, UDP协议,而我们熟悉的HTTP协议其实属于应用层,所以HTTP是建立在TCP/IPv4或v6/以太网基础上进一步细化用于传输“超文本”信息的协议,比如FTP也属于应用层,也是在下面各层协议基础上进行细化,专门用于“文件传输”的协议。
大家可以看到,协议越往上越具体,越往下约抽象,其实计算机技术的发展就是一层层的向上抽象,这样上层的可以直接使用下层的“成果”(API)!
我们再来说一下TLS/SSL,SSL(secure sockets layer)是TLS(transport layer security)的前身,为什么将他们合起来的,大家可以理解成都属于同一东西的不同阶段吧,比如该协议之前叫SSL后来改名成TLS了。
为什么要有这种协议呢?因为HTTP是使用明文传输,随着网络的发展,安全性越来越重要,所以大家就要想办法让传输更加安全,同时使用密码学的成果,利用“非对称加密算法”的思想以及OSI模型,来对HTTP的信息进行加密。
因为上面我们说了,根据OSI模型,如果向外传输信息就是要从上到下挨个层进行,TLS/SSL也是位于应用层,所以为了加密HTTP的内容,那么TLS/SSL必须位于HTTP下面,可以看成这样:
HTTP
TLS/SSL
TCP
Ip
..
信息从HTTP经过TLS/SSL非对称加密后传出去,而在接收方,接收到信息是需要一层层向上进行,经过每层的“解包/解密”,最终通过HTTP转换成超文本信息。
所以HTTPS 就是 “HTTP内容向下传输的时候加了一层TLS/SSL加密”,仅此而已,这样,我们就可以实现,使用HTTP协议进行互联网信息传播的时候,对信息进行加密处理了,相信大家已经对非对称加密算法有一定了解了。比如说我们通过HTTPS连接某银行网站,这样我们就可以将我们的密码通过银行给我们的公钥进行加密后发送给银行,而避免了在传输过程中被他人偷看的可能,因为即使他们讲我们的密文盗走,也无法解密,只有银行网站可以解密,为什么?因为只有银行拥有与我们使用“公钥”加密相对的那个“私钥”。
但是同样的问题,就是我们怎么知道我们使用的公钥就是银行给我们的呢?即使我们所访问的域名和银行的域名一致,因为黑客完全可以通过修改我们本地的hosts文件,或者入侵dns,将域名映射到黑客的服务器。
所以,这就是CA(certificate authority),数字证书,数字签名,公钥基础设施(PKI)等等名词的来历。
电子签名,电子证书,根证书,HTTPS,PKI 到底是什么
上回我白话了一下:“对称加密”和“非对称加密”的来龙去脉,收到了不错的反馈,今天接着上一次白话留下的伏笔,说一说“对称加密”和“非对称加密”的实际应用:电子签名(digital signature),电子证书(digital certificate)的来历。
因为“对称加密”以及“非对称加密”是两种不同的“技术”,“技术“嘛,研究出来要“应用”到实际生活中的,当然同一种技术的“应用场景”可以是千差万别的,正如有人发明了“充气轮胎”,然后被运用在了汽车上,飞机上还有自行车上。电子签名和电子证书就是“应用”(正如汽车,飞机,自行车),但是它们的诞生离不开“对称加密”和“非对称加密”这些底层技术(充气轮胎),同样,对于你来说,如果你想明白我接下来白话的“电子签名”和“电子证书”这些“应用”,你需要先读懂我之前白话的“技术”《白话解释 对称加密算法 VS 非对称加密算法》。
========
电子签名 和 电子证书
ok,上回我们说到,李四给张三发消息,先拿到“张三的公钥”,然后使用张三的公钥加密自己的信息,然后把加密后的密文发送给张三,这样可以保证发送的密文只能被“李四得到的公钥”所对应的“密钥”解密(没有黑客的情况下,也就是张三的密钥)。细心地同学可能发现了,我上面对“张三的公钥”加了引号!!!
为什么???因为李四怎么确认他收到的“公钥”就是张三本人的呢?为了更好地继续白话,咱们这里做一个很大胆的假设,比如黑客小刘正在监听李四和张三的对话,我们也假设黑客小刘可以轻易的修改中间传输的信息。那么如果你是李四,你想一下怎么才能把“机密信息”安全的传送给张三?
好,我们分析一下,为了能把“机密信息”安全的传给张三,李四需要:
1,加密的密文不能被破解,更严谨说,是不能被“轻易”破解(因为黑客小刘能截获任何对话)
2,我们用来加密的“公钥”必须确实来在于“张三”本人(不然如果用了黑客小刘的公钥,那么即使李四加密了信息,也会被小刘秒破解)
至于第一点,非对称加密已经替我们解决了密文不会被轻易破解的问题,那么我们现在只要确定所得到的公钥是来自于“张三”本人就可以放心大胆的加密信息,并且发送加密后的密文啦!
那么李四怎么确定“公钥”确实来自于张三本人呢?好办!
张三:四儿,接好了,这是我的公钥:fewfeef#¥#@#@#R###。
李四:三哥,别急嘛,12345?
张三:上山打老虎!
李四:欧了,这是我想对你说的话:$IJ4#(##(#(!
张三:好,讲究!
也就是说李四为了确认张三是不是张三本人,李四先和张三对了一下“暗号”,如果暗号不对,李四就不相信发过来的公钥。
“我怎么感觉哪里有点不对呢?”,嗯,我也觉得哪里不对,因为上面说,黑客小刘正在监听李四和张三的对话,这么明显的,弱智的,坑爹坑队友的暗号,黑客小刘立马就怒了:“把老子当白痴么?!这点小伎俩我都看不出?!”,于是,黑客小刘就学会了这个暗号,当下次李四再想对暗号的时候,黑客小刘可以截断张三和李四的信号,假装是张三:
黑客小刘:四儿,上次那个公钥我不用了,这是我的新公钥:#¥#@#3@223#53R2#5##。
李四:哦.......12345?
黑客小刘:哎,你还不相信你三哥?上山打老虎!
李四:哈哈,三哥你看看这个计划如何?2g3n&&$@#(#@)
黑客小刘:很好(邪恶的笑)
李四:...
这样的话,李四还是被骗了,hmmm,那怎么办呢?李四想了一招,于是有了下面的对话:
黑客小刘:四儿,最近有什么新计划没?。 李四:没。。。有。。。。 黑客小刘:没有?我是你三哥,你说吧。 李四:那你先把你的证书给我看看? 黑客小刘:....神马证...书..?上山打老虎! --- 李四已下线 ---
哈哈,原来,李四自从上次被坑了之后私下里去找了一个叫“王五”的大哥,想寻求帮助,王五说这个事不难,王五对李四说:“如果你相信我,那么我就来作证人证明张三是张三”。
李四说:“那没问题,那你怎么证明张三是他本人?”。
“我可以给张三颁发一个证书!只要他给你看到这个证书,你就相信他是张三”,王五说。
李四思考了片刻又问道:“那我怎么证明这个证书不是伪造的呢?”
王五说:“因为我可以给你一个神器,这个神器能够让你分辨这个证书确实是我颁发的!”。
“哇!这么吊!那快给我!”,李四渴望的眼神中又闪烁着对王五的崇拜!
其实,这个神奇呢,很简单,你想到了吗?嗯,于是,王五就把这个神器交给了李四,这个神器是:“
王五的公钥
”
!。
哈哈哈哈哈哈。。。
“王五的公钥”!
“王五的公钥”!
“王五的公钥”!
明白了么?明白了么?明白了么?重要的事情说三遍。
来,我们先来整理一下整个过程,李四苦恼于无法分辨出张三是不是他本人,于是去求助于“王五”大哥,希望王五大哥能够帮助证明“张三”是张三,然后王五大哥找到张三,亲自拿到了张三的公钥,检查完毕之后,准备了一份证书,同时签上了自己的”王五“大名,交给了张三,从此以后张三再和李四聊天的时候,就可以出示自己的“证书”,证明他是张三本人了。
其实到这里,整个过程和现实生活中的“公证”过程类似,比如你辛苦努力的学习,终于得到了自己的大学毕业证,但是在现实生活中也有很多投机分子通过非法机构办假证,这样对像你一样努力学习的同学就不公平,所以用人单位为了证明你给他们的毕业证确实是你的,他们怎么办呢?他们要求你去“公证处”去公证一下你的毕业证!公证处这里就是大哥“王五”的角色,用人单位很信任“公证处”,所以只要你拿着“公证处”公证好的文件,用人单位(李四)也就相信了,这个毕业证(公钥)确实是你的。
等一下,公证处的“公证文书”也可以造假啊。
我。。。。
嗯,是的,我还没说完,上面王五给李四说了:
“因为我可以给你一个神器,这个神器能够让你分辨这个证书确实是我颁发的!”。
我们也知道了,这个神器就是王五的一个公钥,那么怎么才能做到证书没有被修改或者伪造呢?
原来,王五的签名不是普通的签名,也不是像公证处那种普通的盖章,而是“电子签名”!因为王五他也有自己的一对“私/公钥”,所以他把张三的“个人信息”以及“公钥信息”用他的私钥加密成“密文”,把这个密文当做“电子签名”签在了证书上,然后这个证书就被称为“电子证书”,最后再把自己的公钥送给了李四,那么李四收到张三给的证书之后,就可以利用王五给的公钥进行解密证书上面的签名,因为证书上的签名是用王五私钥加的密,所以相应的,也只能用王五的公钥进行解密,李四最后将解密出来的公钥信息和收到的公钥信息进行比对,如果信息一致,就证明了两个问题:
- 张三确实是张三
- 张三的公钥确实来自张三且没被修改过
最后的最后,因为在这里“王五”的神器(公钥)太关键,它能够决定其他人的证书是否真实有效,所以我们把“王五”的公钥叫做“
根证书
”
!
ok,问题顺利解决!
公开密钥基础建设 PKI
上概念时间。。
公开密钥基础建设(英语:Public Key Infrastructure,缩写:PKI),又称公开密钥基础架构、公钥基础建设、公钥基础设施、公开密码匙基础建设或公钥基础架构,是一组由硬件、软件、参与者、管理政策与流程组成的基础架构,其目的在于创造、管理、分配、使用、存储以及撤销数字证书。
密码学上,公开密钥基础建设借着数字证书认证机构(CA)将用户的个人身份跟公开密钥链接在一起。对每个证书中心用户的身份必须是唯一的。链接关系通过注册和发布过程创建,取决于担保级别,链接关系可能由CA的各种软件或在人为监督下完成。PKI的确定链接关系的这一角色称为注册管理中心(Registration Authority,RA)。RA确保公开密钥和个人身份链接,可以防抵赖。
简单来说,PKI就是利用非对称加密技术为开展安全信息交换提供了一种系统和规范。同时,为了整个系统能运转,一些“特别”的机构也是需要作为“值得信任的第三方”来接受个人或公司提交的“认证申请”。
registration authority (RA), 注册机构,负责接受来自个人和公司的“认证申请”,RA负责审核证书申请者的真实身份,审核通过之后,将申请送给 certificate authority (CA)证书机构,CA将对这些申请签名,并颁发给申请者电子证书,然后申请者得到这些证书之后可以比如:安装在服务器上。
CA机构比如有:digicert,verisign
HTTPS 实例分析
上面我们说到了PKI,我们来看一个具体的例子,以便让大家更直观的理解,我们就拿segmentfault为例。
我们可以看到这里显示sf安装了证书,并且显示是valid
,证明:
-
sf是sf,我没有被劫持到其他站点
-
我和sf之前的通信是加密的,安全的,其他人窃取不到
那么浏览器是怎么验证的sf的证书的呢?还记得上面我提了一句“根证书”么?因为一般我们去申请证书都是通过CA机构,同时大家都信任CA机构比如digicert,verisign,那么我们就可以事先将这些CA机构的“神器”安装到我们的电脑上,也就是这些CA机构的"公钥",我们也称它们为“
根证书
”
。这些根证书是预先安装在我们电脑上的,所以每当我们访问segmentfault的时候,如果segmentfault服务器上安装了证书,他想和我们建立安全通信,就好比上面例子中,张三直接把公钥发给李四一样,在这里:
segmentfault说:“hi,我们建立安全通信吧,这是我的公钥”
你的浏览器:“你怎么证明你的公钥是你的呢?”
segmentfault说:“这是我的证书,请查看”
然后segmentfault就把安装在服务器上的证书传给你的浏览器,因为你的浏览器已经有一些神器“根证书”的存在,所以这些根证书(CA机构的公钥)就可以来“解密”sf发过来的证书上的签名,然后对比一下解密后的信息和sf证书中所呈现的信息是否一致,如果一致,就ok拉!
最后上一个截图:
大家注意,最上面“DigiCert Global Root CA”,说明我们使用digicert这个CA组织的根证书来进行认证sf的证书,然后digicert替我们证明了sf证书的合理性:“This certificate is valid",同时给我列出来证书中的一些详细信息,比如:证书的持有者,证书的过期时间,证书中所携带的“公钥”信息(用来验证你得到的公钥确实是sf的),然后还有其他一些信息,感兴趣的同学可以深究一下了!