一、对称密码
异或(XOR)
对象:
比特序列,即01代码
方式:
相同异或为0,不同异或为1。理解为相加后偶数为0,奇数为1
符号:
圆圈中一个加号
规律:
A异或B的结果为C,C与B异或的结果为A。即异或可抵消
密码学中:
明文与密钥异或为密文,密文与密钥异或为明文
安全:
密钥若为有规律、可推测的,则不安全。因此,密钥的随机性决定了其安全性
一次性密码:
密钥与明文具有相同的大小,因为对齐才能异或。且一次性密码理论上无法被破解,因为穷举后的明文结果足够多,无法判断哪一个结果是真正的明文。同时,存在保存密钥与保存明文难度等同现象,因此它的使用存在悖论(有保护密钥的功夫直接保护明文好了)。
分组密码:
只能加密固定长度的明文,如果加密的明文长度过长,就要对明文进行分组,然后迭代加密(一组一组的加密)。DES、AES均属于分组密码。
DES:
64比特明文加密成64比特密文,其中每隔7位会存在1位错误检查比特,共8位错误检查比特,因此密钥长度为56位。同时DES每次只能加密64位比特数据,如果明文更长,需要反复迭代加密(即所谓的64位一组)。
Feistel网络(主要是轮函数)
分为左右两侧,每侧32位,每次只加密(异或)左侧数据,但左右两侧可以调换,右侧的不加密保证了任何情况下的解密性。其中,加密左侧的密钥是根据右侧数据和轮函数生成的。由于每一轮都进行左右调换,所以密钥每一轮都不相同。
此特性可以使轮函数任意复杂(因为它只负责生成密钥),加密轮数任意多。
3DES:
对DES进行加密-解密-加密的过程,其中每次使用的密钥都不一样(密钥顺序为123),因此中间的解密并不是解密出了真正的明文。如此保证了3DES能够兼容DES。
解密3DES时,依次使用密钥进行解密-加密-解密即可(密钥顺序为321)。
AES:
免费的,推荐使用的,基于Rijndael加密算法。分组长度为128比特,即一次可加密128比特长度的明文(DES为64比特),密钥长度为128、192、256比特。
二、分组密码模式
当明文过长时,需要将明文进行分组(如每组长128比特),然后迭代加密,迭代方法即为分组密码的模式。
ECB(电子密码本模式)
对明文的分组按顺序进行一组一组的加密,解密时按顺序进行一组一组的解密。当分组内容小于分组长度时,需要一些特定的数据进行填充。
攻击ECB:
无需破译明文,只需知道密文(分组)是什么字段就行,然后拦截并操控密文分组顺序即可,因为这样也就操控了明文分组顺序。
ECB模式也是最不安全的分组模式。
CBC(密码分组链接模式)
将前一个密文分组与当前明文分组的内容混合起来进行加密的。
加密过程:
一个初始化向量与第一个明文分组异或,异或后再加密得到第一个密文分组,第一个密文分组与第二个明文分组异或,异或后再加密得到第二个密文分组……
解密过程:
第一个密文分组先进行解密,解密后与一个初始化向量异或得到第一个明文分组,第二个密文分组先进行解密,解密后与第一个密文分组异或得到第二个明文分组……
特点:
一旦密文发生了丢失,则造成分组错位,如此加解密失败。
安全:
Padding Oracle Attack
CFB(密文反馈模式)
前一个密文分组会被送回到密码算法的输入端。
加密过程:
初始化向量先进行加密,加密后与第一个明文分组异或得到第一个密文分组,第一个密文分组再进行加密,加密后与第二个明文分组进行异或得到第二个密文分组……
解密过程:
初始化向量先进行加密,加密后与第一个密文分组异或得到第一个明文分组,第一个密文分组再进行加密,加密后与第二个密文分组进行异或得到第二个明文分组……
攻击CFB:
重放攻击(且需要一定的条件)。
OFB(输出反馈模式)
密码算法的输出会反馈到密码算法的输入中。
加密过程:
初始化向量先进行加密,加密后与第一个明文分组进行异或,得到第一个密文分组。初始化向量进行第二次加密(第一次加密的基础上再加密一次),加密后与第二个明文分组进行异或,得到第二个密文分组……
解密过程:
初始化向量先进行加密,加密后与第一个密文分组进行异或,得到第一个明文分组。初始化向量进行第二次加密(第一次加密的基础上再加密一次),加密后与第二个密文分组进行异或,得到第二个明文分组……
CTR(计数器模式)
通过将逐次累加的计数器进行加密来生成密钥流的流密码。
加密过程:
计数器先进行加密,加密后和第一个明文分组进行异或,得到第一个密文分组。计数器累加1,累加之后再进行加密,加密后和第二个明文分组进行异或,得到第二个密文分组……
解密过程:
计数器先进行加密,加密后和第一个密文分组进行异或,得到第一个明文分组。计数器累加1,累加之后再进行加密,加密后和第二个密文分组进行异或,得到第二个明文分组……
计数器的前半部分每次加密都是不同的(若分组长度为128位的话,前半部分为64位),后半部分为累加部分,单独一次加密过程中是每次累加的。
(注意每次加密和每次加密的过程是两个概念)。
三、非对称密码
公钥加密私钥解密。先生成公私钥对,然后将公钥发送给接收者,接收者用公钥加密通信报文并发送回即可。期间即使被窃听也没关系。
RSA:
加密公式:密文=「明文的E次方」mod N
(明文的E次方除以N的余数)
其中E和N的组合就是公钥(注意该组合只是公钥)
解密公式:明文=「密文的D次方」mod N
(密文的E次方除以N的余数)
其中D和N的组合就是私钥(注意该组合只是私钥)
生成RSA密钥对步骤
1、求N值
N=p*q
(p和q都是512比特长度的质数)
2、求L值(仅在过程中使用)
L=lcm(p-1,q-1)
(p-1和q-1的最小公倍数)
3、求E值
gcd(E,L)=1
(E和L互为质数)
至此可以生成密钥对中的公钥
4、求D值
(E*D)mod L =1
(E和D的积数除以L的余数为1)
至此可以生成密钥对中的私钥
运算:
使用明文、E、N计算出密文并传输
使用面额、D、N计算出明文并传输
攻击难点:
通过分解N推算出p和q。但尚未发现对大整数进行质因数分解的高效算法,而且也尚未证明质因数分解是否真的是非常困难的问题,甚至不知道是否存在一种分解质因数的简单方法。
其他的攻击点:
中间人攻击
四、混合密码
用对称密码来加密明文(速度),用非对称密码来加密对称密码中所使用的密钥(安全)。
加密方式:
分别加密后组合发送。
解密方式:
先分离密文与密钥,再分别解密即可。
同时考虑密钥长度的平衡,非对称密码强度应高于对称密码强度。
五、单项散列函数
主要有:
MD4、MD5、SHA-1、SHA-256、SHA-384、SHA-512
其中:SHA-256、SHA-384、SHA-512合起来统称SHA-2。
RIPEMD-128、RIPEMD-160、RIPEMD-258、RIPEMD-320
新标准:SHA-3(基于Keccak算法,标准程度相当于AES)
SHA3-224、SHA3-256、SHA3-384、SHA3-512
安全性:
MD4、MD5为产生128比特散列值,均已不安全,存在可碰撞。
SHA-1产生160比特散列值,也是不推荐使用的,存在可碰撞。
RIPEMD-128、RIPEMD-160也不推荐使用。
推荐:
SHA-2、SHA-3算法(目前对它的支持还不是很广泛)。
特性:
弱抗碰撞性:
要找到和该消息具有相同散列值的另一个消息是非常困难的(知道该消息和其散列值找另一条消息)。
强抗碰撞性:
要找到散列值相同的两条不同的消息是非常困难的(知道散列值找两条消息)。
主要用于确定完整性的。
无论消息的长度有多大,单项散列函数都会计算出固定长度的散列值。
且须具备高计算速度、高抗碰撞性。
攻击:
原像攻击:
给定一个散列值,找出具有该散列值的任意消息。
第二原像攻击:
给定一条消息,找出另一条消息,两条消息的散列值相同。
不能解决:
不能解决伪装安全问题、只能识别出是否被篡改。
六、消息认证码(MAC)
与密钥关联的单项散列函数。可以同时解决伪装和篡改问题(完整性和真实性)。
生成:
使用单项散列函数、对称(分组)密码、公钥密码等均可实现。
输入:
任意长度的消息和一个发送者与接收者之间的共享密钥。
输出:
固定长度的数据(MAC值)
HMAC:
任何高强度的单项散列函数都可以被用于HMAC。
1、首先填充密钥(末尾加0)使其与单项散列函数的分组长度等同。
2、填充后的密钥与ipad(16进制的36,循环达到分组长度)做异或生成ipadkey。
3、ipadkey附加在消息开头(组合),并计算组合后的散列值。
4、填充后的密钥与opad(16进制的5c,循环达到分组长度)做异或生成opadkey。
5、opadkey附加在第三步算出的散列值的开头,并计算组合后的散列值(HMAC值)。
重放攻击:
时间戳:
要保证发送者和接受者的时钟必须一致,但考虑到网络延迟,必须在时间的判断上留下缓冲,因此仍有可以进行重放攻击的时间。
nonce:
即一次性随机数。先发送该随机数,再将随机数包含在消息中并计算MAC值,以此便无法进行重放。
不能解决(因为是同一个密钥):
无法对第三方证明:
B向第三方C证明该消息是A发送给B的。
无法防止否认:
B无法防止A否认了曾经向B发送过消息。
七、数字签名
发送方持有生成签名的密钥,接收方持有验证签名的密钥,且验证密钥无法生成签名。
即在公私钥对中,用私钥加密,用公钥解密。
用法:
1、先计算消息的散列值,再对散列值进行私钥加密,得到的即为签名。
2、消息和签名发送,用公钥对签名进行解密并做验证。
其他术语:
明文签名:
不对消息进行加密,只对消息进行签名,主要用于发布消息。
密文签名:
对消息进行加密和签名。
数字签名算法:
现在用于公钥算法或数字签名:RSA、ECDSA(椭圆曲线)、Rabin
现在只用于公钥算法:ElGamal
现在只用于数字签名:DSA
不能解决:
用于验证签名的公钥必须属于真正的发送者(即无法防止用于签名的公私钥对是第三方发送的)。
解决方法为使用证书。
八、证书
公钥证书记录个人信息及个人公钥,并由认证机构施加数字签名。
使用:
1、消息接收者生成公私钥对,并在认证机构注册自己的公钥,认证机构确认公钥为接收者所有,之后使用私钥(认证机构的)对公钥(接受者的)进行数字签名并生成证书。(该步骤只在第一次注册时存在)
2、发送者从认证机构获取到接收者的证书,并使用认证机构的公钥验证证书的来源(至此双方验证结束)。(该步骤只在第一次使用时存在)
3、发送者使用接收者的公钥加密消息并发送给接收者,接收者使用私钥进行解密。
公钥基础设施(PKI):
PKI是为了能够有效的运用公钥而制定的一系列规范和规格的总称(并非某单一规范)。
PKI组成包括用户、认证机构(CA)、证书仓库。
认证机构(证书)是有层级结构的,最顶级的认证机构就是根CA。
CRL:证书作废清单。用户要定期查询认证机构最新的CRL,确认证书是否失效。
九、密钥
消息认证码的密钥与数字签名的密钥:前者是共享的(相同),后者不共享(不相同)。
机密性用途和认证用途:前者是加密数据的(对称和非对称),后者是做认证的(消息认证码和数字签名)。
会话密钥与主密钥:会话密钥是一次性的,主密钥是持久性的。
加密内容的与加密密钥的:内容加密密钥(CEK),密钥加密密钥(KEK)。
Diffie-Hellman密钥交换:
1、发送者向接收者发送两个质数P
和G
。其中G
是和P
相关的数(生成元)。
2、各生成自己的随机数:发送者(A
)和接收者(B
),介于1到P-2之间。(保密)
3、发送者和接收者交换值:(G的A次方) mod P
值与(G的B次方) mod P
值。
4、互相计算:发送者计算:((G的B次方) mod P)A mod P
。接收者计算:((G的A次方) mod P)B mod P
。
5、计算出的结果(密钥)是等同的。这就是共享密钥(用于对称加密算法)。
十、随机数
弱伪随机数:
具备随机性。
强伪随机数:
具备随机性、不可预测性。
真随机数:
具备随机性、不可预测性、不可重现性。
伪随机方法:
1、杂乱法(不推荐)。
2、线性同余法(具备可推测性,不能用于密码技术)。
3、单项散列函数法。
4、密码法(AES或RSA等)。
十一、TLS协议
是由记录协议、握手协议(分为握手协议、密码规格变更协议、警告协议、应用数据协议)两层叠加而成的。
记录协议:
握手协议的下层。
负责消息的压缩、加密与数据的认证。(先对消息进行片段分割,再对每个片段进行压缩,压缩后加上消息认证码,并加上数据的认证。之后通过对称密码CBC进行加密)
握手协议:
负责生成共享密钥(进行密码通信)及交换证书(双方互相认证)。
1、ClientHello(客户端--服务器)
可用版本号、当前时间、客户端随机数、会话ID、可用密码套件、可用压缩方式等。
2、ServerHello(服务器--客户端)
使用版本号、当前时间、服务器随机数、会话ID、使用密码套件、使用压缩方式等。
3、Certificate(服务器--客户端)
证书清单。
4、ServerKeyExchange(服务器--客户端)
当Certificate不满足需求时,服务器发送该消息给客户端。
5、CertificateRequest(服务器--客户端)
服务端能够理解的证书类型清单、认证机构名称清单。
6、ServerHelloDone(服务器--客户端)
服务端问完了所有问题
7、Certificate(客户端--服务器)
客户端证书。
8、ClientKeyExchange(客户端--服务器)
对称密码的密钥、消息认证码的密钥、对称密码CBC模式中的初始化向量。
9、CertificateVerify(客户端--服务器)
证明自己确实持有客户端证书和私钥。
10、ChangeCipherSpec(客户端--服务器)
此时客户端和服务器同时切换密码。实质为密码规格变更协议。
11、Finished(客户端--服务器)
使用切换后的密码发送,握手结束。
12、ChangeCipherSpec(服务器--客户端)
使用切换后的密码发送,告知客务端已切换密码。
13、Finished(服务端--客户端)
告知客户端握手结束。
14、切换至应用数据协议
密码规格变更协议:
一开始的时候,客户端和服务器的通信是没有加密的,通过重新握手(密码规格变更协议)来再次更改密码套件,使得密码同步切换。
警告协议:
当发生错误或异常时,通知对方。
应用数据协议:
用于双方之间传输应用数据。
TLS中使用的密码技术:
协议 | 密码技术 | 作用 |
---|---|---|
握手协议 | 公钥密码 | 加密预备主密码 |
单项散列函数 | 构成伪随机数生成器 | |
数字签名 | 验证服务器和客户端的证书 | |
伪随机数生成器 | 生成预备主密码、根据主密码生成密钥、生成初始化向量 | |
记录协议 | 对称密码(CBC) | 确保片段的机密性 |
消息认证码 | 确保片段的完整性并进行认证 | |
认证加密(AEAD) | 确保片段的完整性和机密性并进行认证 |