以前讲了身份认证,身份认证可让咱们确认收到的数据来自正确的发送者。可是传送的数据在通过中间节点的时候(或者在无线信道下并不须要通过中间节点,只要可以收到信号)可能会被偷听者收到,咱们并不能阻止数据包被偷听者获取,由于数据包在在网线上或无线信道上传输,任何人都有可能经过信号接收设备获取传输的模拟信号,从而进一步解析获得以太网帧(或其余链路层协议帧)、IP报文、UDP/TCP报文、应用层数据....
咱们能作的就是让偷听者即便获取了咱们传输的数据,也没法知道咱们传的究竟是什么,即对数据进行加密。html
数据加解密算法分为两类:对称性加解密和非对称性加解密,前者如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安全协议是一种非对称加密和对称加密算法的结合。
一、首先服务端会经过非对称加密,产生一个公钥和一个私钥
二、在客户端发起请求时,服务端将公钥暴露给客户端,这个公钥能够被任意暴露
三、客户端在获取公钥以后,会先产生一个由256位随机数字组成的会话密钥,称为口令
四、客户端经过公钥将这个口令加密,发送给服务器端
五、服务器端经过私钥进行解密,获取到通信口令
六、以后客户端和服务端的信息传递,都使用这个口令进行对称的加密网络
若是要进行对称性加解密,通讯双方须要使用相同的加解密算法和密钥,那么双方如何协商他们使用的密钥呢?一种方式是双方使用RSA等非对称性加密算法进行密钥的交换,还有一些其余的密钥交换算法,好比DH密钥交换算法:
DH密钥交换算法是基于计算离散对数的难度(对于RSA算法是基于大数的因式分解的难度).ssh
离散对数的概念:
原根:若是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,计算离散对数是十分困难的。加密