一次性密码本
一次性密码本也称为维纳密码(Vernam Cipher),特点:无条件安全,理论上是 ”无法破译” 的。
加密过程
将明文与一串随机的比特序列进行 XOR 运算,随机不是随便臆想出一个随机的序列,抛硬币的过程可以看作随机的过程,比如出现正面,可以看作比特位 1, 反面看作比特位 0. 密码学中有专门的随机数生成硬件和伪随机数生成器软件。
例如, 明文 midnight 的 ASCII 比特序列为:
1 | 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 |
产生一个和明文长度相同的 64 位比特序列,作为一次性密码本的密钥:
1 | 01001101 01001101 01010100 01111110 01101111 01100001 01000000 00010100 ====> 密钥 |
加密,即进行异或运算
1 | 01101101 01101001 01100100 01101110 01101001 01100111 01101000 01110100 明文 |
解密过程
解密就是加密的反向运算,即用密文和密钥进行 X0R 运算,就可以得到明文
1 |
|
一次性密码本是无法破译的
只要遍历密钥空间,总能找到进行加密解密的密钥(运算能力无穷大,可以在有限时间内),然后对密文界面,无法破译指的是没有办法判断解密后的内容是否是正确的的明文, 所有可能密钥的解密,可能会出现类似于 midnight, onenight 的单词,也可能会出现其他不规则的字符组合,作为一个破译者,没有办法定义哪一个是正确的明文。明文就对应着密钥,所以一次性密码本无法破译。
一次性密码本存在的问题
密钥配送
可以安全的发送密钥,那为什么不直接用来安全的发送明文?
密钥保存
密钥与明文一样长,保存明文转换为保存密钥的问题
密钥重用
不能重用用过的随机比特序列,否则,获取所有的机密通信将被全部解密
密钥同步
密钥长度与明文长度相同,明文过长,密钥的传输与通信不能有任何差错(比特位的丢失,错位等),否则,将不能解密
DES
DES (Data Encryption Standard) 是 1997 年美国联邦信息处理标准中采用的一种对称密码。DES 已经可以在短时间内被破译,所以除了兼容性,不应该再使用 DES 来直接加密
加密与解密
DES 属于分组密码(block cipher),以 64 比特位为一个单位来进行加密的,密钥长度为 64 位,实际只有 56 位,每隔 7 位会设置一个错误校验位,所以 DES 的密钥长度为 56 位. (分组密码的模式)
DES 的结构
DES 的基本结构由 Horst Feistel 设计, 所以也称为 Feistel 网络, Feistel 结构, Feistel 密码, 并且应用到了其它的密码算法中. Feistel 中将每一次加密过程, 称为轮 (round), DES 是一种 16 轮循环的 Feistel 网络.
一轮的过程
加密的过程
Feistel 网络中一轮的过程如上图所示, 输入被等分为左右两半,分别进行处理, 写作左侧和右侧, 加密后的左半部分写作”加密后的左侧”, 右侧称为右侧.
Feistel 网络中每一轮都需要使用一个不同的密钥, 所以这个密钥只在一轮中使用, 因此称为 子密钥 (subkey)
具体的步骤:
(1) 将输入的数据等分为左右两部分
(2) 将输入的右侧直接发送到输出的右侧
(3) 将输入的右侧发送到轮函数
(4) 轮函数根据右侧数据和子密钥,计算出 一串看上去是随机 的比特序列
(5) 将上一步得到的比特序列与左侧数据进行 XOR 运算, 将结果作为加密后的左侧
每一轮, 右侧部分是没有被加密的,因此需要使用不同的子密钥重复多轮, 每两轮之间将左侧和右侧的数据进行对调. 最后一轮结束后不需要对调。3 轮的Feistel 网络如下图所示:
解密的过程
用相同的子密钥运行两次 Feistel 网络就能够将数据还原, 利用的其实 XOR 异或的性质 (两个相同的数异或为 0), 多轮的情况是一样的:
Feistel 网络的性质
加密时无论使用任何函数作为轮函数都可以正确解密
即便使用的轮函数的输出结果无法逆计算出输入的值(即该函数不存在反函数)也没有问题,可以被设计得任意复杂;Feistel 网络实际上就是从加密算法中抽取出“密码的本质部分”并将其封装成一个轮函数
可解密性
在 Feistel 网络的一轮中, 右半边部分没有进行任何处理,看起来时一种浪费,但却保证了可解密性,是解密过程中所必须的信息;
加密和解密可以用相同的结构来实现
由于加密解密可以用相同的结构来实现,因此用于实现 DES 算法的硬件设备的设计变得容易
三重 DES
三重 DES (triple - DES) 是为了增加 DES 的强度, 将 DES 重复 3 次的一种密码算法,也称为 TDEA (Triple Date Ecnryption Algorithm), 通常称为 3DES。
三重 DES 的加密过程:
明文经过三次 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的顺序执行 解密-->加密-->解密
的操作
关于 DES 与 3DES 的使用
由于 DES 的密文已经可以在短时间内被破译,处理解密以前的密文,不应该再使用 DES 了。三重 DES 由于处理速度不高,很少被用于新的用途。
在日本总务省和经济产业省 2013 年发布的《电子政府相关技术采购中参考的密码清单》中,“电子政府推荐使用的密码清单” 项中将 3-key Triple DES 作为 64 比特分组密码列了出来,但考虑到 IST SP 800-67 的规定,以及其事实性标准的地位,又在脚注中给出了“目前暂且允许使用”的描述
使用 openssl 通过 3DES 进行加密和解密
1 | # 加密 |