一次性密码本

一次性密码本也称为维纳密码(Vernam Cipher),特点:无条件安全,理论上是 ”无法破译” 的。

加密过程

将明文与一串随机的比特序列进行 XOR 运算,随机不是随便臆想出一个随机的序列,抛硬币的过程可以看作随机的过程,比如出现正面,可以看作比特位 1, 反面看作比特位 0. 密码学中有专门的随机数生成硬件和伪随机数生成器软件。

例如, 明文 midnight 的 ASCII 比特序列为:

1
2
3
echo -n "midnight" | hexdump -e '/1 "%02X "' | xargs -n 1 | while read dec; do echo  "ibase=16;obase=2;$dec" | bc | tr "\n" " " | sed 's/^/0/g'; done; echo

01101101 01101001 01100100 01101110 01101001 01100111 01101000 01110100 ====> midnight

产生一个和明文长度相同的 64 位比特序列,作为一次性密码本的密钥:

1
01001101 01001101 01010100 01111110 01101111 01100001 01000000 00010100 ====> 密钥

加密,即进行异或运算

1
2
3
4
5
	01101101 01101001 01100100 01101110 01101001 01100111 01101000 01110100 明文

01001101 01001101 01010100 01111110 01101111 01100001 01000000 00010100 密钥
---------------------------------------------------------------------------
00100000 00100100 00110000 00010000 00000110 00000110 00101000 01100000 密文

解密过程

解密就是加密的反向运算,即用密文和密钥进行 X0R 运算,就可以得到明文

1
2
3
4
5
6

00100000 00100100 00110000 00010000 00000110 00000110 00101000 01100000 密文

01001101 01001101 01010100 01111110 01101111 01100001 01000000 00010100 密钥
---------------------------------------------------------------------------
01101101 01101001 01100100 01101110 01101001 01100111 01101000 01110100 明文

一次性密码本是无法破译的

只要遍历密钥空间,总能找到进行加密解密的密钥(运算能力无穷大,可以在有限时间内),然后对密文界面,无法破译指的是没有办法判断解密后的内容是否是正确的的明文, 所有可能密钥的解密,可能会出现类似于 midnight, onenight 的单词,也可能会出现其他不规则的字符组合,作为一个破译者,没有办法定义哪一个是正确的明文。明文就对应着密钥,所以一次性密码本无法破译。

一次性密码本存在的问题

  • 密钥配送

    可以安全的发送密钥,那为什么不直接用来安全的发送明文?

  • 密钥保存

    密钥与明文一样长,保存明文转换为保存密钥的问题

  • 密钥重用

    不能重用用过的随机比特序列,否则,获取所有的机密通信将被全部解密

  • 密钥同步

    密钥长度与明文长度相同,明文过长,密钥的传输与通信不能有任何差错(比特位的丢失,错位等),否则,将不能解密

DES

DES (Data Encryption Standard) 是 1997 年美国联邦信息处理标准中采用的一种对称密码。DES 已经可以在短时间内被破译,所以除了兼容性,不应该再使用 DES 来直接加密

加密与解密

DES 属于分组密码(block cipher),以 64 比特位为一个单位来进行加密的,密钥长度为 64 位,实际只有 56 位,每隔 7 位会设置一个错误校验位,所以 DES 的密钥长度为 56 位. (分组密码的模式)

image-20210126210108366

DES 的结构

DES 的基本结构由 Horst Feistel 设计, 所以也称为 Feistel 网络, Feistel 结构, Feistel 密码, 并且应用到了其它的密码算法中. Feistel 中将每一次加密过程, 称为 (round), DES 是一种 16 轮循环的 Feistel 网络.

一轮的过程

加密的过程

image-20210126211458134

Feistel 网络中一轮的过程如上图所示, 输入被等分为左右两半,分别进行处理, 写作左侧和右侧, 加密后的左半部分写作”加密后的左侧”, 右侧称为右侧.

Feistel 网络中每一轮都需要使用一个不同的密钥, 所以这个密钥只在一轮中使用, 因此称为 子密钥 (subkey)

