加密算法在计算机体系中运用得很广泛, 你可能很经常听到单向加密算法,私钥,公钥之类的名称,但是并不清楚之间的关系以及为什么会有这些加密算法,那么这篇文章可以帮助你找到答案.
加密算法的作用一般都是为了解决通信过程中出现的三个问题 :
身份验证
数据完整性校验
数据机密性
我们之后所讲的所有加密算法, 都是围绕着这三个问题展开的.
单向加密算法
这种加密算法有两个特点 :
加密过程不可逆.即明文通过加密生成密文,但是无法通过密文推算出明文
不同的数据加密出来的结果肯定不一样,不存在不同的数据加密之后生成同样的密文.
定长输出.即不管对多大的数据进行加密,加密之后的结果肯定是定长的.
根据上面的前两个特性,我们可以利用单向加密算法可以用来保证数据完整性.
我们假设 :
A要发送一段数据给B,在发送的过程中可能会被C截取,C截取并修改数据之后发送给B,这种攻击称为中间人攻击.为了保证数据在通信过程中不被篡改,A使用单向加密算法对数据进行加密,然后生成的密文我们称为特征码,把特征码附加在数据之后,一起发送给B.这样子C即使截取修改了数据再发送给B.B只要把数据重新加密生成特征码,跟附加在数据之后的特征码进行比较,就可以知道数据被中间人修改过了.
典型的加密算法有MD5,SHA1等等.在网上下载东西的时候会听过MD5校验,就是利用了单向加密算法的特性.下载的软件旁边会附带一串MD5值,下载完成后可以对下载的软件进行MD5计算,然后比较附带的MD5值,来保证软件没有被篡改.
对称加密算法
接着上面的假设,即使A对B发送的数据进行了加密,但是C可以截取数据,修改之后重新计算特征码,然后把新的特征码附带在修改之后的数据发送给B,这个时候B即使校验了数据也没办法保证数据没有被篡改,因为特征码是新生成的.这里引出了一个新的问题:B如何保证这个数据就就是A发来的,即身份证验证的问题.
对称加密算法就是为了解决这个问题,对称加密算法要求AB之间共有一个相同的秘钥.在加密的时候流程如下:
明文和秘钥一起进行加密之后生成密文.
密文和秘钥一起进行加密之后重新生成明文.
现在AB之间通信变成了下面的流程
AB通信之前交换秘钥
A要发送数据给B之前,先对数据进行单向算法加密生成特征码,然后使用对称加密算法对特征码和秘钥进行对称加密,把加密之后的密文附加在数据之后发送给B
B拿到数据之后,提取附加在数据之后的密文,使用对称加密算法把密文和秘钥再次加密,重新生成明文,这里的明文就是特征码,然后对数据提取特征码,比较两个特征码保证数据完整性.
上面的步骤解决了两个问题,即数据完整性和身份验证.这样子C即使修改数据重新生成特征码,但是他没有办法使用AB之间的秘钥来加密特征码.
回顾AB之间的通信流程,AB在传递数据之前如何要换秘钥?交换秘钥也需要AB互相通信,在交换秘钥的时候有可能被C获取.有一个算法Diffie-Hellman
算法,这个算法可以保证AB之间交换秘钥不被第三方获取.这个算法是基于离散对数原理.我们不关心算法原理,这里简单说明下算法实现流程
AB之间互相协商生成一个随机的大素数p和一个生成数g.
AB两个各自分别生成一个随机数x,y
A向B发送
g^x%p
的值,B向A发送g^y%p
的值
到这里,有可能被第三方获取的数据有:p, g, g^x%p, g^y%p
.但是由于离散对数原理,即使第三方知道这些值也没办法推算出x,y的值.
最后一步 :
A执行
g^y%p^x
,B执行g^x%p^y
.
可以发现g^y%p^x = g^xy%p = g^x%p^y
.至此AB之间把执行算式得到相同的结果,这个值就可以当做AB之间的秘钥.
Diffie-Hellman算法可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容 ---- 维基百科
我们可以发现, 交换秘钥的核心就在于Diffie-Hellman
算法.这个算法可以保证AB在没有通信过得情况下,互相交换秘钥.当AB之间有了相同的秘钥之后,AB之间就可以通过秘钥进行身份验证.但是,仍然有一个问题,AB之间第一次互相协商生成p, g的时候,C假冒A或者B跟对方进行秘钥交换.C还是会得到数据,AB之间通信之前交换秘钥 就是为了身份验证,但是秘钥交换过程中还是没办法保证对方的身份.我们陷入了一个循环.而且对称加密还有一个问题在于:当A跟多个人之间进行通信的时候,得维护多份秘钥.得投入大量精力.
非对称加密.
非对称加密秘钥分为公钥和私钥.一般,公钥是从私钥中提取出来的,所以私钥一般都会很长(1024,2048字节等等).用公钥加密的数据只能用与之对应的私钥解密,反之亦然.如其名称,公钥一般都是公开出去的,每个人都可以获取A的公钥,但是A的私钥只有A拥有.使用非对称加密之后,AB之间的通信变成了下面的样子 :
A对要发送的数据提取特征码,然后使用自己的私钥对数据进行加密.把加密之后的结果附带在数据之后,发送给B
B拿到数据之后,使用A的公钥解密得到特征码,然后对数据提取特征码.两个特征码比较可以验证.
上面的步骤下来,C截取并且篡改数据,并且C也可以使用A的公钥解密获取特征码,但是C修改数据之后重新生成特征码,但是只能使用自己的私钥加密,B获取数据之后,使用A的公钥没办法解密用C的私钥加密的数据,由此说明数据被篡改.至此,数据完整性和身份验证这两个问题可以解决,但是数据还是会被其他人看到,使用上面的方法没有办法保证数据的机密性.
你可能会想到,A可以把数据用B的公钥加密之后再发送,这样子只有B的私钥可以解密数据,这样可以保证数据机密性,这个方法可行.但是有一个问题:用公钥加密数据太慢!.所以加密数据一般还是使用对称加密算法,但是有一点不同的是,AB之间不用再通信之前交换秘钥.
A对要发送的数据提取特征码,然后使用自己的私钥加密特征码.
A随机生成一个秘钥,用这个秘钥使用对称加密算法加密所有的数据.然后使用B的公钥加密这个随机秘钥,最后把加密数据和加密之后的随机秘钥发送给B
-
B得到数据之后,使用自己的私钥机密得到随机秘钥,然后使用对称加密算法解密数据,这个时候解密出来的数据包含两个内容 :
A要发送给B的数据
A用自己私钥加密特征码之后的密文
B用A的公钥解密得到特征码,然后对数据提取特征码,比较两个特征码.
以上的流程就是现在通信中加密解密的通用流程.根据上面的分析我们可以得出以下结论 :
使用自己的私钥加密数据可以用作数字签名,以保证数据发送者的身份和数据的完整性.
使用对称加密算法可以保证数据的机密性.
CA机构
我们再次回顾AB之间的通信过程,AB之间能够互相通信保证数据不被泄露都是基于AB拥有对方的公钥,但是在第一次通信的时候AB之间去哪里获取对方的公钥,并且怎么保证自己获取到的公钥就是对方的公钥,而不是被人冒名顶替的?
你会发现,加密解密这事,从我们最开始分析到现在无论出现什么厉害的算法技术,都没有办法保证第一次通信时候的身份校验问题.所以,解决主机获取到对方的公钥没有被人冒名顶替只能靠一个权威机构,即CA机构.这个机构对全球网站的公钥进行认证,CA机构说这个公钥是淘宝网的,那么你就可以相信这个公钥是淘宝网的.所以CA机构必须具有权威性.
那么CA机构处理的任务类似下面:
服务商(比如淘宝)向CA机构请求为自己的公钥做认证,CA机构会把淘宝的公钥跟淘宝的一些信息一起,使用CA的私钥加密,生成一个数字证书.
用户在访问淘宝网的时候,淘宝服务器发送数据给用户的时候,会把数字证书附带在数据后面,用户收到之后,使用CA的公钥解密数字证书,就可以得到淘宝的公钥.进而使用淘宝的公钥来验证数据的完整性和进行身份验证.
上面的过程存在一个疑问:
我们哪里去获取CA机构的公钥
一般,我们浏览器或者操作系统都会内置一些可以信赖的CA机构的证书,即公钥.比如Chrome可以通过设置查看到信任机构的证书.
如果一个网站使用了不受信任的证书,那么浏览器就会警告不要访问这些网站.因为这些网站有可能是他人假冒的.
当然CA机构颁发证书并不是免费的,权威性越高的机构其证书就越贵.但是你发现,你使用计算机跟网站进行加密通信,但是你好像并没有购买证书?这是因为一般而言,作为用户并不需要向服务器验证身份.举例而言,你需要保证你访问的网站就是淘宝网,那么淘宝需要购买CA证书,但是你访问淘宝使用的主机并不需要向淘宝进行身份校验.只是访问者(你)需要向淘宝进行身份校验.而你向淘宝进行身份校验使用的是账户和密码.....
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。