---
title: "信息安全与密码技术"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/infosec-cryptography/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/01-系统基础与网络安全/计算机与操作系统/信息安全与密码技术.md"
content_hash: f36ca1f34b7fb99009abe163ddb3fe93e64c5a178e54fc30950e9c7f13726116
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 信息安全与密码技术

> 创建时间：2021/2/4 12:36

  * 信息安全与密码技术
    * 引言
    * 信息保密技术(数据加密, Data Encryption)
      * 分类方式
        * 区块加密与初始向量(IV, initialization vector)
      * 散列加密(信息摘要)
      * 对称加密
        * DES(Data Encryptiorn Standard)算法
          * 基本原理
          * 分支
        * AES算法
        * 遇到的坑
        * C Sharp 实现
      * 非对称加密
        * RSA算法
          * 原理
        * ECC算法
        * C Sharp 实现
      * 总结
        * 密钥管理方法
    * 信息认证技术
      * 数字签名技术
      * 身份识别技术
        * 使用单向函数的通行字
        * 持证（token）
    * 密钥管理技术
      * 密钥分配协定
      * 秘密共享技术
      * 密钥托管技术
    * 其他
      * 编码技术 - Base64
    * Ref

## 引言

密码技术是信息安全技术中的核心技术，它主要由密码编码技术和密码分析技术两个分支组成。

  * 密码编码技术的主要任务是寻求产生安全性高的有效密码算法。以满足对消息进行加密或认证的要求。

  * 密码分析技术的主要任务是彼译密码或伪造认证码，实现窃取机密信息或进行诈骗破坏活动。

信息的安全性主要包括两个方面—— **信息的保密性** 和 **信息的认证性** 。保密的目的是防止对手破译系统中的机密信息，认证的目的是验证信息的发送者是真正的，而不是冒充的。

在用密码技术保护的现代信息系统的安全性主要取决于对密钥的保护，而不是依赖于对算法或硬件本身的保护，即密码算法的安全性完全寓于密钥之中。密钥的保护和管理在数据系统安全中是极为重要的。人们目前特别关注的是 **密钥托管技术** 。

## 信息保密技术(数据加密, Data Encryption)

**保密** 的目的是防止对手破译信息系统中的机密信息。 **加密** 是实现信息保密性的一种重要手段，就是使用数学方法来重新组织数据，使得除了合法的接收者外，任何其他人要想恢复原先的”消息”(将原先的消息称作 **明文(plain text)** )或读懂变化后的”消息”(将变化后的消息称作 **密文(cipher text)** )是非常困难的，将密文变换成明文的过程称作 **解密** 。

**加密算法** 和 **解密算法** 的操作通常都是在一组密钥控制下进行的，分别称为 **加密密钥** 和 **解密密钥** 。

> 加密的意义：
>
>   1. 防止不速之客查看机密的数据文件；
>
>     1. 防止机密数据被泄露或篡改；
>
>     2. 防止特权用户(如系统管理员)查看私人数据文件；
>
>     3. 使入侵者不能轻易地查找一个系统的文件。
>
>

### 分类方式

  * **散列算法** ：不需要密钥，不考虑解密（SHA-1、MD5）

* * *

需要同时具备加密和解密功能时，根据加密密钥和解密密钥是否相同，可将现有的加密体制分为两种。

  * **对称加密** 体制：加密密钥和解密密钥相同。（DES、3DES、AES）

  * **非对称加密** 体制：加密密钥和解密密钥不相同并且从其中一个很难推出另一个。加密密钥可以公开，而解密密钥可由用户自己秘密保存。（RSA、DSA）

* * *

根据明文加密方式的不同，又可将私钥加密体制分为两类:

  * **流加密** \- 明文按字符逐位地被加密

  * **区块加密(Block cipher)** \- 它将明文分成多个等长的模块（block），使用确定的算法和对称密钥对每组分别加密解密。

#### 区块加密与初始向量(IV, initialization vector)

**区块加密** 在密码学的领域里是最基本的加密运算方式之一。然而它的限制是只能对一个预先定义、固定大小资料进行加密。比如在高级加密标准（AES）里，若使用长度为128位的密钥，加密的过程就是将整个明文切割成多个128位长度的子明文，然后依前后顺序用同一把密钥转换成对应的多个128位长度的子密文，这些子密文依产生的顺序连接起来便是完整的密文。这种作法其实就是把甲资料转换成固定的乙资料，这样的对应关系是绝对的，因此攻击者在收集足够的明文与密文的组合后可以轻易的比对并推导出明文或密钥。

