G
N
I
D
A
O
L

图解密码技术

参考书籍:《图解密码技术:第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(对比)
posted @ 2024-02-03 17:43  漫舞八月(Mount256)  阅读(39)  评论(0编辑  收藏  举报