图解密码技术
目录
参考书籍:《图解密码技术:第3版》
一、对称密码和公钥密码
对称密码系统
graph LR
A[明文] -- 加密 --> B[密文]
C((密钥)) -- 加密 --> B[密文]
C((密钥)) -- 解密 --> D[明文]
B[密文] -- 解密 --> D[明文]
公钥密码系统
graph LR
A[明文] -- 加密 --> B[密文]
C((公钥)) -- 加密 --> B[密文]
E((私钥)) -- 解密 --> D[明文]
B[密文] -- 解密 --> D[明文]
公钥通信的流程
sequenceDiagram
Note left of 消息发送者A: 消息
Note right of 消息接收者B: B的公钥<br/>B的私钥
消息发送者A ->> 消息接收者B: 请把B的公钥发来
消息接收者B ->> 消息发送者A: B的公钥
Note left of 消息发送者A: 【A进行加密】<br/>消息+B的公钥→密文
消息发送者A ->> 消息接收者B: 密文
Note right of 消息接收者B: 【B进行解密】<br/>密文+B的私钥→消息
对称密码与公钥密码的比较
项目 | 对称密码 | 公钥密码 |
---|---|---|
发送者 | 用共享密钥加密 | 用公钥加密 |
接收者 | 用共享密钥解密 | 用私钥解密 |
密钥配送问题 | 存在(Diffie-Hellman密钥交换算法可解决) | 不存在,但公钥需要另外认证 |
机密性 | 好 | 好 |
常见算法 | DES、3DES、AES | RSA、ElGamal、Rabin、椭圆曲线密码 |
Diffie-Hellman算法的有效性依赖于计算离散对数的难度,离散对数的概念:如果对于一个整数 \(b\) 和素数 \(p\) 的一个原根 \(a\),可以找到一个唯一的指数 \(i\),使得
\[b = a^i \mod p, \ 0 \leq i \leq p-1
\]
分组密码的模式
分组密码:每次只能处理特定长度的一组数据的一类密码算法。常用模式有:
- ECB模式:电子密码本模式
- CBC模式:密码分组链接模式
- CFB模式:密文反馈模式
- OFB模式:输出反馈模式
- CTR模式:计数器模式
中间人攻击(man-in-the-middle attack)
sequenceDiagram
Note left of 消息发送者A: 消息
Note left of 中间攻击者M: 伪消息<br/>M的公钥<br/>M的私钥
Note right of 消息接收者B: B的公钥<br/>B的私钥
消息发送者A ->> 消息接收者B: 请把B的公钥发来
消息接收者B ->> 中间攻击者M: B的公钥
Note left of 中间攻击者M: M拦截并保存B的公钥
中间攻击者M ->> 消息发送者A: M的公钥
Note left of 消息发送者A: 【A进行加密】<br/>消息+M的公钥(误以为B的公钥)→密文
消息发送者A ->> 中间攻击者M: 密文
Note right of 中间攻击者M: 【M拦截并解密】<br/>密文+M的公钥→消息
Note right of 中间攻击者M: 【M伪造消息】<br/>伪消息+B的公钥→伪密文
中间攻击者M ->> 消息接收者B: 伪密文
Note right of 消息接收者B: 【B进行解密】<br/>伪密文+B的私钥→伪消息
中间人攻击问题的实质是公钥分配问题,该问题的解决需要引入数字签名和证书功能。
二、混合密码系统
加密流程
graph LR
A(伪随机数生成器) --生成--> B[会话密钥]
C[消息明文] --对称加密<明文>--> D[对称加密的消息密文]
B[会话密钥] --对称加密<密钥>--> D[对称加密的消息密文]
B[会话密钥] --公钥加密<明文>--> F[公钥加密的会话密钥]
E[接收者B的公钥] --公钥加密<密钥>--> F[公钥加密的会话密钥]
D[对称加密的消息密文] --组合--> G[会话密钥+消息密文]
F[公钥加密的会话密钥] --组合--> G[会话密钥+消息密文]
解密流程
graph LR
A[会话密钥+消息密文] --分离--> C[公钥加密的会话密钥]
A[会话密钥+消息密文] --分离--> B[对称加密的消息密文]
B[对称加密的消息密文] --对称解密<密文>--> F[消息]
C[公钥加密的会话密钥] --公钥解密<密文>--> D[会话密钥]
E[接收者B的私钥] --公钥解密<密钥>--> D[会话密钥]
D[会话密钥] --对称解密<密钥>--> F[消息明文]
伪随机数生成器
随机数的分类:
随机数的种类 | 随机性 | 不可预测性 | 不可重现性 |
---|---|---|---|
弱伪随机数(不可用于密码技术) | √ | x | x |
强伪随机数(可用于密码技术) | √ | √ | x |
真伪随机数(可用于密码技术) | √ | √ | √ |
随机数生成器:通过硬件生成的随机数列。
伪随机数生成器:通过软件生成的伪随机数列,需要种子(seed)对生成器的内部状态进行初始化。具体的伪随机数生成器有:
- 线性同余法(不可用于安全相关的用途)
- 单向散列函数法(如SHA-1等)
- 密码法(如AES、RSA等)
- ANSI X9.17
- 梅森旋转算法(不可用于安全相关的用途)
三、消息鉴别——消息认证码(MAC)
消息鉴别的流程
发送方:
graph LR
A[消息] -- 拼接 --> E[消息+MAC]
A[消息] -- 散列计算 --> D[消息认证码MAC]
C[共享密钥] -- 散列计算 --> D[消息认证码MAC]
D[消息认证码MAC] -- 拼接 --> E[消息+MAC]
接收方:
graph LR
A[消息+MAC] -- 分离 --> E[MAC]
A[消息+MAC] -- 分离 --> B[消息]
B[消息] -- 散列计算 --> D[MAC]
C[共享密钥] -- 散列计算 --> D[MAC]
D[MAC] --> F((对比))
E[MAC] --> F((对比))
单向散列函数
单向散列函数,又称为消息摘要函数、哈希函数:
graph LR
A[消息<br/>or<br/>原像] --> B((单向散列函数<br/>or<br/>消息摘要函数<br/>or<br/>哈希函数)) --> C[散列值<br/>or<br/>消息摘要<br/>or<br/>指纹]
单向散列函数的常见算法:
算法 | 版本 |
---|---|
MD | MD4、MD5 |
SHA | SHA-1、SHA-2(SHA-224、SHA-256、SHA-512/224、SHA-512/256、SHA-384、SHA-512)、SHA-3(Keccak) |
RIPEMD | RIPEMD-160、RIPEMD-128、RIPEMD-256、RIPEMD-320 |
重放攻击(replay attack)
sequenceDiagram
Note left of 消息发送者A: 发送者根据消息<br/>计算MAC值
Note left of 中间攻击者M: 攻击者窃听、保存
Note right of 消息接收者B: 接收者验证报文<br/>是否被篡改
消息发送者A ->> 消息接收者B: 消息+正确MAC
Note left of 中间攻击者M: 攻击者在之后时间内,<br/>不断发送窃听而来的消息
中间攻击者M ->> 消息接收者B: 消息+正确MAC
中间攻击者M ->> 消息接收者B: 消息+正确MAC
中间攻击者M ->> 消息接收者B: 消息+正确MAC
抵御重放攻击——不重数(nonce)
sequenceDiagram
Note left of 消息发送者A: 消息
Note right of 消息接收者B: B的公钥<br/>B的私钥
消息发送者A ->> 消息接收者B: 请把B的公钥发来
消息接收者B ->> 消息发送者A: B的公钥
Note right of 消息接收者B: 随机生成一个不重数R,<br/>B的私钥加密不重数R
消息接收者B ->> 消息发送者A: 加密的不重数R
Note left of 消息发送者A: 用B的公钥解密得到不重数R
Note left of 消息发送者A: 【A进行加密】<br/>消息+不重数R+B的公钥→密文
消息发送者A ->> 消息接收者B: 密文
Note right of 消息接收者B: 【B进行解密并核对不重数R】<br/>密文+B的私钥→消息+不重数R
Note right of 消息接收者B: 下一次通信时,<br/>再随机生成另外的不重数R
四、实体鉴别——数字签名与证书
数字签名的流程
发送方:
graph LR
A[消息] -- 拼接 --> E[消息+MAC]
A[消息] -- 散列计算 --> D[消息摘要]
C[发送方的私钥] -- 加密 --> F[签名]
D[消息摘要] -- 加密 --> F[签名]
F[签名] -- 拼接 --> E[消息+签名]
接收方:
graph LR
A[消息+签名] -- 分离 --> E[签名]
A[消息+签名] -- 分离 --> B[消息]
B[消息] -- 散列计算 --> F[消息摘要]
E[签名] -- 散列计算 --> D[散列值]
C[发送方的公钥] -- 散列计算 --> D[散列值]
D[散列值] --> G((对比))
F[消息摘要] --> G((对比))
数字签名与消息认证码的比较
项目 | 消息认证码(MAC) | 数字签名 |
---|---|---|
发送方 | 用共享密钥计算MAC值 | 用私钥生成签名 |
接收方 | 用共享密钥计算MAC值 | 用公钥验证签名 |
密钥配送问题 | 存在 | 不存在,但公钥需要另外认证 |
完整性 | 好 | 好 |
认证 | 仅限通信双方 | 可适用于任何第三方 |
防止否认 | 不能防止 | 可以防止 |
证书和认证机构(CA)
stateDiagram-v2
state if_state <>
消息接收者B(B生成密钥对) --> 可靠的认证机构CA(注册B的公钥): B的公钥
可靠的认证机构CA(注册B的公钥) --> 仓库(证书目录): 保存证书(=B的公钥+CA的数字签名)
仓库(证书目录) --> 消息发送者A(确认B公钥的合法性): 下载证书(=B的公钥+CA的数字签名)
五、基于口令的密码(PBE)
加密流程
graph LR
ZZ(用户记忆) --> A[口令] -- 散列计算 --> C[密钥加密密钥KEK]
Z(伪随机数生成器) --> B[盐] -- 散列计算 --> C[密钥加密密钥KEK]
Z(伪随机数生成器) --> D[会话密钥CEK] -- 对称加密<明文> --> E[KEK加密后的CEK]
C[密钥加密密钥KEK] -- 对称加密<密钥> --> E[KEK加密后的CEK]
D[会话密钥CEK] -- 对称加密<密钥> --> G[用会话密钥加密的消息]
F[消息] -- 对称加密<明文> --> G[用会话密钥加密的消息]
最后,用户将“盐”和“KEK加密后的CEK”保存在安全的地方。
解密流程
graph LR
Z(用户记忆) --> A[口令] -- 散列计算 --> C[密钥加密密钥KEK]
B[盐] -- 散列计算 --> C[密钥加密密钥KEK]
C[密钥加密密钥KEK] -- 对称解密<密钥> --> E[会话密钥CEK]
D[KEK加密后的CEK] -- 对称解密<密文> --> E[会话密钥CEK]
E[会话密钥CEK] -- 对称解密<密钥> --> G[消息]
F[用会话密钥加密的消息] -- 对称解密<密文> --> G[消息]
六、密码软件PGP的原理
发送者A:生成数字签名并加密
生成数字签名:
graph LR
Z(发送者A的记忆) --> A[口令]
A[口令] -- 散列计算 --> C[私钥的解密密钥]
B[盐] -- 散列计算 --> C[私钥的解密密钥]
C[私钥的解密密钥] -- 对称解密<密钥> --> E[A的私钥]
D[已加密的A的私钥] -- 对称解密<密文> --> E[A的私钥]
F[消息] -- 散列计算 --> G[消息摘要] -- 公钥加密<明文> --> H[数字签名]
E[A的私钥] -- 公钥加密<密钥> --> H[数字签名]
消息加密:
graph LR
A[数字签名] --拼接--> C[签名+消息]
B[消息] --拼接--> C[签名+消息]
C[签名+消息] -- 压缩 --> D[压缩消息] -- 对称加密<明文> --> H[加密的压缩消息]
E[会话密钥] -- 对称加密<密钥> --> H[加密的压缩消息]
Z(伪随机数生成器) --> E[会话密钥] -- 公钥加密<明文> --> G[加密的会话密钥]
F[接收者B的公钥] -- 公钥加密<密钥> --> G[加密的会话密钥]
H[加密的压缩消息] --拼接--> I[报文数据]
G[加密的会话密钥] --拼接--> I[报文数据]
接收者B:解密并验证数字签名
消息解密:
graph LR
Z(接收者B的记忆) --> A[口令]
A[口令] -- 散列计算 --> C[私钥的解密密钥]
B[盐] -- 散列计算 --> C[私钥的解密密钥]
C[私钥的解密密钥] -- 对称解密<密钥> --> E[B的私钥]
D[已加密的B的私钥] -- 对称解密<密文> --> E[B的私钥]
F[报文数据] -- 分解 --> H[加密的会话密钥]
E[B的私钥] -- 公钥解密<密钥> --> I[会话密钥]
H[加密的会话密钥] -- 公钥解密<密文> --> I[会话密钥] -- 对称解密<密钥> --> J[压缩消息]
F[报文数据] -- 分解 --> G[加密的压缩消息] -- 对称解密<密文> --> J[压缩消息]
验证数字签名:
graph LR
Z[压缩消息] -- 解压缩 --> A[消息+签名]
A[消息+签名] -- 分解 --> B[数字签名]
A[消息+签名] -- 分解 --> C[消息] -- 散列计算 --> D[消息摘要]
B[数字签名] -- 公钥解密<密文> --> F[散列值]
E[A的公钥] -- 公钥解密<密钥> --> F[散列值]
D[消息摘要] --> G(对比)
F[散列值] --> G(对比)