为了要隐藏明文与密文的组合被攻击者收集，并且不重新创建密钥来混淆输入的明文。 **密码分组链接（CBC，Cipher-block chaining）模式** 的作法是对第一块明文投入随机的初始向量，然后将明文与向量异或运算的结果加密，加密的结果再作为下一块明文的向量。

![Alt text](/media/50efab3569b57b59dee3.png)

![Alt text](/media/c3a1e1d987f4b3195519.png)

初始向量是一个固定长度的输入值，一般的使用上会要求它是随机数或拟随机数（pseudorandom）。使用随机数产生的初始向量才能达到语义安全（消息验证码也可能用到初始向量），并让攻击者难以对原文一致且使用同一把密钥生成的密文进行破解。

### 散列加密(信息摘要)

用途：

  * 产生信息摘要，检查数据完整性，以防止被篡改

  * 不可还原的密码存储

MD5(Message-Digest Algorithm 5) - 用的是 哈希函数。无论是多长的输入，MD5 都会输出长度为 128bits 的一个串 (通常用 16 进制 表示为 32 个字符)。

SHA1 - 比 MD5 的安全性更强。对于长度小于 2 ^ 64 位的消息，SHA1 会产生一个 160 位的消息摘要。

HMAC算法 - HMAC 是密钥相关的 哈希运算消息认证码（Hash-based Message Authentication Code），HMAC 运算利用 哈希算法 (MD5、SHA1 等)，以 一个密钥 和 一个消息 为输入，生成一个 消息摘要作为输出。

C Sharp 实现

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

### 对称加密

优点：数学运算量小，加密速度快。
弱点：钥的传递和保存是一个问题，参与加密和解密的双方使用的密钥是一样的，这样密钥就很容易泄露。

![Alt text](/media/048d628679198c2d3882.png)

  1. 数据加密过程：在对称加密算法中，数据发送方 将 明文 (原始数据) 和 加密密钥 一起经过特殊 加密处理，生成复杂的 加密密文 进行发送。

  2. 数据解密过程：数据接收方 收到密文后，若想读取原数据，则需要使用 加密使用的密钥 及相同算法的 逆算法 对加密的密文进行解密，才能使其恢复成 可读明文。

#### DES(Data Encryptiorn Standard)算法

类别：分组加密，对称加密
分组大小：64 位
密钥长度：56 位

DES是日前研究最深入、应用最广泛的一种分组密码。加密解密用同一算法。

##### 基本原理

DES综合运用了置换、代替、代数多种密码技术，把消息分成64位大小的块，使用56位密钥，迭代轮数为16轮的加密算法。

##### 分支

  * **三重DES(Triple DES)** 则是DES的加强版。对一块数据用三个不同的密钥进行 三次加密，强度更高。

  * **随机化数据加密标准(RDES)** 算法是日本密码学家Nakao Y.Kaneko T等人于1996年初提出的一种新的DES改进算法。它只是在每轮迭代前的右半部增加了一个随机置换，其他均与DES相同,目前看来它比DES安全性要好。

#### AES算法

类别：分组加密，对称加密

  * 分组长度： **128 位**

  * 密钥长度： **128 位、 192 位、256 位**

AES 加密算法是密码学中的高级加密标准，该加密算法采用对称分组密码体制。算法应易于各种硬件和软件实现。

相比于DES，AES 具有更好的 安全性、效率和灵活性。

AES数学原理详解：<https://www.cnblogs.com/block2016/p/5596676.html>

#### 遇到的坑

AES算法的加密是一个块加密的过程，如果密钥长度是128位（16byte*8bit/byte），则算法会每128位（16bytes）加密一次，无论原始的数据是多少字节，生成的密文是16字节的整数倍（例如，36bytes的数据，加密之后得到的是48bytes的数据），多出来的字节会自动补齐。而解密的时候，是无法明确哪些bit位是自动补出来的，会把用于补齐的字节也算作数据，解密之后，把数据拼起来，就会出错。

方法：控制加密的过程，每128位加密一次，中间不要出现空隙——流试加密。在实现上，保证一份文件的加密使用同一个流即可，实现方法如下：

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

#### C Sharp 实现

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

### 非对称加密

  * 公开密钥 (public key)，公钥

  * 私有密钥 (private key)，私钥

如果使用 公钥 对数据 进行加密，只有用对应的 私钥 才能 进行解密。
如果使用 私钥 对数据 进行加密，只有用对应的 公钥 才能 进行解密。

