# §1密码应用基础知识

LLMS index: [llms.txt](/wikis/llms.txt)

---

# 密码应用基础知识

## 密码与信息安全

![](/wikis/_resources/§1密码应用基础知识/abf26ac93856d367cf7c11ec97cd558e_MD5.svg)

### 信息安全三要素（CIA）

> 1. **机密性(Confidentiality)**：保证机密信息在传输、存储和使用过程中不被未授权的第三方进行窃听，或窃听者无法了解信息的真实含义。
> 2. **完整性(Integrity)**：确保收到的数据和对方所发出的信息完全一样，防止数据在传输或存储过程中被非法篡改。
> 3. **可用性(Availability)**：保证合法用户对信息和资源的使用不会被不正当地拒绝。

除CIA外，还有一些属性也是要求达到的，如可控性(Controllability)和可追溯性(Traceability)等。

### 密码的含义

> 1. **密码 (cipher)** ：原始信息（称为明文）按指定規则（称为算法）转换（此过程称为加密）为使非授权者无法了解的特定符号，这些转换而来的符号（称为密文），必须具有已授权者可以恢复（此过程称为解密）的特性；所谓已授权是指它合法地拥有了可以解密密文的关键信息（称为密钥）。——密码学定义
> 2. **密码 (cipher)** ：是指采用特定变换的方法对信息等进行加密保护、安全认证的技术、产品和服务。按照所保护信息的不同分为商用密码（不涉及国家秘密）、普通密码和核心密码（涉及国家秘密）。——《中华人民共和国密码法》
> 3. **密码 (Password)**：即口令、暗语等，用于认证用途的一组文字或字符。——日常用语

### 密码的功能

| **功能范畴** | **功能**                 | **含义**                                         |
| -------- | ---------------------- | ---------------------------------------------- |
| 加密保护     | 机密性(Confidentiality)   | 也称保密性，指确保信息不会泄露给未经授权的个人、计算机和其他实体的性质。           |
|          | 完整性(Integrity)         | 指确保信息不会遭遇未经授权篡改或破坏的性质。                         |
| 安全认证     | 真实性(Authenticity)      | 指确保主体或资源的身份是所声称身份的特性，真实性适用于诸如用户、过程、系统和信息这样的实体。 |
|          | 不可否认性(Non-repudiation) | 也称抗抵赖性，确保网络信息系统的信息交互过程中参与者不能否认或抵赖曾经完成的操作。      |

### 密码与信息安全的关系

> 1. 密码是保障网络与信息安全的核心技术和基础支撑：是解决网络与信息安全问题最有效、最可靠、最经济的手段；它就像网络空间的 DNA ，是构筑网络信息系统免疫体系和网络信任体系的基石，是保护党和国家根本利益的战略性资源，是国之重器。
> 2. 信息安全不能全靠密码技术：信息安全是数学、计算机科学、电子与通信、密码学的交叉学科。除密码技术外，灾备技术、审计技术、物理安全、通信技术、安全管理等也是非常重要的信息安全技术。

## 密码算法基础

![](/wikis/_resources/§1密码应用基础知识/a9ef1fbd1e46e74142ec8074d0297cd0_MD5.svg)

### 对称密码体制

**基本原理**：加密和解密使用相同的密钥。  
**工作流程**：

1. 在数据发送前，双方先通过安全通道交换共同的密钥；
2. 发送方使用对称密码算法和密钥加密明文后生成密文；
3. 密文在不安全的信道上传输；
4. 接收方收到密文后，使用相同的算法的逆过程和相同的密钥解密密文，得到明文。

#### 对称密码体制——流密码算法（Stream cipher）

**基本原理**：将明文信息按字符（具体是二进制位）逐位地加密的一类密码学算法。  
**实现**：例如数学上的异或（XOR、⊕）操作提供了一种极好的方案：相同为假（0）、相异为真（1）。

> 0 ⊕ 0 = 0  
> 0 ⊕ 1 = 1  
> 1 ⊕ 0 = 1  
> 1 ⊕ 1 = 0

假设名为为M，密钥为K，密文为C，则  
加密过程：C = M ⊕ K  
解密过程：M = C ⊕ K

|**明文数据（M）**|100111001|
|---|---|
|**密钥（K）**|101001110|
|**密文数据（C）**|001110111|

**特征**：

1. 不改变明文长度，运算速度非常快，广泛应用于实时性要求比较高的场景，**代表算法为RC4（Rivest Cipher 4）**，曾作为1995年的SSL，1997年的无线通信协议WEP以及后来1999年TLS协议加密套件的算法。其密钥由RSA或者DH等密码协商算法一次性生成使用。此外流密码算法还有A5、SEAL等。
2. 流密码算法的关键是一次性的密码本（one-time pad），这样才能确保消息不被破解。
3. 目前RC4算法已经不推荐使用。

