《图解密码学》学习笔记

版权声明:本文为博主原创文章,转载本站文章请注明作者和出处,请勿用于任何商业用途。 https://blog.csdn.net/wutianxu123/article/details/84638849

一、对称密码

异或(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、发送者向接收者发送两个质数PG。其中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) 确保片段的完整性和机密性并进行认证

猜你喜欢

转载自blog.csdn.net/wutianxu123/article/details/84638849