优点：保证了安全性又易于管理
缺点：加密和解密的时间长

> 私钥密码体制的缺陷之一是通信双方在进行通信之前需通过一个安全信道事先交换密钥。这在实际应用中通常是非常困难的。而公钥密码体制可使通信双方无须事先交换密钥就可建立起保密通信。

在实际通信中，一般利用 **公钥密码体制来保护和分配(交换)密钥，而利用私钥密码体制加密消息** 。公钥密码体制主要用于认证(比如数字签名，身份识别等)和密钥管理等。

使用流程：
(1)A首先获得B的公钥。
(2)A用B的公钥加密信息，然后发送给B。
(3)B用自己的私钥解密A发送的信息。

核心是运用一种特殊的数学函数一单向陷门函数，即从一个方向求值是容易的。但其逆向计算却很困难，从而在实际上成为不可行的。公开密钥加密技术它不仅保证了安全性又易于管理。其不足是加密和解密的时间长。

> 加密与签名技术中的公钥与私钥
>
>   * 既然是 **加密** ，那肯定是不希望别人知道我的消息，所以只有我才能解密，所以可得出 **公钥负责加密，私钥负责解密**
>
>   * 既然是 **签名** ，那肯定是不希望有人冒充我发消息，只有我才能发布这个签名，所以可得出 **私钥负责签名，公钥负责验证** 。
>
>

#### RSA算法

RSA 加密算法是目前最有影响力的 公钥加密算法，并且被普遍认为是目前 最优秀的公钥方案 之一。RSA 是第一个能同时用于 加密 和 数字签名 的算法，它能够 抵抗 到目前为止已知的 所有密码攻击，已被 ISO 推荐为公钥数据加密标准。

> 根据已经披露的文献，目前被破解的最长RSA密钥是768个二进制位。也就是说，长度超过768位的密钥，还无法破解（至少没人公开宣布）。因此可以认为，1024位的RSA密钥基本安全，2048位的密钥极其安全。

##### 原理

其安全性是建立在”大数分解和素性检测”这一已知的著名数论难题的基础上，即:将两个大素数相乘在计算上很容易实现，但将该乘积分解为两个大素数因子的计算量是相当巨大的，以至于在实际计算中是不能实现的。

#### ECC算法

也是一种 非对称加密算法，主要优势是在某些情况下，它比其他的方法使用 更小的密钥，比如 RSA 加密算法，提供 相当的或更高等级 的安全级别。不过一个缺点是 加密和解密操作 的实现比其他机制 时间长 (相比 RSA 算法，该算法对 CPU 消耗严重)。

#### C Sharp 实现

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

### 总结

![Alt text](/media/0d3bfd0b2a4e2f6de1a9.png)

私用密钥加密技术与公开密钥加密技术相结合:鉴于两种密码体制加密的特点，在实际应用中可以采用折衷方案，即结合使用DES/IDEA/AES和RSA，以DES为”内核”，RSA为”外壳”。对于网络中传输的数据可用DES/IDEA/AES加密，而加密用的密钥则用RSA加密传送，此种方法既保证了数据安全又提高了加密和解密的速度，这也是目前加密技术发展的新方向之一。

> 一般RSA建议采用1024位的数字，AES建议采用128位即可。

#### 密钥管理方法

对于私用密钥加密和公开密钥加密系统来讲、并不强调对加密/解密算法的保密。计算机网络加密的安全性主要是依赖于算法本身的安全性和对密钥的保护。密钥主要有会话密钥(Session Key)、基本密钥(Basic Key)和主密钥(Master Key)三种。会话密钥是通信双方在会话中使用的密钥，此种密钥只在一次会话中有效，会话结束时密钥就失效；在网络中用来传送会话密钥的密钥，就是基本密钥；而对基本密钥进行加密的密钥则称为主密钥。网络中一般是采用这种三级密钥方案来进行保密通信的。

## 信息认证技术

目的有两个:

  * 验证信息的发送者是真正的，而不是冒充的

  * 验证信息的完整性.即验证信息在传送或存储过料中是否被窜改，重放或延迟等。

> 对密码系统的攻击主要有两类:一类是被动攻击，对手只是对截获的密文进行分析:另一类是主动攻击，对于通过采用删除、增添、重放和伪造等手段主动向系统注入假消息。认证是防止他人对系统进行主动攻击(如伪造，窜改信息等)的一种重要技术。

### 数字签名技术

使用非对称密钥签名，但是这里使用

数字签名，简单来说就是通过提供 可鉴别 的 数字信息 验证 自身身份 的一种方式。