具体的步骤:

(1) 将输入的数据等分为左右两部分
(2) 将输入的右侧直接发送到输出的右侧
(3) 将输入的右侧发送到轮函数
(4) 轮函数根据右侧数据和子密钥,计算出 一串看上去是随机 的比特序列
(5) 将上一步得到的比特序列与左侧数据进行 XOR 运算, 将结果作为加密后的左侧

每一轮, 右侧部分是没有被加密的,因此需要使用不同的子密钥重复多轮, 每两轮之间将左侧和右侧的数据进行对调. 最后一轮结束后不需要对调。3 轮的Feistel 网络如下图所示:

image-20210126213116336

解密的过程

image-20210126213750078

用相同的子密钥运行两次 Feistel 网络就能够将数据还原, 利用的其实 XOR 异或的性质 (两个相同的数异或为 0), 多轮的情况是一样的:

image-20210126214210806

Feistel 网络的性质

  • 加密时无论使用任何函数作为轮函数都可以正确解密

    即便使用的轮函数的输出结果无法逆计算出输入的值(即该函数不存在反函数)也没有问题,可以被设计得任意复杂;Feistel 网络实际上就是从加密算法中抽取出“密码的本质部分”并将其封装成一个轮函数

  • 可解密性

    在 Feistel 网络的一轮中, 右半边部分没有进行任何处理,看起来时一种浪费,但却保证了可解密性,是解密过程中所必须的信息;

  • 加密和解密可以用相同的结构来实现

    由于加密解密可以用相同的结构来实现,因此用于实现 DES 算法的硬件设备的设计变得容易

三重 DES

三重 DES (triple - DES) 是为了增加 DES 的强度, 将 DES 重复 3 次的一种密码算法,也称为 TDEA (Triple Date Ecnryption Algorithm), 通常称为 3DES。

三重 DES 的加密过程:

image-20210126221848991

明文经过三次 DES 处理变为密文,所以三重 DES 的密钥长度是 56 * 3=168 比特. 三重 DES 并不是进行三次加密,而是 加密 --> 解密--> 加密 的过程, 此方法由 IBM 公司设计,目的是兼容普通的 DES, 当三重 DES 使用的所有密钥都相同时,三重 DES 就相等于普通的 DES , 因为 加密-->解密 就变为明文了。因此三重 DES 对 DES 具备向下兼容性

DES-EDE2: 密钥1和密钥3使用相同的密钥,密钥2使用不同的密钥

DES-EDE3: 密钥1,密钥2,密钥3全部使用不同的比特序列

三重 DES 的解密过程:

三重 DES 的解密过程和加密正好相反,以密钥3,密钥2,密钥1的顺序执行 解密-->加密-->解密 的操作

image-20210126221714656

关于 DES 与 3DES 的使用

由于 DES 的密文已经可以在短时间内被破译,处理解密以前的密文,不应该再使用 DES 了。三重 DES 由于处理速度不高,很少被用于新的用途。

在日本总务省和经济产业省 2013 年发布的《电子政府相关技术采购中参考的密码清单》中,“电子政府推荐使用的密码清单” 项中将 3-key Triple DES 作为 64 比特分组密码列了出来,但考虑到 IST SP 800-67 的规定,以及其事实性标准的地位,又在脚注中给出了“目前暂且允许使用”的描述

使用 openssl 通过 3DES 进行加密和解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 加密
$ cat seq.txt
1
2
3
4
5
6
7
8
9
10

$ openssl enc -e -des3 -a -salt -in seq.txt -out encrypted.txt
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:

$ cat encrypted.txt
U2FsdGVkX1+HbjKWGlQzlIM7EM/TFhzn8wzKBBWn91TBdUSH3bOCeQ==

# 解密
openssl enc -d -des3 -a -salt -in encrypted.txt -out decrypted.txt
enter des-ede3-cbc decryption password:

$ cat decrypted.txt
1
2
3
4
5
6
7
8
9
10