**流密码算法的安全问题**：  
如果原始key不变的话，之前的密文很容易被破解。比如有人用明文A，加密后得到的密文为EA。这时如果密钥不变，而我们拦截到密文EA，那么我们怎样能破解密文呢？  
我们可以用明文B去请求一次加密，得到密文E。这时我们手头上有对方的密文EA，我们自己明文B以及对应的密文EB，所以我们就可以推算出明文 A = EA ⊕ EB ⊕ B，推导过程如下：

> EA = A ⊕ Key  
> EB = B ⊕ Key

根据相同的值异或为0，那么我们可以推出：

> EA ⊕ EB  
> = A ⊕ Key ⊕ B ⊕ Key  
> = A ⊕ B ⊕ (Key ⊕ Key)  
> = A ⊕ B，

这时两边同时异或B：

> EA ⊕ EB ⊕ B  
> = A ⊕ B ⊕ B  
> = A ⊕ (B ⊕ B)  
> = A，

所以明文A = EA ⊕ EB ⊕ B

流密码的密文和明文通常直接相关，攻击者无法通过单个密文“修改”或“选择”密文来控制解密过程。因此一般不适用选择明文或选择密文攻击。
##### **已知明文攻击 (Known-Plaintext Attack)**

在这种攻击中，攻击者已知一些明文和相应的密文。通过分析这些已知的明文密文对，攻击者可以推测出密钥流的部分或全部，从而解密其他密文。这种攻击在流密码算法中较为常见，因为流密码的加密过程通常是逐位或逐字节的，攻击者可以通过比较已知明文与密文之间的关系来破解密钥流。
#### 对称密码体制——块密码算法（Block cipher）

**基本原理**：加解密的时候把原文分成固定长度的块，每次对这些数据块迭代进行加解密计算，又叫分组密码算法。  
**工作流程**：

1. 将全量明文M按照算法要求拆分成固定长度的明文块M0至Mn，也就是每一小块一小块的分组；
2. 如果明文长度不是分组大小的整数倍，则使用Padding进行填充；
3. 对于每一个明文块通过加密算法进行迭代加密；
4. 多个明文块加密的加过合并起来，成为最终的明文C。

**关键操作**：对块逐个进行加解密计算的迭代模式包括:ECB(Electronic Code Book,电子密码本)、CBC (CipherBlock Chaining,加密块链接)、CFB(Cipher Feedback Mode,加密反馈模式)、CTR(Counter,计数器模式)等。在对每一个块进行加密计算时，常用的操作包括：字节替换、行位移、列混淆、加轮密钥。  
**代表算法**：

| 算法名称 | 描述                                                                                                                                                                                                    | 密钥长度（位,bit）  | 加密强度 | 性能  | 破解难度（理论）                     | 公布时间 | 是否国密 |
| ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ---- | --- | ---------------------------- | ---- | ---- |
| DES  | 美国采用IBM公司设计的加密方案作为正式数据加密标准，起名DES，加密过程为将明文分组，对每个分组进行初始字节置换生成对应的子密钥，对每一个迭代进行置换，异或运算等运算，得到分组密文，迭代直到全部完成，不包含非线性变换，分组长度64，迭代采用ECB或CBC，密钥中的8位用作校验位。                                                         | 56           | 弱    | 快   | 密钥空间：256  <br>时间复杂度：≈41.7天   | 1977 | 否    |
| 3DES | 使用2个或者3个56位的密钥对数据进行三次加密，采用了加密→密→加密的方式，即首先用K1进行DES加密，然后用K2进行DES解密 (由于K1≠K2，所以解密也就变成加密)，最后用K3进行DES再加密，因此可以兼容DES。                                                                                        | 112/168      | 中    | 慢   | 略高于DES                       | 2001 | 否    |
| IDEA |                                                                                                                                                                                                       | 分组64位，密钥128位 |      |     |                              |      |      |
| AES  | AES是一种加密标准，实际使用的算法为Rijndael，由比利时密码学家Joan Daemen和Vincent Rijmen所设计，加密过程主要是将明文进行分组，最后一组补位;对于每一个分组进行字节置换，行位移，列混淆以及加轮密钥的操作，不同的密钥长度进行不同的轮数操作，有10轮，12轮，14轮，得到分组密文;迭代直到完成全部迭代过程。分组长度128位，支持ECB\CBC\CTR等迭代模式。 | 128/192/256  | 强    | 快   | 密钥空间：＞2128  <br>时间复杂度：＞1050年 | 2002 | 否    |
| SM1  | 安全保密强度及相关软硬件实现性能与 AES 相当，算法不公开，仅以IP核的形式存在于芯片中，需要调用加密芯片的接口使用。                                                                                                                                          | 128          | 强    | 快   | 相当于AES                       | 暂未公开 | 是    |
| SM4  | 一种 Feistel 结构的分组密码算法，其分组长度和密明长度均为128bit。加解密算法与密钥扩张算法都采用 32 轮非线性迭代结构。解密算法与加密算法的结构相同，只是轮密钥的使用顺序相反，即解密算法使用的轮密钥是加密算法使用的轮密钥的逆序。中国第一次由专业密码机构公布并设计的商用密码算法。                                                   | 128          | 强    | 快   | 相当于AES                       | 2012 | 是    |
| SM7  | 适用于非接触式IC卡，应用包括身份识别类应用(门禁卡、工作证、参赛证)票务类应用(大型赛事门票、展会门票)，支付与通卡类应用(积分消费卡、校园一卡通、企业一卡通等)。                                                                                                                   | 128          | 强    | 快   | 相当于AES                       | 暂未公开 | 是    |

