「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。
这一章节我们需要知道密码算法分哪几类,对称算法、非对称算法、哈希算法分别有哪些。
网络安全有 CIA 三大属性,也就是「保密性」、「完整性」、「可用性」,其中「保密性」和「完整性」依赖「密码」实现。所以,密码是网络安全的基石,没有密码就没有网络安全。
扩展:这里的密码指的是「使用算法对数据进行加密或认证」的一种技术、产品或服务。严格来说,我们平时登录账号使用的那个不算密码,应该叫口令。
一个安全的密码需要满足以下三个条件:
- 破译密码的实际「计算量」无法实现。比如你用目前最高的算力的计算机也穷举不出来。
- 破译密码所需要的「时间」超过数据的生命周期。比如我的数据保密期是一年,你得花两年才能破译,那我的密码也算安全。
- 破译密码的「成本」超出数据本身的价值。比如我的数据价值一万,你得花了两万才能破译,那我的密码也算安全的。
密码学
- 1、算法分类
- 2、对称算法
- 2.1、DES
- 2.1.1、生日攻击
- 2.2、3DES
- 2.3、AES
- 2.4、IDEA
- 2.4、SM1
- 2.6、SM4
- 2.7、SM7
- 2.8、RC2
- 2.9、RC4
- 2.10、RC5
- 2.11、BlowFish
- 2.12、TwoFish
- 3、非对称算法
- 3.1、RSA
- 3.2、ECC
- 3.3、EIGamal
- 3.4、DSA
- 3.5、DH
- 3.6、SM2
- 3.6、SM9
- 4、哈希算法
- 4.1、消息鉴别码
- 4.2、数字签名
- 5、国密算法
- 6、PKI
- 6.1、数字证书
1、算法分类
密码体系中有一些概念需要了解:
- 明文:需要被保护的数据,需要保密。
- 密文:加密后的数据,可以公开。
- 算法:明文转换成密文的方法,可以公开(国密算法除外)。
- 加密:明文转换成密文的过程。
- 解密:密文转换成明文的过程。
- 加密密钥:加密时需要使用的密钥,可以公开。
- 解密密钥:解密时需要使用的密钥,需要保密。
发送方使用「算法」和「加密密钥」将明文加密成密文后传输,密码分析者只能嗅探到「密文」,想看明文必须先解密;接收方收到密文后,使用「算法」和「解密密钥」将密文解密成明文。通信流程如下:
其中最重要的是密码的算法和密钥,密码算法越「复杂」、密钥保管的越好、密钥的「长度」越长,密码的安全性就越高。
密码的算法分为对称算法、非对称算法、哈希算法三类:
- 「对称算法」:也叫加密算法,常用来加密数据,保证数据的机密性。
- 「非对称算法」:也叫密钥算法或数字签名算法,常用来做身份认证。
- 「哈希算法」:保证数据的完整性。
2、对称算法
对称算法的「加密密钥」和「解密密钥」相同,也就是所谓的对称。
对称算法的安全性依赖「秘钥」,通信之前,双方「协商」一个秘钥,然后用这个秘钥进行加密和解密。
不同用户之间必须使用「不同」的对称秘钥,秘钥的「数量」随着用户数量增加呈「几何增长」。
对称密钥算法由于密钥短,所以加密速度快、效率高,适合加密「大量」的数据。
对称算法的算法细节都是公开的,但秘钥需要保密,秘钥长度越长,安全性就越高,但计算时间也越长,效率就越差。
对称算法主要有:DES系列、SM系列、RC系列、fish系列。
「DES系列」:DES、3DES、AES、IDEA
- DES:对称分组加密算法,分组长度64位,密钥长度64位,去掉8个校验位有效长度只有56位,已弃用。
- 3DES:DES的升级版,使用3次DES加密数据,秘钥长度是112或168位。
- AES:DES的替代方案,秘钥长度是128位、192位或256位,使用最多的对称加密算法。
- IDEA:DES的替代方案,类似三重DES,秘钥长度是128位。
「SM系列」:SM1、SM4、SM7
- SM1:(国产)商密1号算法,秘钥长度是128位,用来替代AES,算法不公开。
- SM4:(国产)商密4号算法,秘钥长度是128位,用来替代AES,算法公开。
- SM7:(国产)商密7号算法,秘钥长度是128位,算法未公开。
「RC系列」:RC2、RC4、RC5
- RC2:DES的替代方案,秘钥长度是1~128位,已弃用。
- RC4:流加密算法,密钥长度是40~204位。
- RC5:参数可变,秘钥长度是0~2040位。
「fish系列」:BlowFish、TwoFish
- BlowFish:DES的替代方案,分组长度64位,秘钥长度是32位到448位。
- TwoFish:分组长度128位,秘钥长度是128、192、256位。
扩展:位是二进制的基本单位,有0和1两种表现形式;一个字节等于8位,也就是8个0或1。一个英文字符占一个字节,比如字符‘a’就是一个字节;一个汉字占两个字节,比如汉字“我”占两个字节。
2.1、DES
DES(Data Encryption Standard)是早期的数据加密标准,后来被发现不安全,已经淘汰了。
DES使用对称的分组加密算法,意思就是把数据分成多个数据块或分组,然后一块一块的加密。
- 数据分块:先把明文数据分成一个个64位的数据块,不足64位的就填充。
- 初始置换:把64位数据块作为输入,重新排序,生成新的64位数据块。
- 加密轮次:把64位数据块分为左右两个32位数据块,把右边的32位数据块扩展成48位的秘钥,用秘钥和左边的32位数据块进行异或,异或的32位结果和左边的32位数据拼接成新的64位数据块,作为下一轮加密的输入,重复进行16轮加密。
- 末尾置换:将加密后的64位数据块,重新排序,生成密文。
秘钥的长度是64位,减去8个校验位,实际有效的秘钥长度只有56位,很容易就能穷举出来。
2.1.1、生日攻击
生日攻击是密码学的攻击方式之一,DES就容易被生日攻击穷举爆破出来。
生日攻击来源于概率学中的生日问题,也叫生日悖论,这里的悖论是指跟人们的常识不同。比如一年有365天,生日就有365个,按照人们的常识,一间教室里最起码得有366个人才有可能出现两个人生日相同的情况。但实际上,一间教室只要有23个人,那么出现两个人生日相同的概率就会大于50%。
拿DES算法举例,DES的秘钥有效长度是54位,秘钥可能得数量就是2的54次方,这个数字看起来是巨大的,但按照生日攻击的逻辑,秘钥出现重复情况的概率要远比我们想象中的大,所以容易被穷举爆破。
2.2、3DES
3DES(Triple Data Encryption Standard)也叫Triple DES 或者 TDEA(Triple Data Encryption Algorithm),是三重加密算法,属于对称的分组加密算法,对一组64位的数据块执行三次DES算法,实现方式有4种:
- 使用三个不同的秘钥(k1,k2,k3)连续执行3次DES加密。
- 使用三个不同的秘钥(k1,k2,k3),第一次用DES加密,第二次用DES解密,第三次再用DES加密。
- 使用两个不同的秘钥(k1=k3,k2)连续执行3次DES加密。
- 使用两个不同的秘钥(k1=k3,k2),第一次用DES加密,第二次用DES解密,第三次再用DES加密。
前两种秘钥总长度是168位,后两种秘钥总长度是112位,比DES安全很多,但是加密时间太长,效率不高。
扩展:SSL/TLS协议信息泄露漏洞(CVE-2016-2183)就是因为TLS, SSH, IPSec协商及其他产品中使用的DES及Triple DES加密,被原理扫描出来的。Nessus将秘钥长度位64位~112位的任何加密判定为中等强度。
2.3、AES
AES(Advanced Encryption Standard)也叫高级加密标准,是美国国家标准技术研究所NIST为了取代DES而设定的加密标准。2000年从多个候选算法中选中Rijndael算法作为AES标准,2006年开始成为最流行的算法。
AES加密标准认为,安全的加密算法需要满足一下4个基本要求:
- 使用对称的分组加密方式。
- 分组长度最少128位。
- 秘钥长度最少128位。
- 算法容易被各种硬件和软件实现。
AES会把明文数据分成一个个128位的数据块,对每个数据块进行多轮行列混淆和加密。
AES支持128位、192位、256位三种秘钥长度,也就是我们常说的AES128、AES192、AES256。
2.4、IDEA
IDEA(International Data Encryption Algorithm)是国际数据加密算法。
将明文分割成64位的数据块,使用128位的秘钥进行加密。
加密强度很高,由于受专利保护,需要付费使用,所以使用量没有DES那么多。
2.4、SM1
SM1是商密1号算法,是国家密码管理局编制的商用的分组加密算法。
分组长度和秘钥长度都是128位,安全强度和AES相当。算法不公开,只能集成在芯片里使用。
2.6、SM4
SM4是商密4号算法,是国家密码管理局编制的商用的分组加密算法。
分组长度和秘钥长度是128位,安全强度和AES相当。算法公开,常用于无线局域网。
2.7、SM7
SM7是商密7号算法,是国家密码管理局编制的商用的分组加密算法。
分组长度和密钥长度都是128位,常用于非接触式IC卡,比如门禁卡、工作证、校园卡。
2.8、RC2
RC2是用来代替DES的对称的分组加密算法,
分组长度是64位,秘钥长度是可变的1~128位,在老旧机型上运行速度快,现在大部分场景下已经不推荐使用了。
2.9、RC4
RC4是一种对称的流加密算法,应用在有线等效保密协议WEP。
流加密就是使用固定长度的密钥生成一个随机的与明文数据字节数相同的密钥流,与明文的字节流逐位异或,生成密文。秘钥长度是可变的40位到2048位,
2.10、RC5
RC5是一种对称的分组加密算法,分组、秘钥可变。
分组长度可以是32位、64位、128位,秘钥长度是0~2040位,加密轮次随着长度的增加而增加。
2.11、BlowFish
BlowFish是用来替代DES的对称分组加密算法。
将明文分割成64位的数据块,使用32位到448位可变长度的秘钥进行加密。
加密强度很高,但分组块只有64位,相对于AES来说,更容易收到生日攻击。
2.12、TwoFish
TwoFish是一种对称的分组加密算法,常用于磁盘加密。
分组长度是128位,秘钥长度可以是是128位、192位、256位。
3、非对称算法
非对称算法的加密密钥和解密密钥是不同的,分别叫做公钥和私钥。公钥用来加密数据,可以公开传输;私钥用来解密数据,需要保密,保存在本地。
非对称算法的原理如下:
- 通信前,接收方生成一对密钥,将其中一个作为公钥发送给发送方;
- 发送方使用公钥将明文加密成密文,发送给接收方;
- 接收方使用私钥解密密文,拿到明文。
非对称算法通常是以某个数学难题为基础,扩展而来的,主要分大素数分解和离散对数这两种:
大素数分解类主要有:RSA
离散对数主要有:ECC、EIGamal、DSA、DH、SM2、SM9。
3.1、RSA
RSA是三个算法创始人名字的首字母缩写,以数学难题 大素数的因数分解 扩展出来的。
素数也叫质数,是一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,也就是除了1和它本身外不再有其他的因数。
因数分解就是把一个正整数写成几个约数的乘积,比如45可以分解成3×3×5
大素数的因数分解难题,简单来说就是:给出两个素数,很容易将他们相乘;但给出他们的乘积,想得到这两个素数就非常困难。比如我们给出一个几百位的素数,想要因数分解,从理论上来讲,几乎就是不可能的,这就是RSA算法安全性的保障。
素数越大,求解难度越高,官方给RSA的最小密钥长度要求是1024位。
DSA是1024位,ECC是160位
RSA的算法大致如下,大家了解大概步骤即可:
1)生成密钥:
- 选择两个大素数p和q,计算他们的乘积 n=p×q。
- 用欧拉函数计算t=(p-1)(q-1)。
- 选择一个质数e,e和t互质,且1<e<t。
- 计算e关于t的模逆元d,即(dxe)%t=1。
- 生成公钥(n,e),生成私钥(n,d)
2)加密:
- 将明文转化为整数m,m<n。
- 用公钥加密m,密文c=m^e mod n。
3)解密:
- 用私钥解密c,明文m=c^d mod n。
3.2、ECC
ECC(Elliptic curve cryptography)是椭圆曲线算法,以数学难题 椭圆曲线的离散对数 扩展出来的。
RSA的数学原理简单,实际应用中比较容易实现,求解难度是亚指数级的;而ECC的数学原理很复杂,实际应用中也比较难实现,求解难度是指数级的。ECC160位的密钥就能达到RSA1024位密钥的安全性,速度更快也更安全。
3.3、EIGamal
EIGamal是以数学难题 计算有限域上离散对数 扩展出来的。
求解离散对数是困难的,而其逆运算可以应用平方乘的方法有效的计算出来。
3.4、DSA
DSA(Digital Signature Algorithm)也叫DSS,是ElGamal的变种,也是以数学难题 有限域的离散对数 扩展出来的。
DSA的算法大致如下,了解步骤即可:
- 选择一个大素数p和一个小于p的奇数q,计算n=2p。
- 选择一个随机整数k(1 < k < q),计算g=g^k (mod p)。
- 私钥a^(p-1-k) ≡ 1 (mod p),1 < a < q,且a与q互质。
- 公钥b=g^a (mod p)。
3.5、DH
DH(Diffie-Hellman)是密钥交换协议,以数学难题 离散对数 扩展出来的,只用来协商密钥,不加密数据。
DH的算法大致如下,了解步骤即可:
- 发送方和接收方选择两个大素数 n 和 g。
- 发送方选择一个大随机整数 x,计算 X = g^x mod n,发送 X 给接收方。
- 接收方选择一个大随机整数 y,计算 Y = g^y mod n,发送 Y 给发送方。
- 发送方密钥
k1 = Y^x mod n
;接收方密钥k2=X^y mod n
。
密钥协商完成后,k1 == k2,n、 g、 X、Y都能在网络中捕获,但无法计算出密钥,除非能恢复x、y。发送方和接收方使用密钥和对称加密算法加密/解密数据。
3.6、SM2
SM2是商密2号算法,是国家密码管理局编制的商用的椭圆曲线公钥密码算法,以数学难题 椭圆曲线的离散对数 扩展出来的非对称加密算法。目的是替代RSA算法,算法未公开。
3.6、SM9
SM9是商密9号算法,是国家密码管理局编制的标识密码标准,加密强度相当于3072位的RSA,也是基于椭圆曲线的离散对数问题开发的非对称加密算法,主要用于身份认证,算法未公开。
4、哈希算法
哈希算法可以将任意长度的输入转换成固定长度的输出,用来保证数据的完整性。
哈希算法是单向的、不可逆的。数据只要有1个字符不一样,哈希值就会发生巨大变化,因此可以保证数据的完整性;计算哈希值需要用到密钥,密钥只有发送方和接收方有,因此可以保证数据不被其他发送者伪造;消息中携带的需要,可以保证数据发送的顺序。
常见的哈希算法有:MD5、SHA-1、SHA-2、SM3。
- MD5:使用分组加密的方式计算哈希值,分组长度512位,输出是128位,容易碰撞,不安全。
- SHA-1:使用分组加密的方式计算哈希值,分组长度512位,输出是160位,容易碰撞,不安全。
- SHA-2:SHA-224、SHA-256、SHA-384、SHA-512这四个算法的统称,使用分组加密的方式计算哈希值,分组长度是512位,输出分别是224位、256位、284位、512位,不容易碰撞,相对安全。
- SM3:商密3号算法,使用分组加密的方式计算哈希值,分组长度512位,输出是256位,安全性和SHA-256相同。
扩展:哈希碰撞就是两个不同的输入被转换成了相同的输出,因为哈希算法的输出长度是固定的,那它的结果集就是有限的。比如一年有365天,对应的有365个生日,当班里的人数超过365个时,就一定会有两个生日重复的人(实际上按照生日攻击的逻辑,23个人生日就有可能重复)。
4.1、消息鉴别码
消息鉴别码(Message Authentication Code,MAC)也叫消息认证码,使用密钥生成一个固定长度的输出,放在数据末尾一起传输,用来保证数据的完整性,实现身份验证。
计算消息鉴别码的算法教MAC函数,跟哈希函数类似,都是单向散列函数,不可逆,不同的是,哈希函数加密数据不需要密钥,只保证完整性,不做身份验证;而MAC函数加密数据需要密钥,即保证完整性,也能做身份验证。
4.2、数字签名
实现抗抵赖。
- 通信前,发送方将公钥发送给接收方。
- 通信时,发送方使用哈希算法计算出数据的哈希值,使用私钥加密哈希值得到数字签名,将数据和数字签名发送给接收方。
- 接收方使用同样的哈希算法计算数据的哈希值,并使用发送方的公钥解密数字签名得到哈希值,判断两个哈希值是否相同。
如果两个哈希值相同,就说明数据没有被伪造(真实性),就是你用私钥加密后发给我的(抗抵赖性)。
5、国密算法
前文提到的很多SM系列算法都是国密算法,由国家密码管理局发布。国密算法目前正在大力推广,相关政策规定关键信息基础设施系统、等保三级及以上系统、重要的电子政务平台都要使用国密算法做相应的改造。这一点我们必须要知道。
常用的国密算法:
- SM1:(分组加密)对称加密算法,密钥长度128位,替代AES,集成在芯片里使用。
- SM2:(椭圆曲线的离散对数)非对称加密算法,替代RSA。
- SM3:(分组加密)哈希算法,输出长度256位,替代SHA-256。
- SM4:(分组加密)对称加密算法,密钥长度128位,替代AES,用于无线局域网。
- SM7:(分组加密)对称加密算法,密钥长度128位,替代AES,用于非接触式IC卡。
- SM9:(椭圆曲线的离散对数)非对称加密算法,替代3072位的RSA。
6、PKI
PKI(Public Key Infrastructure)是公钥基础设施管理系统,利用公开密钥技术管理公开的密钥。
为了解决互联网中数据传输的保密性、完整性、身份认证和抗抵赖这四个问题,PKI通过第三方可信机构颁发数字证书,把用户信息和公钥绑定到一起。
PKI体系由4个部分组成:
- CA(Certificate Authority):证书颁发机构,负责颁发和管理数字证书。
- RA(注册权威):充当代理的角色,处理证书请求,分担CA的压力。
- 证书库/CRL:通常以LDAP目录服务的形式存在,存储所有数字证书的数据库,维护CRL列表,CRL列表是证书黑名单,过期、吊销的证书都放在黑名单里。
- 终端实体:使用证书的用户或应用程序。
6.1、数字证书
数字证书用来标识互联网中通讯各方的身份,证书内容至少要包含:证书有效期、颁发机构和机构的签名、证书持有者和持有者的公钥。
我们以百度为例查看百度的数字证书。点左边的小锁 -> 连接安全 -> 证书图标,打开证书,可以看到证书是颁发给百度的(baidu.com),颁发者是GlobalSign,有效期是一年。
点开详细信息可以看到公钥用的是2048位的RSA。