对称加密算法  对称加密:加密和解密使用同一个密钥DES:(Data Encryption Standard),des,56bits 3DES: AES:Advanced (128, 192, 256bits) Blowfish,Twofish IDEA,RC6,CAST5 (目前主流的对称加密) 特性: 1、加密、解密使用同一个密钥,效率高 2、将原始数据分割成固定大小的块,逐个进行加密  缺陷: 1、密钥过多 2、密钥分发 3、数据来源无法确认

非对称加密算法  公钥加密:密钥是成对出现  公钥:公开给所有人;public key  私钥:自己留存,必须保证其私密性;secret key  特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然  功能:  数字签名:主要在于让接收方确认发送方身份  对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方  数据加密:适合加密较小数据  缺点:密钥长,加密解密效率低下  算法: RSA(加密,数字签名) DSA(数字签名) ELGamal 非对称加密:基于一对公钥/密钥对,用密钥对中的一个加密,另一个解密来实现加密: 接收者:生成公钥/密钥对:P和S 公开公钥P,保密密钥S 发送者:使用接收者的公钥来加密消息M 将P(M)发送给接收者 接收者:使用密钥S来解密:M=S(P(M))

非对称加密:实现数字签名: 发送者:生成公钥/密钥对:P和S 公开公钥P,保密密钥S 使用密钥S来加密消息M 发送给接收者S(M) 接收者:使用发送者的公钥来解密M=P(S(M)),结合签名和加密,分离签名。

实际生产环境中,因为非对称加密需要的时间过长,我们使用组合方式来加密解密数据: 1 使用对称秘钥(key)来加密数据(date),即key(date) 2 但是这样做,要保证对方能接收到这个秘钥才可以,所以我们再用对方的公钥(pb)来加密这个秘钥,附加在这个数据后面,即key(date)+pb(key) 3 接下来为了确定数据传送人,我们在数据后面,补上一个发送者用私钥做的签名,即sa(date) 4 整个发送包从单一的date,变为了key(date+sa(date))+pb(key)

那么解密过程为,接收端使用自己的私钥来解开pb+(key)拿到对称秘钥key,再使用对称秘钥key来解开发送端的加密数据:key(date) 然后用发送端的公钥解开sa(date),将两份date互相对比,若无差异,就可以认为数据是由发送端发送过来的。

缺点:需要传送2份数据,比较费事。 单向散列(哈希算法)  将任意数据缩小成固定大小的“指纹”(一大堆随机字符),其特征为: 1 任意长度输入,固定长度输出 2 若修改数据,指纹也会改变(哪怕是一丁点的改变,也会导致生成的指纹差生巨大的差异。) 3 无法从指纹中重新生成数据(“单向”),即不能从随机生成的字符,来逆向还原加密文件的内容。 功能:数据完整性  常见算式 md5: 128bits、sha1: 160bits、sha224、sha256、sha384、sha512

md5生成的是128位二进制的哈希运算。它对一个数据做哈希运算,得出的哈希数据叫做摘要,只要数据一样,那么哈希数据也绝对一样。

通常用这个方式,来确认发送者的身份。举例:我们从一个centos系统网站上下载一个centos系统,从互联网给出的哈希数据与,我们下载后用哈希计算后的数据做对比,如果一样,则系统并没有发生变化。

常用工具
md5sum | sha1sum [ --check ] file
openssl、gpg
rpm -V+指定程序   

有了哈希运算,非对称的数字签名也大为改善:公式 key(date+sa(date))+pb(key)可以变为 key(date+sa(haxi(date)))+pb(key)了。 那么解密过程为,接收端使用自己的私钥来解开pb+(key)拿到对称秘钥key,再使用对称秘钥key来解开发送端的加密数据:key(date) 然后用发送端的公钥解开,私钥加密的哈希数据sa(haxi(date)),使用哈希来计算加密的数据key(date),将生成的哈希数据与解密得到的哈希数据haxi(date)做对比,若无差异,就可以认为数据是由发送端发送过来的。 由校对2分数据改为了校对2个哈希值,在安全性能不变的情况下,效率大幅提升。

密钥交换:IKE( Internet Key Exchange ) 第一种:公钥加密(上边例子已讲)

第二种:DH (Deffie-Hellman):生成会话密钥.DH举例:

1 A: g,p 协商生成公开的整数g, 大素数p(只能被自己或1整除的数,叫做质数,质数也就是素数,比如1,3,7,13,17等等。) 假设生成的整数g为5,大素数p为23.

2 B: g,p同样生成整数g和大素数p 因为是协商,故A和B的值都一样,即g为5,大素数p为23.

3 A:生成隐私数据:a (a<p ),计算得出g^a%p,发送给B 隐私数据a的值是小于p的,并且进行计算,用g的a次平方,去取余p,设a的值为4,则计算结果为: 5^4%23,得出结果为:4,将这个数字发给B

4 B:生成隐私数据:b,计算得出g^b%p,发送给A 隐私数据b的值是小于p的,并且进行计算,用g的a次平方,去取余p,设b的值为3,则计算结果为: 5^3%23,得出结果为:10, 将这个数字发给A

5 A:计算得出 [(g^b%p)^a] %p = g^ab%p,生成为密钥 [(5^3%23)^4]%23=10^4%23=18,5^12%23=18 将18作为对称秘钥

6 B:计算得出 [(g^a%p)^b] %p = g^ab%p,生成为密钥 [(5^4%23)^3]%23=4^3%23=18,5^12%23=18 将18作为对称秘钥 18就作为A和B双方的对称秘钥来使用. 由惠特菲尔德•迪菲(Bailey Whitfield Diffie)和马丁•赫尔曼(Martin Edward Hellman)在1976年发表,参考:https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange

应用程序:RPM  文件完整性的两种实施方式  第一种:被安装的文件,分为 MD5单向散列 哈希运算还可以将一些重要文件,事先计算出来哈希值。保存在一个文件内,然后用命令来检查文件内的哈希值是否一样,通过这个办法来确定重要文件是否被改变。示例:

以及rpm --verify package_name(or -V) rpm包会在安装程序时,将生成的数据库文件的初始状态做哈希运算保存起来,使用-V就是检查指定程序是否被更改。被更改会提示,如下图:

 第二种:发行的软件包文件 GPG公钥签名 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*--导入公钥 rpm --checksig pakage_file_name (or -K)—检查文件的哈希值