### 非对称密码体制

**基本原理**：基于数学难题，加密和解密使用不同的密钥，且一直密码算法和加密密钥，求解密密钥在计算上是不可行的。  
**工作流程**：

1. 发送方和接收方分别拥有与一对密钥，其中一个叫公钥，是对外公开的，另一个叫私钥，只有自己知道；
2. 通信时，发送方使用接收方的公钥加密明文，并将加密后的密文通过不安全的信道发送给接收方；
3. 接收方收到密文时，使用自己的密钥解密，得到原始明文，且只有接收方自己可以解密，因为其他实体不具有接收方的私钥。

**签名流程**：

1. 与加密流程相反，发送方使用自己的密钥加密明文，并将加密后的密文作为签名发送给接收方；
2. 接收方收到密文时，使用发送方的公钥解密，得到原始明文，以验证该明文是否来自发送方。

**代表算法**：

|算法名称|描述|密钥长度（位,bit）|加密强度|性能|破解难度（理论）|公布时间|是否国密|
|---|---|---|---|---|---|---|---|
|DH|由Diffie 和 Hellman 在密码学新方向中提出的思想，主要解决密钥分发问题，是公钥密码学的开端，其安全性取决于离散对数问题的难解性。|--|--|--|高|1976|否|
|RSA|由Rivest、Shamir、Adleman创建，基于大因数分解数学难题，根据数论，寻求两个大素数比较简单，而将它们的乘积进行因式分解却极其困难，因此可以将乘积公开作为加密密钥，乘积的长度就是密钥长度，可以用于加密、签名和密钥交换。|768、1024、2048、3072、4096及以上|2048位以上强|1024位以上慢|768位已破解，1024位暂无公开报道|1977|否|
|DSA|数字签名算法，是一种标准的 DSS(数字签名标准)，是Schnorr和ElGamal签名算法的变形，该算法的安全性依赖于计算模数的离散对数的难度。|512、1024等|--|--|512位存在破解可能|1991|否|
|ECC|基于椭圆曲线的离散对数难题设计一种新的公钥密码体制，其公钥为椭圆曲线方程上的点坐标，相较于RSA，具有安全强度高、密钥长度短、计算效率高、设计更复杂等特点。可以用于加密、签名和密钥交换。160位的密钥产生一个安全级，据分析，160位ECC加密安全性相当于1024位RSA加密，210位ECC加密安全性相当于2048位RSA加密。|160、210、224、256、384、512等|强|快|高|1985|否|
|ECDH|椭圆曲线ECC的DH变种，即密钥交换过程不再通过简单的模幂运算，而道过素数域下的模圆曲线的标量乘法，将算法所生成公钥中的一个坐标值作为协商的密钥使用。|--|--|--|高|--|否|
|ECDSA|椭圆曲线数字签名算法(ECDSA)是使用曲线密码 (ECC)对数字签名算法(DSA)的模拟。|512、1024等|--|--|高|1999|否|
|SM2|是我国自主设计的公钥密码算法，基于更加安全先进的椭圆曲线密码机制，在国际标准的ECC椭圆曲线密码理论基础上进行改进而来(相当于国密版ECC)。包含SM2-1数字签名算法、SM2-2密钥协商协议、SM2-3公钥加密算法。|公钥512、私钥256|高|快|高|2010|是|
|SM9|标识密码算法(IBC)，公钥是用户的身份标识，而私钥通过绑定身份标识与系统主密钥 (master key)生成，省略申请数字证书及证书管理，但计算复杂度更高，可适用于离线加密场景。|--|等同于RSA3072|慢|高|2016|是|

