网络安全(2)-数据加解密
之前讲了身份认证,身份认证可以让我们确认收到的数据来自正确的发送者。但是传送的数据在经过中间节点的时候(或者在无线信道下并不需要经过中间节点,只要能够收到信号)可能会被偷听者收到,我们并不能阻止数据包被偷听者获取,因为数据包在在网线上或无线信道上传输,任何人都有可能通过信号接收设备获取传输的模拟信号,从而进一步解析得到以太网帧(或其他链路层协议帧)、IP报文、UDP/TCP报文、应用层数据....
我们能做的就是让偷听者即使获取了我们传输的数据,也无法知道我们传的到底是什么,即对数据进行加密。
数据加解密
数据加解密算法分为两类:对称性加解密和非对称性加解密,前者如AES,DES,后者如RSA。
对称性加解密
对称性加解密的加密和解密相同的密钥,且能通过加密算法推导出解密算法,或者通过解密算法推导出加密算法。这种做法加解密速度快,适合于对大量数据进行加解密,但密钥管理困难(防止偷听者获取密钥和加解密算法)。
比如一个简单的对称性加解密可以为:加密时将数据每个字节都加3,解密时将每个字节都减3.3就可以视为一个密钥,加减操作视为加解密算法。
对称性加解密不安全,原因在于A和B之间要通过对称性加解密算法来进行加解密,他们就必须使用相同的算法以及密钥,而算法和密钥的协商也是需要传输数据包进行协商,协商的数据包被偷听者获取之后,偷听者就获取了加解密算法和密钥,从而在收到A或者B的数据之后可以对数据进行解密,当然也可以用加密算法加密自己的数据传给A或者B。
非对称性加解密
非对称性加解密需要两个密钥,公钥和私钥,使用公钥加密的数据只能用私钥解密,使用私钥加密的数据只能用公钥解密。
A若想和B通信,A可以先生成一个公钥和私钥,然后将公钥发送给B,B通过公钥加密数据,然后发送给A,A通过私钥解密获得数据;而如果中间有C偷窥了B发送的数据,但是C没有A的私钥无法解密。同样,B生成一对公钥和私钥,公钥发送给A,A用公钥加密数据发送给B,B收到数据后用私钥解密,中间数据被C窃取,C也无法解密。
非对称性加解密相比于对称性加解密安全,因为密钥非对称,公钥随便公开,只要私钥不在网络上传输,别人即使获得公钥,窃取了加密后的数据,也无法解密。但是,非对称加解密的算法复杂度较高,对于实时性的数据加密压力较大。所以一般使用的数据加解密方法是,使用非对称性加解密方法传输对称性加解密算法的密钥,传输数据时,用对称性加解密方法加解密。
常见的非对称性加密算法如RSA算法,RSA是三个人共同提出的,所以以三个人的姓氏首字母命名。它是基于大数的因式分解的数学难题而提出的,对一个大数进行因式分解,其复杂度相当高。
RSA加密算法的原理见:RSA算法原理1, RSA算法原理2
SSH 加密原理
SSH安全协议是一种非对称加密和对称加密算法的结合。
1、首先服务端会通过非对称加密,产生一个公钥和一个私钥
2、在客户端发起请求时,服务端将公钥暴露给客户端,这个公钥可以被任意暴露
3、客户端在获取公钥之后,会先产生一个由256位随机数字组成的会话密钥,称为口令
4、客户端通过公钥将这个口令加密,发送给服务器端
5、服务器端通过私钥进行解密,获取到通讯口令
6、之后客户端和服务端的信息传递,都使用这个口令进行对称的加密
密钥交换算法
如果要进行对称性加解密,通信双方需要使用相同的加解密算法和密钥,那么双方如何协商他们使用的密钥呢?一种方式是双方使用RSA等非对称性加密算法进行密钥的交换,还有一些其他的密钥交换算法,比如DH密钥交换算法:
DH密钥交换算法是基于计算离散对数的难度(对于RSA算法是基于大数的因式分解的难度).
离散对数的概念:
原根:如果a是素数p的一个原根,那么数值:
a mod p,a^2 mod p,…,a^(p-1) mod p
是各不相同的整数,且以某种排列方式组成了从1到p-1的所有整数。
离散对数:如果对于一个整数b和素数p的一个原根a,可以找到一个唯一的指数 i,使得:
b =(a的i次方) mod p 其中0 ≦ i ≦ p-1
那么指数i称为b的以a为基数的模p的离散对数。
Diffie-Hellman 算法的有效性依赖于计算离散对数的难度,其含义是:当已知大素数p和它的一个原根a后,对给定的 b,要计算 i ,被认为是很困难的,而给定 i 计算b 却相对容易。
Diffie-Hellman算法:
假如用户A和用户B希望交换一个密钥。
取素数p和整数a,a是p的一个原根,公开a和p。
A选择随机数XA< p, 并计算 YA=a^XA mod p。
B选择随机数XB< p,并计算 YB=a^XB mod p。
每一方都将X保密而将Y公开让另一方得到。
A计算密钥的方式是:K=(YB) ^XA mod p
B计算密钥的方式是:K=(YA) ^XB mod p
证明:
(YB)^ XA mod p = (a^XB mod p)^ XA mod p
= (a^XB)^ XA mod p = (a^XA) ^XB mod p (<-- 密钥即为 a^(XA*XB) mod p)
=(a^XA mod p)^ XB mod p= (YA) ^XB mod p
由于XA和XB是保密的,而第三方只有p、a、YB、YA可以利用,只有通过取离散对数来确定密钥,但对于大的素数p,计算离散对数是十分困难的。