一个数字签名算法主要由两个算法组成，即签名算法和验证算法。签名者能使用一个(秘密)签名算法签一个消息，所得的签名能通过一个公开的验证算法来验证。给定一个签名，验证算法根据签名是否真实来作出一个”真”或”假”的问答。

使用流程：
(l)A首先使用他的秘密密钥对x进行签名得y。
(2)A然后将(x，y)发送给B。
(3)最后B用A的公钥验证A的签名的合法性

![Alt text](/media/da8db2ce215c15b1d6f6.png)

### 身份识别技术

身份识别的常用方式主要有两种，一种是使用通行字的方式；另一种是使用持证的方式。

通行字方式识别的办法是:识别者A先输入他的通行字，然后计算机确认它的正确性。A和计算机都知道这个秘密通行字，A每次登录时，计算机都要求A输入通行字。

#### 使用单向函数的通行字

一旦通行字文件暴露，就可获得通行字。为了克服这种缺陷，人们建议采用单向函数。
其认证过程为:
1.A将他的通行字传送给计算机。
2.计算机完成通行字的单向函数值的计算。
3.计算机把单向函数值和机器存储的值比较。
计算机不再存储每个人的有效通行字表，某些人侵入计算机也无法从通行字的单向函数值表中获得通行字。

#### 持证（token）

token是一种个人持有物，它的作用类似于钥匙，用于启动电子设备。使用比较多的是一种嵌有磁条的塑料卡，磁条上记录有用于机器识别的个人信息。这类卡通常和个人识别号(PIN) 一起使用。这类卡易于制造，而且磁条上记录的数据也易于转录，因此要设法防止仿制。为了提高磁卡的安全性，人们建议使用一种被称作”智能卡”的磁卡来代替普通的磁卡，智能卡与普通的磁卡的主要区别在于智能卡带有智能化的微处理器和存储器。智能卡已成为目前身份识别的一种更有效、更安全的方法。智能卡仅仅为身份识别提供了一个硬件基础，要想得到安全的识别，还需要与安全协议配套使用。

## 密钥管理技术

根据密码假设，一个密码系统的安全性取决于对密钥的保护，而不是对系统或硬件本身的保护。密钥管理包括密钥的产生、存储、装入、分配、保护、丢失、销毁等内容。

### 密钥分配协定

**密钥分配协定** 是这样的一种机制：系统中的一个成员先选择一个秘密密钥，然后将它传送另一个成员或别的成员。
传统的方法是通过邮递或信使护送密钥。这种方法的安全性完全取决于信使的忠诚和素质，当很难完全消除信使被收买的可能性。另外，这种方法的传输量和存储量都很大。人们希望能设计出满足以下两个条件的密钥分配协议：
1.传输量和存储量都比较小。
2.每一对用户U和V都能独立地计算一个秘密密钥K。

**密钥协定** 是一个协议，它通过两个或多个成员在一个公开的信道上通信联络建立一个秘密密钥。

### 秘密共享技术

存储在系统中所有密钥的安全性可能最终取决于一个主密钥。这样做存在两个明显的缺陷：一是若主密钥偶然或有意地被暴露，整个系统就易受攻击；二是若主密钥丢失或损坏，系统中的所有信息就不能用了。关于这个问题，Shamir于1979年提出了一种解决方法，称为门限法，实质上是一种秘密共享的思想。这种方法的基本观点是：讲一个密钥K按下述方式破成n个小片k1，k2，……，kn：
1.已知任意t个ki的值易于计算出k。
2.已知任意t-1个或更少个ki，则由于信息短缺而不能确定出K。

### 密钥托管技术

## 其他

### 编码技术 - Base64

## Ref

<https://www.cnblogs.com/wxbjs/archive/2011/09/02/2163540.html>
<http://zhangzr.cn/2018/07/04/%E5%B8%B8%E7%94%A8%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95%E7%AE%80%E4%BB%8B/>
<https://www.cnblogs.com/tuyile006/p/10873975.html>
<https://en.wikipedia.org/wiki/Initialization_vector>
<https://zh.wikipedia.org/wiki/%E5%88%86%E7%BB%84%E5%AF%86%E7%A0%81%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F#%E5%AF%86%E7%A0%81%E5%9D%97%E9%93%BE%E6%8E%A5%EF%BC%88CBC%EF%BC%89>
<https://zh.wikipedia.org/zh-cn/%E5%88%9D%E5%A7%8B%E5%90%91%E9%87%8F>