#### 非对称密码体制——DH算法

K=(Abp)=(gap)bp=(gabp)=(gbp)ap=BapK=(Abmodp)=(gamodp)bmodp=(gabmodp)=(gbmodp)amodp=Bamodp

**机制**：用于解决对称加密密钥的安全分发问题。也就是说密钥本身不需要通过网络传输，只需要传输计算密钥所用的公共参数，通过数学方法保证双方计算出的密钥是一样的。  
**安全性**：密钥交换双方不对对方的认证做认证，因此可能存在中间人攻击。  

#### 非对称密码体制——RSA算法

**原理**：

1. 选择两个大素数p和q，计算其乘积n=p×q，计算其欧拉函数：φ(n)=φ(p)×φ(q)=(p-1)(q-1);
2. 选择一个e，使得1<e<φ(n)，并且e与φ(n)互质;
3. 算出e的一个相对于φ(n)的乘法逆元d；
4. 公钥：(e,n)，私钥：(d,n)，信息（明文）m长度小于n；
5. 加密：c=me(mod n)，解密：m=cd(mod n)。

**安全性**：RSA破解的本质是对大数n进行因式分解，主要以暴力破解为主，但在现有计算条件下，在有效时间内仍难以实现。已知被破解的为RSA768，RSA1024存在被破解的风险，RSA4096位几乎无法破解。  
**应用要点**：一般建议使用RSA2048及以上，e一般默认使用65537.通常情况下，RSA多用于会话密钥协商或签名认证，不直接用于数据加密。

![](/wikis/_resources/§1密码应用基础知识/8a504b8323c03b889a68b64bab5ec384_MD5.svg)

#### 非对称密码体制——ECC

**椭圆曲线标准方程**：

Ax3+Bx2y+Cxy2+Dy3+Ex2+Fxy+Gy2+Hx+Iy+J=0Ax3+Bx2y+Cxy2+Dy3+Ex2+Fxy+Gy2+Hx+Iy+J=0

**原理**：对于椭圆曲线方程Ep(a,b)，如：

y2=x2+ax+by2=x2+ax+b

其公钥为曲线上一个点的坐标D(x,y)，私钥是曲线域范围内的一个随机整数d(d<n,n为Ep(a,b)的基点G，nG=O∞)，则有D=dG。  
根据有限域上的假发规则，已知d和G求D是容易的，但反过来已知G和D，求d是非常困难的，以此保证私钥的安全性，这就是椭圆曲线的离散对数难题。  
**公钥加密**：选择随机数r，将消息M生成密文C，该密文是一个点对C={rG,M+D}，其中D为密钥。  
**私钥解密**：M+rD-d(rG)=M+r(dG)-d(rG)=M，其中d为私钥。  
**用途**：加密、签名（ECDSA）和密钥交换（ECDH）。

### 对称密码体制VS非对称密码体制

||优点|缺点|
|---|---|---|
|对称密码体制|1. 加密、解密计算量小，处理速度快，具有很高的数据吞吐率，硬件加密实现可达几百兆字节每秒，软件也可以达到兆字节每秒的吞吐率，适合对大量数据进行加密的场景；  <br>2. 加密后的密文大小几乎没有变化（只有在需要填充时会发生微小变化）；  <br>3. 在保证Key安全的前提下，安全性较高。|1. 密钥是保密通信安全的关键，发信方必须安全、妥善地把密钥护送到受信方，不能泄露其内容；  <br>2. 对称密钥算法的密钥分发过程十分复杂，所花代价高；  <br>3. 多人通信时密钥组合数量会出现爆炸性膨胀，使密钥分发更加复杂化，N个人进行两两通信，总共需要的密钥数位N(N-1)/2,通信双方必须统一密钥，才能发送保密的信息；  <br>4. 对称密码算法还存在数字签名困难问题。|
|非对称密码体制|1. 密钥分配简单，不需要秘密的通道和复杂的协议来传送密钥，不用担心密钥劫持问题；  <br>2. 密钥数目和参与者数目相同，每一个用户只需要保管自己的密钥，N个用户仅需要产生N对密钥，密钥少，便于管理；  <br>3. 基于数学难题，安全性更高；  <br>4. 支持对发送者验证，可以实现数字签名。|1. 加密、解密处理速度较慢（数百倍）；  <br>2. 同等安全强度下，非对称密码体制的密钥位数要求更长；  <br>3. 加密之后，密文文件变得极为庞大。|

