必要的基础知识
编码
将现实世界的内容(文字、图片、视频等所有的信息)转换成比特序列的过程就叫做编码。例如,ASC||编码
XOR(异或)
XOR运算是很基础的比特运算。只有当运算两个运算数不相同时,结果才是1;如果两个运算数相同,则结果是0。具体如下:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
为什么要在密码技术中把XOR作为必要的基础知识呢?
我们把上面的运算式的等号和XOR互换一个位置,再从右往左读:
0 = 0 XOR 0
0 = 1 XOR 1
1 = 0 XOR 1
1 = 1 XOR 0
我们能看到什么呢?就是A和B的异或结果C,再和B异或一次,就等于A。
这对于密码来说,就相当于加密和解密:
加密:明文 XOR 密钥 = 密文
解密:密文 XOR 密钥 = 明文
一次性密码本
一次性密码本是不能破译的,但也无法真正使用
一次性密码本原理
原理还是比较简单的,假设明文就是64比特的比特序列。随机生成等长的64比特的密钥,然后再和明文做异或运算。解密的时候,再用密文和密钥做一次异或运算就可以了。
一次性密码本是无法破译的
这里的破译是指,哪怕计算机的计算能力无限强大也无法破译。原因肯定不是出在密钥没有被暴力破解,而是说即使计算出来了也无法判断它是否正确
举个例子,原文是midnight,有可能破译出midnignht、mistress等等
一次性密码本为什么没有被使用
-
密钥问题。一次性密码本的密钥特点是,密钥和明文等长;密钥由于是随机生成,所以密钥需要很好的保存;密钥无法重用。
简单的说:密钥跟明文等长的情况下,面临着和明文一样的发送、保存问题,那么这跟保存明文有什么区别呢?相当于制作、发送、保存了两份明文。
所以一次性密码本没有实用价值。
流密码
一次性密码本诞生了一个概念:流密码,这么叫法是因为是针对每个比特进行加密的。流密码是用伪随机数生成器产生的比特序列。
DES
概述
DES ( Data Encryption Standard ),是一种对称密码,目前此密码已经能够被破解。
加解密原理
- 分组密码。其实就是将明文按照固定长度分割,然后针对每个分组进行加密。
- 模式。由于分组密码只能针对固定长度进行加密,所以就会涉及到对多个分组的迭代加密。迭代的具体方式被称为模式。
-
DES结构(Feistel网络)
- 每一轮有个子密钥。
- 一轮分组64比特,分成两个分组。
- 子密钥跟轮函数获得的输出,跟左侧32比特的明文进行异或,获得一个加密的左边密文。
- 右边不经过任何处理直接使用。
- 左右合并获得一轮加密后的密文输出。
-
多轮加密
第一轮的左侧加密,右侧没有加密。
第二轮的左侧是第一轮的右侧,第二轮的右侧是第一轮加密后的左侧。
以此类推 - 解密。由于加密其实就是异或,所以解密实际上是用每一轮的子密钥,再异或一次即可。
三重DES
- 因为DES是可以被暴力破解的,所以三重DES就是增加了DES强度。其实就是重复三次得到的加密算法。
- 简单的说,有三个密钥,明文分别用三个DES密钥进行 " 加密 -> 解密 -> 加密 " 得到密文。
- 第二步不是加密,而是解密,主要原因就是为了兼容普通DES。假设第一步加密和第二步解密的密钥是相同的,前两步的结果相当于明文。第三步再进行加密,就相当于普通的DES。
- 解密的过程其实就是反过来再加密一把即可。
- 目前还有银行机构在使用此加密算法,但是处理速度不高,且安全性问题逐渐被暴露。
AES
概述
AES (Advanced Encryption Standard)。这其实就是一种标准的名称,是美国标准化机构NIST选定的密码算法。
当时是公开竞标的,也就是说其实AES有多种候选算法,最终选定的是Rijndael。
AES加解密的特点
- 同样是分组加解密。分组长度是128bit,也就是16字节。
- 加密第一步,针对每个分组逐个字节的进行SubBytes的操作。笼统的说,就是每个字节根据256个值的替换表,将当前字节替换成另外一个字节。
- 加密第二步,以单个字节为单位进行ShiftRows处理,就是将字节有规律的打乱。
- 加密第三部,再以4字节为单位进行MixColumns处理,就是进行比特运算变成另外的4个字节。
- 加密第四步,还是4字节为单位与轮密钥进行XOR运算。至此一轮运算就结束了。
- 解密的过程就是加密的逆向过程。
当前对称密码算法的应用
DES已经不推荐使用,三重DES目前只有兼容性场景才使用,目前认定使用的算法就是AES。