用相同的密钥进行加密和解密

1. 一次性暗码本(绝对不会被破译的暗码)

一次性暗码本又称维纳暗码
即便用暴力破解法遍历整个密钥空间,一次性暗码本也绝对无法被破解
原理将明文与一串随机的比特序列进行XOR运算
解密便是加密的反向运算,即用密文和密钥进行XOR运算,就可以得到明文
一次性暗码本是无法破译的,即便可以解密出来完好的字符也无法判别它是否是正确的明文
一次性暗码本是无条件安全的,在理论上是无法破译的

但是在实际中很不有用,几乎没有人应用一次性暗码本,原因如下:

  • 密钥的配送:最大的问题在于密钥的配送
  • 密钥的保存:密文无需保存,但密钥需求保存
  • 密钥的重用:在一次性暗码本中,绝对不能重用曩昔用过的随机比特序列
  • 密钥的同步:发送者和接收者的密钥的比特序列不允许有任何错位,不然错位的比特后的一切信息都将无法解密
  • 密钥的生成:需求生成很多的随机数,这里的随机数不是经过核算机程序生成的伪随机数,而必须是无重现性的真正随机数

因而,可以运用一次性暗码本的,只有那些机密性重过一切,且可以花费很多财力和人力来生成并配送密钥的场合。所以,一次性暗码本是一种几乎没有有用性的暗码

2. DES

2.1 DES加密和解密

DES是一种将64比特的明文加密成64比特的密文的对称暗码算法,它的密钥长度是56比特
DES是以64比特的明文为一个单位来进行加密的,这个64比特的单位称为分组
以分组为单位进行处理的暗码算法称为分组加密,DES便是分组暗码的一种
DES每次只能加密64比特的数据,假如要加密的明文比较长,就需求对DES加密进行迭代(重复),迭代的具体方法就称为模式

下图为DES的加密与解密

对称密码(共享密钥密码)

2.2 DES的结构(Feistel网络)

DES的基本结构是由Horst Feistel规划的,因而也称为Feistel网络(Feistel network)、Feistel结构(Feistel structure)或许FeiStel暗码(Feistel cipher)
在Feistel网络中,加密的各个进程称为,整个加密进程便是进行若干次轮的循环

DES是一种16轮循环的Feistel网络,下图展现的是Feistel网络中一轮的核算流程:

对称密码(共享密钥密码)

  • 将输入的数据等分为左右两部分
  • 将输入的右侧直接发送到输出的右侧
  • 将输入的右侧发送到轮函数
  • 轮函数根据右侧数据和子密钥,核算出一串看上去是随机的比特序列
  • 将上一步得到的比特序列与左边数据进行XOR运算,并将成果作为加密后的左边

子密钥仅仅一个部分密钥,只在一轮中运用
轮函数的作用是根据“右侧”和子密钥生成对“左边”进行加密的比特序列,它是暗码系统的中心

下图是3轮的Feistel网络加密:

对称密码(共享密钥密码)

用相同的子密钥运转两次Feistel网络就可以将数据复原,如下图所示:

对称密码(共享密钥密码)

下图是3轮的Feistel网络解密:

对称密码(共享密钥密码)

Feistel网络的解密操作只需依照相反的次序来运用子密钥就可以完成,Feistel网络本身的结构,在加密和解密时都是完全相同的

Feistel网络的性质:

  • Feistel网络的轮数可以恣意添加
  • 加密时无论运用任何函数作为轮函数都可以正确解密
  • 加密和解密可以用完全相同的结构来完成

无论是任何轮数、任何轮函数,Feistel网络都可以用相同的结构完成加密和解密,且加密的成果必定可以正确解密

2.3 差分剖析与线性剖析

差分剖析是一种针对分组暗码的剖析方法,改变一部分明文并剖析密文怎么随之改变。经过剖析密文改变中所产生的误差,可以获得破译暗码的头绪
线性剖析是将明文和密文的一些对应比特进行XOR并核算成果为零的概率
差分剖析和线性剖析都有一个条件,便是假设暗码破译者可以选择恣意明文并得到其加密的成果,这种进犯方法称为选择明文进犯

3. 三重DES

DES现已可以在实际的时间内被暴力破解,因而需求一种用来替代DES的分组暗码,三重DES便是出于这个意图被开发出来的。

三重DES是为了添加DES的强度,将DES重复3次所得到的一种暗码算法,也称TDEA,一般缩写为3DES

3.1 三重DES的加密

三重DES的加密机制如图所示:

对称密码(共享密钥密码)

