1、简介
今天我要给大家分享的是互联网通信中用到的各种加密解密算法,在我们介绍加解密知识前,首先我们了解一下密码学、密码、加密、数字签名、密钥交换等相关术语的含义。
1.1 密码学
密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。
1.2 密码
密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则,变明文为密文,称为加密变换;变密文为明文,称为脱密变换。密码在早期仅对文字或数码进行加、脱密变换,随着通信技术的发展,对语音、图像、数据等都可实施加、脱密变换。
加密:加密是一种以密码方式发送信息的方法。只有拥有正确密钥的人才能解开这个信息的密码。对于其他人来说,这个信息看起来就像是一系列随机的字母、数字和符号。如果你要发送不应该让其他人看的敏感信息时,加密是特别重要的。
数字签名:数字签名是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
密钥交换:双方使用密钥交换算法确定对称密钥,然后用这个密钥进行加密和解密。这个密钥交换协议/算法只能用于密钥的交换, 而不能进行消息的加密和解密。
1.3 算法
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。(百度百科)
算法在数学(算学)和计算机科学之中,为任何良定义的具体计算步骤的一个序列[1],常用于计算、数据处理和自动推理。精确而言,算法是一个表示为有限长[2]列表的有效方法。算法应包含清晰定义的指令[3]用于计算函数[4]。算法中的指令描述的是一个计算,当其运行时能从一个初始状态和初始输入(可能为空)开始,[5]经过一系列有限[6]而清晰定义的状态最终产生输出[7]并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。(维基百科)
2、加密算法
2.1 加密算法的特点
对称加密:加密和解密使用同一个密码
公钥加密: [也可称为非对称加密]
1)每个密码都成对儿出现,一个为私钥(secret key),一个为公钥(public key)
2)公钥加密算法很少用来加密数据,速度太慢 比对称加密算法加密数据的速度慢上3个数量级,1000倍左右
单向加密即散列加密:提取数据特征码,常用于数据完整性校验
1)雪崩效应,输入的微小改变,将会引起结果的巨大改变。不可逆,无法根据特征码还原原来的数据
2) 定长输出,无论原始数据是多大,结果大小都是相同的。输入一样,输出必然相同
MAC:消息摘要码,单向加密的延伸应用
- 应用:用于实现在网络通信中保证所传输的数据完整性
- 机制:
- CBC-MAC
- HMAC:使用md5和sha1算法
2.2 加密解密技术常用的功能及算法
对称加密:
- 算法:DES, 3DES, AES, Blowfish, Twofish, RC6, CAST5
- 工具:gpg, openssl enc
- 加密算法 + 口令
- 密钥交换
- 用户身份认证
- 数据完整性
非对称加密:
- 算法:RSA, EIGamal, DSA
- 工具:openssl rsautl
- 密钥交换
- 身份认证
- 数据加密
单向加密:
- 算法:MD5, SHA1, SHA512, CRC-32
- 工具:sha1sum, md5sum, cksum, openssl dgst
- 完整性
密钥交换(IKE: Internet Key Exchange):
- 算法: DH,公钥加密 [并没有在互联网传输,比较安全]
- Diffie-Hellman
密钥交换的两种机制:
1、公钥加密实现:发送方用接收方的公钥加密自己的密钥,接收方用自己的私钥解密得到发送方的密钥,逆过来亦然,从而实现密钥交换。
2、使用DH算法:前提发送方和接受方协商使用同一个大素数P和生成数g,各自产生的随机数X和Y。发送方将g的X次方mod P产生的数值发送给接收方,接受方将g的Y次方mod P产生的数值发送给发送方,发送方再对接收的结果做X次方运算,接受方对接收的结果做Y次方运算,最终密码形成,密钥交换完成。
DH算法的数学原理
2.3公钥加密的功用
公钥加密、私钥解密;反之亦然,私钥加密、公钥解密
- 公钥:pkey
- 私钥:skey
- 算法:RSA, EIGamal
- 工具:gpg, openssl rsautl
数字签名:电子签名私钥用来加密,公钥用来解密
- 算法: RSA, EIGamal, DSA [DSA只能用来签名,无法用来加密]
数字证书:
* 证书格式:x509、pkcs【x509、pkcs12】
* x509格式:
* 公钥和有效期限;
* 证书的合法拥有者;(主机名)
* 证书的使用方式;
* CA的信息;
* CA的数字签名;(CA签名的校验码)
* 谁给CA发证:自签署证书
X.509:定义了证书的结构以及认证协议标准
版本号
序列号
签名算法ID
发行者名称
有效期限
主体名称
主体公钥
发行者惟一标识
主体的惟一标识
扩展
发行者签名
3、PKI
PKI: Public Key Infrastructure 公钥基础设施
CA: Certificate Authority CA证书权威机构
自建CA并完成对服务器发证:
3.1 自建CA(CA端)
生成一对儿密钥
生成自签证书
命令:
#(umask 077; openssl genrsa -out private/cakey.pem 2048) 【生成CA私钥】
#openssl req -new -x509 -key private/cakey.pem -out cacert.pem 【生成自签证书】(.pem)
3.2 证书申请(客户端)
生成一对儿密钥
生成证书申请(.csr)
将申请发送给CA
命令:
#(umask 077; openssl genrsa -out httpd.key 2048) 生成密钥
#openssl req -new -key httpd.key -out httpd.csr 生成证书申请 证书签署请求(.csr)
3.3 发证(CA端)
签署证书
传送给客户端
命令:
#openssl ca -in httpd.csr -out httpd.crt -days 365 签署证书(.crt)
3.4 PKI的实现
PKI: TLS/SSL: x509
第一种实现:互联网著名的安全机制TLS/SSL使用的是x509证书
PKI: OpenGPG
第二种实现:这是PKI的另外一种实现,它们实现证书的管理的机制不同,CA的信认关系传递机制略有不同。在Linux 上OpenGPG也是一种证书管理机制,或者PKI的实现架构。
SSL: Secure Socket Layer是由Netscape公司开发的一套Internet数据安全协议,当前版本为3.0。
- NetScape 网景
- Secure Socket Layer
- SSLv2, SSLv3
TLS: Transport Layer Security 是国际标准化组织开发的一个通用性协议,当前版本为1.2。
- TLSv1
- http --> https
- ldap --> ldaps
- ftp --> ftps
- smtp --> smtps
- pop3 --> pop3s
- imap --> imaps
OpenSSL是SSL的开源实现 - libcrpto: 通用加密库
- libssl: TLS/SSL的实现
- 基于会话的、实现了身份认证、数据机密性和会话完整性的TLS/SSL库
- openssl: 多用途命令行工具,可以实现单向加密、对称加密、非对称加密、实现私有证书颁发机构
3.5 SSL通信原理:
SSL的握手过程为:
-
(1) SSL客户端通过Client Hello消息将它支持的SSL版本、加密算法、密钥交换算法、MAC算法等信息发送给SSL服务器。
-
(2) SSL服务器确定本次通信采用的SSL版本和加密套件,并通过Server Hello消息通知给SSL客户端。如果SSL服务器允许SSL客户端在以后的通信中重用本次会话,则SSL服务器会为本次会话分配会话ID,并通过Server Hello消息发送给SSL客户端。
-
(3) SSL服务器将携带自己公钥信息的数字证书通过Certificate消息发送给SSL客户端。
-
(4) SSL服务器发送Server Hello Done消息,通知SSL客户端版本和加密套件协商结束,开始进行密钥交换。
-
(5) SSL客户端验证SSL服务器的证书合法后,利用证书中的公钥加密SSL客户端随机生成的premaster secret,并通过Client Key Exchange消息发送给SSL服务器。
-
(6) SSL客户端发送Change Cipher Spec消息,通知SSL服务器后续报文将采用协商好的密钥和加密套件进行加密和MAC计算。
-
(7) SSL客户端计算已交互的握手消息(除Change Cipher Spec消息外所有已交互的消息)的Hash值,利用协商好的密钥和加密套件处理Hash值(计算并添加MAC值、加密等),并通过Finished消息发送给SSL服务器。SSL服务器利用同样的方法计算已交互的握手消息的Hash值,并与Finished消息的解密结果比较,如果二者相同,且MAC值验证成功,则证明密钥和加密套件协商成功。
-
(8) 同样地,SSL服务器发送Change Cipher Spec消息,通知SSL客户端后续报文将采用协商好的密钥和加密套件进行加密和MAC计算。
- (9) SSL服务器计算已交互的握手消息的Hash值,利用协商好的密钥和加密套件处理Hash值(计算并添加MAC值、加密等),并通过Finished消息发送给SSL客户端。SSL客户端利用同样的方法计算已交互的握手消息的Hash值,并与Finished消息的解密结果比较,如果二者相同,且MAC值验证成功,则证明密钥和加密套件协商成功。
- 注意:在双方通信中,客户端和服务器端支持的加密解密算法未必一样。双方要协商各自所使用算法,且是双方支持的、可靠的算法,如:对称加密双方都支持的算法、非对称加密双方都支持的算法、单向加密双方都支持的算法。这个过程任何第三方都能看到,不能解密就得不到里面的数据,这个过程涉及到了认证、加密通信、密钥交换、双方使用这个对称密钥加解密数据而这个密钥是一次性的。
3.6 互联网应用安全通信必须要满足以下特性
1、私密性
2、身份认证
3、完整性
openssl补充材料:
- openssl中有如下后缀名的文件
- .key格式:私有的密钥
- .crt格式:证书文件,certificate的缩写
- .csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
- .crl格式:证书吊销列表,Certificate Revocation List的缩写
-
.pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式
- 常用证书协议
- x509v3: IETF的证书标准
- x.500:目录的标准
- SCEP: 简单证书申请协议,用http来进行申请,数据有PKCS#7封装,数据其实格式也是PKCS#10的
- PKCS#7: 是封装数据的标准,可以放置证书和一些请求信息
- PKCS#10: 用于离线证书申请的证书申请的数据格式,注意数据包是使用PKCS#7封装这个数据
- PKCS#12: 用于一个单一文件中交换公共和私有对象,就是公钥,私钥和证书,这些信息进行打包,加密放在存储目录中,
- CISCO放在NVRAM中,用户可以导出,以防证书服务器挂掉可以进行相应恢复。思科是.p12,微软是.pfx
4、总结
4.1密码算法总结
一、单向散列算法: 属于摘要算法,不是一种加密算法,作用是把任意长的输入消息串变化成固定长的输出串的一种函数
- BASE64(严格地说,属于编码格式,而非加密算法)
- MD5(Message Digest algorithm 5,信息摘要算法)
- SHA(Secure Hash Algorithm,安全散列算法)
- HMAC(Hash Message Authentication Code,散列消息鉴别码)
- CRC(Cyclical Redundancy Check,循环冗余码校验)
二、对称加密算法: 加密密钥与解密密钥相同
- DES(Data Encryption Standard,数据加密标准算法)
- AES(Advanced Encryption Standard,高级加密标准)
- PBE(Password-based encryption,基于密码验证)
- RC5(参数可变的分组密码算法 )
- BLOWFISH(对称密钥分组加密算法)
三、非对称加密算法 :加密密钥与解密密钥不相同
- RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
- DH(Diffie-Hellman算法,密钥一致协议)
- Elgamal(既能用于数据加密也能用于数字签名)
- DSA(Digital Signature Algorithm,数字签名)
- ECC(Elliptic Curves Cryptography,椭圆曲线算法)
- Merkle-Hellman(背包算法)
- Miller Rabin算法(素数测试算法)
学习完加密及各种算法后日常最多用到的场景就是加密、验签、密钥交换。非对称加密算法比对称加密算法的速度慢3个数量级,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。非对称加密算法通常做签名。对称加密算法的钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。
在业务使用中,我们通常采用的方式是:非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样就集成了两种加密算法的优点,既有了加密速度快的优点,又有了安全方便管理密钥的优点。RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。
【实现算法难度★;设计算法难度★★★】大多公司没有能力设计加密算法,就算实现一款加密算法也是有难度的,一般调用标准加密库即可。
补充:算法分类可以根据算法设计原理、算法的具体应用和其他一些特性进行分类。程序开发中用到的算法和我们所提到的加密算法是不同的。
4.2算法分类
- 基本算法
枚举
搜索深度优先搜索 广度优先搜索 启发式搜索 遗传算法
- 数据结构的算法
- 数论与代数算法
- 计算几何的算法
凸包算法 - 图论的算法
哈夫曼编码 树的遍历 最短路径算法 最小生成树算法 最小树形图 网络流算法 匹配算法 分团问题
- 动态规划
- 其他
数值分析 加密算法 排序算法 检索算法 随机化算法
转载于:https://blog.51cto.com/redone/2109375