### 对称与非对称密码的结合使用——数字信封

**工作流程**：

1. 发送者生成会话密钥，作为对称加密算法的密钥，加密数据；
2. 使用接收者的公钥加密会话密钥，并将两段密文一起发送给接收方；
3. 接收者通过自己的私钥解密会话密钥；
4. 然后使用会话密钥解密数据。

**数字信封**：使用接收方公钥加密的会话密钥被称为数字密钥。  
**特点**：兼顾二者优点，规避二者缺点。

### 散列函数（Hash）

**散列函数**：指把任意长度的输入消息数据转化为固定长度的输出数据的一种密码算法，又称为哈希函数、杂凑函数、单向函数、摘要算法等，摘要算法无密钥。  
**散列值**：散列函数所产生的固定长度的输出数据称为散列值、哈希值、摘要值等，也常被称为数据的指纹（FingerPrint）。  
**用途**：数据完整性的判定、无需还原的加密场景（如口令）的加密存储、基于挑战——应答模式的身份认证、与公钥密码算法结合用于数字  
**类型**：主要分为两大类，MD（Message Digest，信息摘要算法）、SHA（Secure Hash Algorithm，安全散列算法）；另国密标准SM3也属于散列算法。  
**四大特征**：

> 1. 固定大小：散列函数可以接收任意大小的数据，并输出固定大小的散列值；
> 2. 雪崩效应：原始数据就算修改哪怕一个比特，计算得到的散列值也会发生巨大的变化；
> 3. 单向性：只可能从原始数据计算得到散列值，不可能从散列值恢复哪怕一个比特的原始数据；
> 4. 强抗碰撞：几乎不能找到另外一个数据和当前数据计算的散列值相同，因此散列函数能够标识数据的唯一性，这也是他被成为数据指纹的原因。

![](/wikis/_resources/§1密码应用基础知识/553d137547a5e99f9c544ad0b527cbd4_MD5.png)  
**代表算法**：

|算法名称|   |描述|分组长度|散列值长度|计算复杂度|碰撞难度|公布时间|是否国密|
|---|---|---|---|---|---|---|---|---|
|MD5|   |MD是Message Digest Algorithm的简称，目前最新为第五版及MD5，历史版本有MD4、MD2等，消息摘要算法各个版本间的结果是不一样的。|512bit|128bit|低|1996：被证明存在安全隐患；  <br>2004：王小云等人给出了MD5杂凑函数的杂凑碰撞（从理论上说试用MD5的数字签名可以伪造）；  <br>2007：首次提出利用MD碰撞伪造CA整数的理论方法；  <br>2008：攻击成功伪造合法的CA证书。|1992|否|
|SHA1|   |安全哈希算法（Secure Hash Algorithm）主要适用于数字签名标准（Digtal Signature Standard DSS）里面定义的数字签名算法（Digtal Signature Algorithm DSA）。|1bit|160bit|中|2005：王小云等人，在2个计算复杂度内找到碰撞（理论上可破解）；  <br>2017：Google创建了两个有着相同SHA-1值但内容不同的PDF文件，这代表SHA1算法已被正式攻破。|1995|否|
|SHA2系列|SHA224|名称来自于安全散列算法2（Secure Hash Algorithm 2），一种密码散列函数算法标注， 属于SHA算法质疑，是SHA-1的后继者。其下又可再分为六个不同的算法标准。这些变体除了生成摘要的长度、循环运行的次数等一些微小差异外，算法的基本结构是一致的。|512bit|224bit|高|高|2001|否|
|SHA256|512bit|256bit|高|高|2001|否|
|SHA384|512bit|384bit|高|高|2001|否|
|SHA512|512bit|512bit|高|高|2001|否|
|SM3|由王小云院士等设计的国密杂凑算法，可用于商用密码应用中的数字签名和验证、消息认证码的生成与验证以及随机数的生成。|512bit|256bit|高|高|2016|是|

**安全性探讨**：  
一、破解的可能性与难度  
假设原文含有信息量（I），而签名的长度有限（如MD5的128位），则它的信息量为（i=2128），通常i＜I（除非原为非常短），所以可以这么说：I=i+i'，因为I没有限制，而i有限制，则i'也是一个没有限制的量。当进行摘要算法后，i'信息就丢失了。  
反过来，如果现在这种摘要算法被攻破了，可以从i反推回去，但因为i'信息已经丢失，意味着i+I'（其中I'为任意信息）都可能是I（碰撞），但I'是一个无穷集合，并且i'属于I'。这说明：理论上可以从I'中找到i'从而恢复出原文I，但是可能性为零（1/∞=0）。