明文经过三次DES处理才能变成终究的密文,由于DES密钥的长度实质上是56比特,因而三重DES的密钥长度是563=168比特;
三重DES是加密->解密->加密的进程,意图是为了让三重DES可以兼容一般的DES;
当三重DES中一切的密钥都相一起,三重DES也就等同于一般的DES了
三重DES对DES具有向下兼容性
假如密钥1和密钥3运用相同的密钥,而密钥2运用不同的密钥,这种三重DES就称为DES-EDE2
EDE表明的是加密->解密->加密这个流程
密钥1、密钥2、密钥3悉数运用不同的比特序列的三重DES成为DES-EDE3

3.2 三重DES的解密

三重DES的解密进程和加密正好相反,是以密钥3、密钥2、密钥1的次序执行解密->加密->解密的操作
如下图所示:

对称密码(共享密钥密码)

3.3 三重DES的现状

尽管三重DES现在还被银行等机构运用,但其处理速度不高,除了特别注重向下兼容性的情况以外,很少被用于新的用处。

4.AES的选定进程

AES是取代其上一任规范DES而称为新的规范的一种对称暗码算法

全世界的企业和暗码学家提交了多个对称暗码算法作为AES的候选,终究在2000年从这些候选算法中选出了一种名为Rigndael的对称暗码算法,并将其确认为了AES。
经过竞赛来完成规范化的方法,是暗码算法选拔的正确方法。由世界最高水平的暗码学家一起测验破译,依然未能找到弱点,只有这样的事实才可以证明一种暗码算法的强度。

5. Rijndael

Rijndael是由比利时暗码学家Joan Daemen和Vincent Rijmen规划的分组暗码算法,于2000年被选为新一代的规范暗码算法——AES。
Rijndael的分组长度和密钥长度可以别离以32比特为单位在128比特到256比特的范围内进行选择。不过在AES的规格中,分组长度固定为128比特,密钥长度只有128、192和256比特三种。

5.1 Rijndael的加密和解密

Rijndael算法也是由多个轮构成的,其间每一轮分为SubBytes、ShiftRows、MixColumns和AddRoundKey共4个进程。
Rijndael运用了SPN结构。

Rijndael的输入分组为128比特,即16字节

  • 首先,需求逐一字节地对16字节地输入数据进行SubBytes处理。
    SubBytes便是以每个字节的值(0~255的恣意值)为索引,从一张拥有256个值的替换表中查找出对应值的处理,如下图所示:
    对称密码(共享密钥密码)

  • SubBytes之后需求进行ShiftRows处理
    这一步是将以4字节为单位的行(row)依照必定的规矩向左平移,且每一行平移的字节数是不同的,如下图所示:
    对称密码(共享密钥密码)

  • ShiftRows之后需求进行MixColumns处理。
    这一步是对一个4字节的值进行比特运算,将其变为别的一个4字节值,如下图所示:
    对称密码(共享密钥密码)

  • 终究,需求将MixColumns的输出与轮密钥进行XOR,即进行AddRoundKey处理。
    下图所示为AddRoundKey中对其间1个字节进行处理的情形
    对称密码(共享密钥密码)

此为Rijndael的一轮核算,实际上,在Rijndael中需求重复进行10~14轮核算。
咱们输入的一切比特在一轮中都会被加密,所以加密所需的轮数就更少。
SubBytes、ShiftRows和MixColumns可以别离以字节、行和列为单位进行核算

在Rijndael的加密进程中,每一轮所进行的处理为:
SubBytes->ShiftRows->MixColumns->AddRoundKey
在解密时,则是依照相反的次序来进行,即:
AddRoundKey->InvMixColumns->InvShiftRows->InvSubBytes
其间,AddRoundKey是与轮密钥进行XOR运算,因而这一步在加密和解密时是完全相同的,剩余的进程中名字前面都带有Inv,表明与原始进程相对应的逆运算。

InvMixColumns(混合列):

对称密码(共享密钥密码)

InvShiftRows(平移行):

对称密码(共享密钥密码)

InvSubBytes(逐字节替换):

对称密码(共享密钥密码)

Rijndael的算法背面有着严谨的数学结构,也便是说从明文到密文的核算进程可以悉数用公式来表达,这是以上一任何暗码算法都不具有的性质。
假如Rijndael的公式可以经过数学运算来求解,意味着Rijndael可以经过数学方法进行破译,这也为新的进犯方法的产生供给了可能。不过这仅仅一种假设,实际上到现在为止还没有出现针对Rijndael的有效进犯。

现在大家应该运用的是AES,由于它安全、快速,并且可以在各种平台上工作。
一般来说,咱们不应该运用任何自制的暗码算法,而是应该运用AES。由于AES在其选定进程中,经过了全世界暗码学家所进行的高品质的验证工作,而关于自制的暗码算法则很难进行这样的验证。