分组模式:
填充模式:
密钥长度:
密钥:
明文格式:
密文格式:
DES(Data Encryption Standard,数据加密标准)

是一种传统的对称加密算法,由IBM开发,并于1977年被美国国家标准局(NBS,现在的NIST,即国家标准与技术研究院)采纳为联邦信息处理标准(FIPS)。尽管DES 在其时间内被广泛使用,现在它被认为是较不安全的加密方法,因为其56位的秘钥长度相对较短,容易受到暴力破解攻击。

DES的加密与解密

DES 是一种将 64 比特的明文加密成 64 比特的密文的对称密码算法 ,它的密钥长度是 56 比特。尽管从规格上来说,DES 的密钥长度是 64 比特,但由于每隔 7 比 特会设置一个用于错误检查的比特,因此实质上其密钥长度是 56 比特。

DES 是以 64 比特的明文( 比特序列 ) 为一个单位来进行加密的,这个 64 比特的单位称为分组。一般来说,以分组为单位进行处理的密码算法称为分组密码 (block cipher), DES 就是分组密码的一种。

DES 每次只能加密 64 比特的数据,如果要加密的明文比较长,就需要对 DES 加密进行迭代(反复),而迭代的具体方式称为分组模式(mode)


DES的结构(Feistel网络)

DES 的基本结构是由 Horst Feistel 设计的,因此也称为 Feistel 网络(Feistel network)Feistel 结构(Feistel structure)或者Feistel 密码(Feistel cipher)

在 Feistel 网络中,加密的各个步骤称为轮(round), 整个加密过程就是进行若干次轮的循环。下图展现的是 Feistel 网络中一轮的计算流程。DES 是一种 16 轮循环的 Feistel 网络。

一轮的具体计算步骤如下。

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

但是,这样一来“右侧”根本就没有被加密,因此我们需要用不同的子密钥对一轮的处理重复若干次,并在每两轮处理之间将左侧和右侧的数据对调。

多轮 Feistel 网络

3 轮 Feistel 网络的加密
下图展现了一个 3 轮的 Feistel 网络,3 轮加密计算需要进行两次左右对调。 对调只在两轮之间进行,最后一轮结束之后不需要对调。

3 轮 Feistel 网络的解密
Feistel 网络的解密操作只要按照相反的顺序来使用子密钥就可以完成了,而 Feistel 网络本身的结构,在加密和解密时都是完全相同的。

下面我们来总结一下 Feistel 网络的性质。
最容易发现的一点就是,Feistel 网络的轮数可以任意增加。无论运行多少轮的加密计算,都不会发生无法解密的情况。其次,我们还可以发现,加密时无论使用任何函数作为轮函数都可以正确解密。 也就是说,即便用轮函数的输出结果无法逆向计算出输入的值(即该函数不存在反函数)也没有问题。轮函数可以无需考虑解密的问题,可以被设计得任意复杂。

分组模式

详情请见:对称密码介绍——分组密码的模式。
填充模式

  • None: 不填充
  • PKCS7: 填充字符串由一个字节序列组成,每个字节填充该字节序列的长度
  • Zeros: 填充字符串由设置为零的字节组成
  • ANSIX923: 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节均填充数字零
  • ISO10126: 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据

密钥(偏移)

  • Text: 表示是文本格式,加密前会使用 UTF-8 编码,把它转成 byte[] 数组
  • Hex 表示是十六进制格式,加密前会把十六进制字符串转成 byte[] 数组
+