---
title: 加密方式概述
author: 刘磊
date: 2021-11-12 9:00
---

# 加密方式概览

公元683年，唐中宗即位。随后，武则天废唐中宗，立第四子李旦为皇帝，但朝政大事均由她自己专断。　　

　　裴炎、徐敬业和骆宾王等人对此非常不满。徐敬业聚兵十万，在江苏扬州起兵。裴炎做内应，欲以拆字手段为其传递秘密信息。后因有人告密，裴炎被捕，未发出的密信落到武则天手中。这封密信上只有“青鹅”二字，群臣对此大惑不解。　　

　　武则天破解了“青鹅”的秘密：“青”字拆开来就是“十二月”，而“鹅”字拆开来就是“我自与”。密信的意思是让徐敬业、骆宾王等率兵于十二月进发，裴炎在内部接应。“青鹅”破译后，裴炎被杀。接着，武则天派兵击败了徐敬业和骆宾王。


<!-- more -->
　　![在这里插入图片描述](https://img-blog.csdnimg.cn/b8feae1f45f34291a8b49fee648f54e7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATEVJIExJVSAtLS3liY3nq68=,size_11,color_FFFFFF,t_70,g_se,x_16)




## 一.古典密码加密
**① 替换法**

替换法很好理解，就是用固定的信息将原文替换成无法直接阅读的密文信息。例如将 b 替换成 w ，e 替换成p ，这样bee 单词就变换成了wpp，不知道替换规则的人就无法阅读出原文的含义。

替换法有单表替换和多表替换两种形式。单表替换即只有一张原文密文对照表单，发送者和接收者用这张表单来加密解密。在上述例子中，表单即为：a b c d e - s w t r p 。

多表替换即有多张原文密文对照表单，不同字母可以用不同表单的内容替换。

例如约定好表单为：表单 1：abcde-swtrp 、表单2：abcde-chfhk 、表单 3：abcde-jftou。

规定第一个字母用第三张表单，第二个字母用第一张表单，第三个字母用第二张表单，这时 bee单词就变成了

(312)fpk ，破解难度更高，其中 312 又叫做密钥，密钥可以事先约定好，也可以在传输过程中标记出来。

**② 移位法**

移位法就是将原文中的所有字母都在字母表上向后（或向前）按照一个固定数目进行偏移后得出密文，典型的移位法应用有 “ 恺撒密码 ”。

例如约定好向后移动2位（abcde - cdefg），这样 bee 单词就变换成了dgg 。


## 二.近代密码学
古典密码虽然很简单，但是在密码史上是使用的最久的加密方式，直到“概率论”的数学方法被发现，古典密码就被破解了。古典密码的安全性受到了威胁，外加使用便利性较低，到了工业化时代，近现代密码被广泛应用。

恩尼格玛机

恩尼格玛机是二战时期纳粹德国使用的加密机器，后被英国破译，参与破译的人员有被称为计算机科学之父、人工智能之父的图灵。
![在这里插入图片描述](https://img-blog.csdnimg.cn/5e5312578bfe49ed9e428d4db28df6f2.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATEVJIExJVSAtLS3liY3nq68=,size_8,color_FFFFFF,t_70,g_se,x_16)
恩尼格玛机使用的加密方式本质上还是移位和替代，只不过因为密码表种类极多，破解难度高，同时加密解密机器化，使用便捷，因而在二战时期得以使用。

## 三.现代密码学

## ① 哈希函数

哈希函数，也见杂凑函数、摘要函数或散列函数，可将任意长度的消息经过运算，变成固定长度数值，常见的有MD5、SHA-1、SHA256，多应用在文件校验，数字签名中。

哈希函数是现代密码体系中的一个重要组成部分，被普遍应用在社会生产生活当中。平时大家比较感兴趣的数字货币，就使用了哈希函数。

**哈希函数的特性**
哈希函数具有两大基本属性：单向性和抗碰撞性。单向性决定了哈希函数的正向计算效率高，反向计算难度非常大，几乎不可能；而抗碰撞性决定了无法找到两个不同的输入，使得其输出（即哈希值）是一致的。

**单向性**
哈希函数的单向性意味着，给定一个哈希值，我们无法（很难）逆向计算出其原像输入。即给定一个哈希值 y，我们无法计算出 x，使得 y=H （x）。简单来说，是无法逆向推理。

**抗碰撞性**
碰撞指的是在输入区间 D 中的任意两个不同输入 x、y，两者的哈希值是相同的。那么哈希函数的抗碰撞性意味着，找出任意两个不同的输入值 x、y，使得 H （x）= H （y）是困难的。（这里称为「困难」的原因，是消息空间是无穷的，而哈希值空间是有限的，因此一定会存在碰撞，只是对寻找碰撞的算力需要有难度上的约束）。

**哈希函数算法「家族」**
国际： MD4、MD5、SHA-1、SHA-256、SHA-3。（MD 系列、SHA-1 已被破解）
国内：国产自主研发的商用密码哈希算法，即 SM3。 

**哈希函数的应用：**
口令保护：在现代 web 应用中，账户系统的口令通过哈希函数处理后，再存储于服务器上，使得口令只对用户自己可知；
软件保护：对外发布软件时，同时使用哈希函数计算出软件的哈希值，与软件一起发布，防止用户下载假冒软件；
区块链：在区块链中，账户与交易都涉及哈希函数的使用。

## ② 对称密码

对称密码应用了相同的加密密钥和解密密钥。对称密码分为：序列密码(流密码)，分组密码(块密码)两种。流密码是对信息流中的每一个元素（一个字母或一个比特）作为基本的处理单元进行加密，块密码是先对信息流分块，再对每一块分别加密。

例如原文为1234567890，流加密即先对1进行加密，再对2进行加密，再对3进行加密……最后拼接成密文；块加密先分成不同的块，如1234成块，5678成块，90XX(XX为补位数字)成块，再分别对不同块进行加密，最后拼接成密文。前文提到的古典密码学加密方法，都属于流加密。
**示例**
我们现在有一个原文3要发送给B
设置密钥为108, 3 * 108 = 324, 将324作为密文发送给B
B拿到密文324后, 使用324/108 = 3 得到原文
**特点**
*加密速度快, 可以加密大文件
*密文可逆, 一旦密钥文件泄漏, 就会导致数据暴露
*加密后编码表找不到对应字符, 出现乱码
*一般结合Base64使用

## ③ 非对称密码

对称密码的密钥安全极其重要，加密者和解密者需要提前协商密钥，并各自确保密钥的安全性，一但密钥泄露，即使算法是安全的也无法保障原文信息的私密性。

在实际的使用中，远程的提前协商密钥不容易实现，即使协商好，在远程传输过程中也容易被他人获取，因此非对称密钥此时就凸显出了优势。

非对称密码有两支密钥，公钥（publickey）和私钥（privatekey），加密和解密运算使用的密钥不同。用公钥对原文进行加密后，需要由私钥进行解密；用私钥对原文进行加密后（此时一般称为签名），需要由公钥进行解密（此时一般称为验签）。公钥可以公开的，大家使用公钥对信息进行加密，再发送给私钥的持有者，私钥持有者使用私钥对信息进行解密，获得信息原文。因为私钥只有单一人持有，因此不用担心被他人解密获取信息原文。非对称加密与对称加密相比，其安全性更好;非对称加密的缺点是加密和解密花费时间长、速度慢，只适合对少量数据进行加密。
在非对称加密中使用的主要算法有：RSA、Elgamal、背包算法、Rabin、D-H、ECC（椭圆曲线加密算法）等。
![在这里插入图片描述](https://img-blog.csdnimg.cn/0306398a1d9746a1bdddddcc8d6e8158.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATEVJIExJVSAtLS3liY3nq68=,size_17,color_FFFFFF,t_70,g_se,x_16)


## BASE64
### 一. BASE64是什么
Base64编码是网络上常见的用于传输8bit字节数据的一种编码方式之一，所以可以依据概括：它是一种编码方式，记住它不是加密的方式，它没有秘钥的概念，任何人拿到数据都能解析出来。它只是一种编码方式
### 二. BASE64应用场景
![在这里插入图片描述](https://img-blog.csdnimg.cn/a0201f2d056442e18846d9fcbc1a8dbc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATEVJIExJVSAtLS3liY3nq68=,size_20,color_FFFFFF,t_70,g_se,x_16)
**1**.打开某个邮件的源文件，可以看到邮件的正文部分，使用了base64编码。
Content-Transfer-Encoding：base64

 这样的初衷，是为了满足电子邮件中不能直接使用非ASCII码字符的规定
比如图片文件，附件是二进制文件。电子邮件的协议不能支持到，使用base64进行编码，传输，在客户端再去解码得到原始文件。
**2**.如果纯文本数据包含不可见字符，就需要使用base64，比如xml文件某节点数据包含可见字符，显示的话就是乱码，不能够编辑操作。使用base64编码后显示，需要还原的地方再解码。（二进制文件图片应用类似）
**3**.简单加密

### 三. 手动转化BASE64
**ascii 字符代码表**
![在这里插入图片描述](https://img-blog.csdnimg.cn/cf758ea7154f4e3b8fc2ffedd68a2931.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATEVJIExJVSAtLS3liY3nq68=,size_20,color_FFFFFF,t_70,g_se,x_16)
**base64对照表**
![在这里插入图片描述](https://img-blog.csdnimg.cn/583ae32200e8466a8bc31678d6cf8a60.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATEVJIExJVSAtLS3liY3nq68=,size_13,color_FFFFFF,t_70,g_se,x_16)
转前： s 1 3
先转成ascii：对应 115 49 51
2进制： 01110011 00110001 00110011
6个一组（4组） 011100110011000100110011
然后才有后面的 011100 110011 000100 110011
然后计算机一个字节占8位，不够就自动补两个高位0了
所以有了高位补0
科学计算器输入 00011100 00110011 00000100 00110011
得到 28 51 4 51
查对下照表 c z E z