> 1. 对原始数据计算散列值本质上是一个有损压缩的过程，一定存在信息损失，所以碰撞一定存在；
> 2. 从散列值恢复哪怕一个比特的原始数据在计算上不可能。

二、破解的突破口

> 1. 碰撞：找到一个I'，使I'的散列值与I的散列值相等，由于有损压缩，所以I'不一定等于I（部分破解）；
> 2. 从i反向计算出I。（真正意义上的破解，但由于存在信息损失，所以无法实现。）

三、实际效果

> 1. 王小云差分攻击法：给定一个1024位的原文I，加上一个特定的常数得到的新的明文I'，I和I'的MD5值相等。即给定MD5（I）=Hash，在有效的时间内找到MD5（I'）=MD5（I）=Hash，从而实现碰撞。
> 2. [CMD5.COM](http://cmd5.com/) 类网站：通过穷举字符组合的方式，创建明文密文对应查询数据库（约百万亿级别），搜索时穷举搜索与给定散列值相同的明文，除了穷举外，可以通过哈希链表、彩虹表法来提升查询效率。

四、中间人攻击

> 攻击者将发送方的消息阶段，并另外伪造一条消息，并计算了散列值，然后将该消息和散列值发送给接收方；接收方收到消息后，重新计算散列值，发现与收到的散列值一致，认为消息没有被篡改，但实际上这并不是发送方的原始消息，单纯使用散列函数无法保证完整性校验结果的有效性。

#### 消息认证码（MAC）

消息认证码（Message Authentication Code,MAC）是一种确认完整性并进行认证的基数，简称为MAC。消息认证码的输入包括任意长度的消息和一个发送者与接收者之间的共享的密钥，他可以输出固定长度的数据，这个数据成为MAC值。具有以下两种功能：完整性校验（利用散列函数的性质实现）、身份认证（利用预共享密钥实现）。  
**工作流程**：

1. 发送者与接收者事先共享密钥K（上图中的KEY1与KEY2值保持一致）；
2. 发送者根据消息计算MAC值（试用密钥KEY1的原始消息计算MAC1）；
3. 发送者将原始消息和MAC1发送给接收者；
4. 接收者根据收到的原始消息计算MAC2（使用密钥KEY2）；
5. 接收者将自己计算出的MAC2与发送者收到的MAC1比对；
6. 如果MAC一致，接收者可以判定消息的确来自接收者（认证成功）且没有被篡改或者出现传输出错的情况；如果不一致，可判断消息不是来自发送方（认证失败）。  
    ![](/wikis/_resources/§1密码应用基础知识/e5511dd33749c7684a4f927bf06e767a_MD5.png)

**不同点**：散列函数中计算散列值时不需要共享密钥，而消息认证码中则需要使用发送者与接收者之间共享的密钥。  
**实现方式**：将分组密码的密钥作为消息认证的共享密钥，并用CBC（加密块链接）将消息全部加密。此时，由于初始化向量是固定的，且MAC值不需要加密，因此可将除最后一个分组意外的密文部分全部丢弃，并将最后一个分组用作MAC值。由于CBC模式的最后一个分组会受到整个消息以及密钥的双重影响，因此可将它用作消息认证码，例如AES-CMAC（RFC4493）。此外流密码和公钥密码等也可以实现消息认证码。

#### 单向散列函数-HMAC

**含义**：HMAC（Keyed-Hashing for Message Authentication）是一种使用单向散列函数来构造消息认证码的方法（RFC2104），HMAC的MAC算法是Hash算法，它可以是MD5、SHA-1、SHA-256、SM3等，他们分别被称为HMAC-MD5、HMAC-SHA1、HMAC-SHA256、HMAC-SM3等。  
**应用**：

> 1. 客户端向服务端发送请求，要求进行身份验证；
> 2. 服务端从数据库中查找用户名是否合法，若不合法则不做处理；
> 3. 服务端产生一个“挑战”随机数，发送给客户端，作为“提问”；
> 4. 客户端使用：用户表示+H（共享密钥+挑战）、H（password+挑战）等形式做应答；
> 5. 服务端收到应答和自己计算的比较，相等则通过认证，反之则失败；
> 6. 服务端响应客户端成功或失败。

**安全性分析**：在这个过程中，可能遭到安全攻击的是服务器发送的随机值和用户发送的HMAC结果，而对于截获了这两个值的黑客而言这两个值是没有意义的，绝无获取用户密码的可能性。  
**存在的问题**：

> 1. MAC（HMAC）需要发送者和接收者之间共享密钥，密钥如何安全分发？
> 2. 接收方可以通过双方预共享的密钥来确认消息是否确实由发送方发出，但他如何向第三方证明？
> 3. 如果发送方否认自己法国消息（即抵赖，repudiation），接收方如何抵御发送方的抵赖行为？

## 数字签名和数字证书

### 数字签名（Digital Signautres）

**签名**：被用作签名者身份的证明一些方式或特征，如字迹、指纹等。这是因为签名是可信的，不可伪造的，不可重用的，不可递来的，签名的文件是不可改变的。  
**数字签名**：又称公钥数字签名，是只有信息的发送者才能产生的别人无法伪造的一段字符串，通过在数据单元上附加这个字符串或对数据单元进行密钥交换，从而使接收者可以确认数据来源和完整性。  
**实现方法**：基于公钥密码体制和散列函数。  
**功能**：数据完整性校验、发送者行为不可否认。  
**工作流程**：

> 1. 发送者使用单向散列函数计算明文的散列值，得到明文的摘要；
> 2. 发送者使用自己的私钥对摘要进行加密(签名)，得到一份加密地摘要；
> 3. 发送者把明文、加密的摘耍(签名)打包一起发给用户B，（此处传输的过程先不考虑对明文的加密处理）；
> 4. 接收者将收到的内容拆分为明文和数字签名两部分，使用发送者的公钥对数字签名进行解密，得到原摘要；
> 5. 接收者使用相同的散列函数计算明文的散列值，得到新摘要；
> 6. 接收者对比解密出的原摘要和自己计算出的新摘要；
> 7. 如果两份摘要相等，说明文件经过发送者签名之后，在传输的过程中没有被更改；若不相等，说明文件在传输过程中被更改了，或者说已经不是原来的文件了，此时认为明文的完整性遭到破坏。

![](/wikis/_resources/§1密码应用基础知识/553d137547a5e99f9c544ad0b527cbd4_MD5.png)

### 数字证书（Digital Certificate）

**证书**：由机关、学校、团第等第三方权威部门颁发的证明资格或权力的文件，是标明（或帮助断定）事理的一个凭证。如身份证、学位证、工作证、职业资格证等等，证书具备以下特点：

> 1. 由第三方权威机构签发；
> 2. 有被授予证书者的信息；
> 3. 签发时间，有效期等；
> 4. 有明确的用途。

**含义**：指在数字世界中标志通讯各方身份信息的一个数字特征，通信各方可以在网上用它来识别对方的身份。  
**功能**：实现证书持有者身份与公钥信息的绑定。  
**应用**：电子邮件、VPN、HTTPS等。

![](/wikis/_resources/§1密码应用基础知识/2be96a511aa554b259a9bca20f2639a0_MD5.svg)

**格式**：

**说明**：

> 1. 版本信息(Version),证书使用的 X.509 版本号;
> 2. 证书的序列号:每个证书都有一个唯一的证书序列号；
> 3. 证书所使用的签名算法；
> 4. 发行者名称(Issuer Name)：证书的发行机构名称，命名规则一般采用X.500格式；
> 5. 证书的有效期：通用的证书般采用UTC时间格式，它的计时范围为1950-2049；
> 6. 主体名称(Subject Name)：证书所有者的名称，命名规则一般采用X.500格式；
> 7. 主体公钥信息：证书所有人的公钥；
> 8. 发行者者一标识符(Unique Identifier)：位串值，用于明确CA名称，常被忽略；
> 9. 主体唯一标识符(Subject Unique Identifier)：位串值，用于明确主体名称，常被忽略；
> 10. 扩展字段(Extensions)：一个或多个扩展字段；
> 11. 证书发行者对证书的签名(Signature)：证书中其他字段的报文摘要，并用 CA 的私钥加密。

## 公钥基础设施（PKI）

![](/wikis/_resources/§1密码应用基础知识/79548a9f3e6801c422a53fbe5e1fb829_MD5.svg)

### 概念和定义

**定义**：PKI（Public Key Infrastructure）公钥基础设施是通过公钥基数和数字证书来提供信息安全服务并负责验证数字证书持有者身份的一种体系。  
**功能**：通信实体身份认证、行为不可否认、通信数据的机密性、完整性保护。  
**职责**：负责数字证书全生命周期的管理。

> 1. 签发证书；
> 2. 证书、密钥对的自动更新；
> 3. 签发证书黑名单；
> 4. 密钥备份与恢复功能
> 5. 密钥历史的管理；
> 6. 证书鉴别、交叉认证（证书链认证）

**基本组件**：证书颁发机构（CA）、证书注册机构（RA）、证书资料库（LDAP）、终端实体（EE）、此外还可以包括证书吊销系统、密钥备份及恢复系统、PKI应用接口系统等构成部分。  
![](/wikis/_resources/§1密码应用基础知识/29e614f625d82705bd7e45b42ae7fb25_MD5.png)

### 主要组件

|**组件**|**描述**|
|---|---|
|数字证书（Digtial Certificate）|包含了用于签名和加密数据的公钥的电子凭证，是PKI的核心元素，X.509证书采用ASN.1语法进行编码。|
|认证颁发机构（CA）|数字证书的申请及签发机构，CA必须具备权威性。|
|证书注册机构（RA）|CA机构授权的专门供要申请证书的用户进行注册的机构，这是为解决终端用户数量增加而集中注册遇到的麻烦。一个CA可以授权多个RA，RA的主要目的就是分担CA直接申请审理注册的功能，提高工作效率。  <br>1. 接受用户的注册申请，审查用户的申请资格，并决定是否同意CA给其签发数字证书；  <br>2. 代表终端用户启动与CA的认证进程；  <br>3. 生成用户的密钥资料；  <br>4. 执行一定的密钥证书生命周期管理功能，如产生吊销请求或代表用户进行密钥恢复操作。  <br>RA不能颁发证书和吊销证书。|
|证书资料库|存储已签发的数字证书和公钥，以及相关证书目录，用户可由此获得所需的其他用户的证书及公钥。LDAP常被用于存放证书和CRL，并向用户提供检索服务。|
|证书吊销列表（CRL）/OCSP|在有效期内吊销得到证书列表，在线证书状态协议OCSP是活的证书状态的国际协议。|
|密钥备份及恢复|为避免用户丢失解密密钥而无法解密合法数据的情况，PKI提供备份与恢复密钥的机制，必须由可信的机构来完成。并且密钥备份与恢复只能针对解密密钥，签名私钥不能够作备份。|
|PKI应用接口（API）|为各种各样的应用提供安全、一致、可信的方式与PKI交互，确保建立起来的网络环境安全可靠，并降低管理成本。|

### 生命周期（工作流程）

**证书申请**：证书申请即证书注册，就是一个PKI实体向CA自我介绍并获取证书的过程。  
**证书颁发**：PKI实体向CA申请本地证书时，如果有RA，则先由RA审核PKI实体的身份信息，审核通过后，RA将申请信息发送给CA。CA再根据PKI实体的公钥和身份信息生成本地证书，并将本地证书信息发送给RA。如果没有RA，则直接由CA审核PKI实体身份信息。  
**证书存储**：CA生成本地证书后，CA/RA会将本地证书发布到证书/CRL存储库中,为用户提供下载服务和目录浏览服务。  
**证书下载**：PKI实体通过SCEP或CMPv2协议向CA服务器下载已颁发的证书，或者通过LDAP、HTTP以及带外方式，下载已颁发的证书。该证书可以是自己的本地证书，也可以是CA/RA证书或者其他PKI实体的本地证书。  
**证书安装**：PKI实体下载证书后，还需安装证书，即将证书导入到设备的内存中，否则证书不生效。通过SCEP协议申请证书时，PKI实体先获取CA证书并将CA证书自动导入设备内存中，然后获取本地证书并将本地证书自动导入设备内存中。  
**更新或撤销**：实体希望更新或撤消自己的证书时《或者密钥泄漏、服务过期等)，向CA提交申请。CA批准实体撤消证书，并更新CRL(证书吊销列表)，发布到LDAP服务器。

![](/wikis/_resources/§1密码应用基础知识/67a56fb672d1ff4b378b4d60d4fdcfcd_MD5.svg)

### 证书使用

**证书验证流程**：

> 1. 将对端发来的数据解密，如解开数字信封；
> 2. 将解密后的数据分解成原始数据，签名数据和客户证书三部分；
> 3. 用CA根证书验证对端的客户证书的签名，以确认证书是否真实如果用CA的公钥验证证书通过，则证明了对端客户身份的真实性；
> 4. 检查客户证书是否有效，当前时间在证书结构中的所定义的有效期内；
> 5. 检查客户证书是否作废(OCSP方式或CRL方式)；
> 6. 验证客户证书结构中的证书用途，比如签名、加密等；
> 7. 用对端证书去验证原始数据的签名完整性，或者去解密，这取决于证书的用途。

如果以上各项均验证通过，则认可对端的身份，接受原始数据。  
![](/wikis/_resources/§1密码应用基础知识/03ac1d5dc3c48f705440165500897391_MD5.png)

## 密码应用基础总结

![](/wikis/_resources/§1密码应用基础知识/1cf62d79fe7c8b4139265a729f355b4c_MD5.png)
