《图解密码技术》笔记

对称密码

对称密码是一种用相同的密钥进行加密和解密的技术,用于确保信息的机密性。主要是用AES。尽管对称密码能够确保消息的机密性,但需要解决将解密密钥配送给接收者的密钥配送问题。

分组密码

ECB

优点:

1. 简单

2. 快速

3. 支持并行

缺点:

1. 明文中的重复排列会反映在密文中

2. 通过删除、替换密文分组可以对明文进行操作

3. 对包含某些比特错误的密文进行解密时,对应的分组会出错;不能抵御重放攻击

备注:不应使用

CBC

优点:

1. 明文的重复排列不会反映在密文中

2. 支持并行(仅解密)

3. 能够解密任意密文分组

缺点:

1. 对包含某些错误比特的密码进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错

2. 加密不支持并行计算

备注:

CRYPTREC推荐;《实用密码学》推荐

CFB

优点:

1. 不需要填充

2. 支持并行计算 (仅解密)

3. 能够解密任意密文分组

缺点:

1. 加密不支持并行计算

2. 对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错

3. 不能抵御重放攻击

备注:

CRYPTREC推荐;

OFB

优点:

1. 不需要填充

2. 可事先进行加密、解密的准备

3. 加密、解密使用相同结构

4. 对包含某些错误比特的密文进行解密时,只有明文中相应的比特会出错

缺点:

1. 不支持并行计算

2. 主动攻击者反转密文分组中的某些比特时,明文分组中相应的比特也会被反转

备注:

CRYPTREC推荐

CTR

优点:

1. 不需要填充

2. 可事先进行加密、解密的准备

3. 加密、解密使用相同结构

4. 对包含某些错误比特的密文进行解密时,只有明文中想对应的比特会出错

5. 支持并行计算(加密、解密)

缺点:

1. 主动攻击者反转密文分组中的某些比特时,明文分组中相对应的比特也会被反转

备注:

CRYPTREC推荐;《实用密码学》推荐

公钥密码

公钥密码是一种用不同的密钥进行加密和解密的技术,和对称密码一样用于确保信息的机密性。使用最广泛的一种公钥密码算法时RSA,除此之外还有E1Gamal和Rabin算法,以及与其相关Diffie-Hellman密钥交换(DH)和椭圆曲线Diffie-Hellman密钥交换(ECDH)等技术。和对称密码相比,公钥密码的速度非常慢,因此一般都会和对称密码一起组成混合密码系统来使用。公钥密码能够解决对称密码中的密钥交换问题,但存在通过中间人攻击被伪装的风险,因此需要对带有数字签名的公钥进行认证。

RSA算法:

公钥:E,N

私钥:D,N

生成E,D,N步骤

解释用到的函数

getRandomPrimeNumber():随机得到一个质数

lcm(x, y): x, y的最小公倍数

gcd(x, y): x, y的最大公约数

1. 得到N

2. 得到L

3. 得到E

随机生成E,满足条件:

4. 得到D

单向散列函数

单向散列函数是一种将长消息转换为短散列值的技术,用于确保消息的完整性。SHA-1曾被广泛使用,但由于人们已经发现了一些针对该算法的理论上可行的攻击方式,因此该算法不应再被用于新的用途。目前已经在广泛使用的SHA-2 (SHA-224、SHA-256、SHA-384、SHA-512),以及具有全新结构的SHA-3(Keccak)算法。单向散列函数可以单独使用,也可以作为消息认证码、数字签名以及伪随机数生成器等技术的组成元素来使用。

消息认证码

消息认证码是一种能够识别通信对象发送的消息是否被篡改的认证技术,用于验证消息的完整性,以及对消息进行认证。消息认证码的算法中,最常用的是利用单向散列函数的HMAC。HMAC的构成不依赖于某一种具体的单向散列函数算法。消息认证码能够对通信对象进行认证,但无法对第三方进行认证。此外,它也无法防止否认。消息认证码也可以用来实现认证加密。


数字签名

数字签名是一种能够对第三方进行消息认证,并能够防止通信对象做出否认的认证技术。数字签名的算法包括RSA、E1Gamal、DSA、椭圆曲线DSA(ECDSA)、爱德华兹曲线DSA (EDDSA)等。公钥基础设置(PKI)中使用的证书,就是对公钥加上认证机构的数字签名所构成的。要验证公钥的数字签名,需要通过某种途径获取认证机构自身的合法公钥。


数字签名


证书

伪随机数生成器

伪随机数生成器是一种能够生成具备不可预测性的比特系列的技术,由密码和单向散列函数等技术构成。伪随机数生成器用于生成密钥、初始化向量和nonce等。

1. 线性同余

M = 正整数;

A = 大于0且小于M的整数;

C = 大于0且小于M的整数;

内部状态 = 伪随机数的种子;

while (true) {

    伪随机数 = (A * 内部状态 + C) mod M;

    内部状态 = 伪随机数;

    输出伪随机数;

}

密码学家的工具箱

密码学家的工具箱

参考

1. 《图解密码技术》

你可能感兴趣的:(《图解密码技术》笔记)