Java Code for DES

29 Mar 2025 | 7 分钟阅读

我们对互联网的依赖日益增加,我们与他人分享大量个人信息。由于我们的数据或个人信息不安全。因此,数据安全对我们至关重要。我们需要使数据保密、不被修改,并且只能由授权的读者访问。我们可以通过使用 DES(数据加密标准) 机制来确保数据安全,该机制可以 加密解密 数据。使用 DES 算法 是加密和解密数据最流行的方式。它是一种广泛使用的 对称(加密和解密)算法。

在本节中,我们将学习用于生成 密文DES 算法。此外,我们还将在 Java 程序 中实现 DES 算法

Java Code for DES

DES 算法

DES 代表数据加密标准。它是一种对称密钥分组密码算法,用于加密和解密数据。它由 IBM 团队于 20 世纪 70 年代初开发。它接受 64 位分组的明文,并将其转换为使用 64 位密钥加密数据的密文。该算法使用相同的密钥来加密和解密数据。

它基于 LUCIFER(也称为 Feistel 分组密码算法),它是 DES 算法的直接前身。由 IBM 的杰出学者和研究员 Horst Feistel 开发。它通过使用 128 位密钥块和 128 位块大小提供高安全性。DES 算法使用 16 轮 Feistel 结构。该结构为每轮使用一个唯一的密钥。最后,在 1976 年,它被批准为联邦加密标准。

2002 年,AES(高级加密标准)取代 DES 加密算法成为公认的标准。之后在 1995 年,引入了 DES 算法的增强版本,称为 Triple DES(3DES 或 TDES)。正式名称为 Triple Data Encryption Algorithm(TDEA 或 3DEA)。

TDEA 也是一种对称密钥分组密码算法,它对每个数据块使用 DES 密码算法三次。其块大小为 64 位,密钥大小分别为 168、112 和 56 位,分别对应密钥 1、2 和 3。它还使用与 DES 相当的轮数,即 48 轮。这意味着每个密钥有 16 轮。

Java Code for DES

它使用第一个密钥(k1)加密数据,使用第二个密钥(k2)解密数据,然后再次使用第三个密钥(k3)加密数据。该算法的另一种变体仅使用两个密钥 k1 和 k3。其中密钥 k1 和 k3 相同。它仍然在使用,但被视为遗留算法。

下图显示了使用 TDEA 进行的加密和解密。

Java Code for DES

让我们来理解 DES 算法。

生成密钥

该算法执行 16 轮加密,并且为每一轮生成一个唯一的密钥。在进行步骤之前,了解明文中的位标记为 1 到 64 很重要,其中 1 是最高有效位,64 是最低有效位。生成密钥的步骤如下:

1. 首先,我们使用下表将给定的 64 位密钥压缩并置换为 48 位密钥。

2. 将结果分成两个相等的 C 和 D 部分。

3. C 和 D 部分进行循环左移。对于加密,第 1、2、9 和 16 轮负责将位左移 1 位,循环进行。所有剩余的轮左移 2 位,循环进行。

4. 之后,使用下表将结果压缩为 48 位。

5. 从步骤 3 获得的结果将成为下一轮密钥生成的输入。

算法的加密步骤

该算法包括以下步骤:

  1. 算法以 64 位明文作为输入。
  2. 文本被解析到一个称为初始置换(IP)函数的功能中。
  3. 初始置换(IP)函数将明文分成置换块的两个部分。这两个块称为左明文(LPT)和右明文(RPT)。
  4. 对 LPT 和 RPT 块执行 16 轮加密过程。加密过程执行以下操作:
    1. 密钥转换
    2. 扩展置换
    3. S-盒置换
    4. P-盒置换
    5. XOR 和交换
  5. 在执行完加密过程后,将 LPT 和 RPT 块重新组合。然后,对组合块应用最终置换(FP)。
  6. 最后,我们得到明文的 64 位密文。
Java Code for DES

算法的解密步骤

对于密文的解密,我们使用相同的算法,但顺序相反(步骤 4)的 16 轮密钥。

为了更好地理解算法,让我们看看 DES 算法的操作模式。

DES 的操作模式

有以下五种可供选择的操作模式:

  1. ECB(电子密码本):每个 64 位块独立加密和解密。
  2. CBC(密码块链接):在块链接中,每个块取决于前一个块,并使用初始化向量(IV)。
  3. CFB(密文反馈):从上一步获得的密文成为算法的输入。该操作产生伪随机输出。获得的输出与明文进行 XOR,并为下一操作生成密文。
  4. OFB(输出反馈):它与 CFB 类似。不同之处在于加密算法的输入是前一个 DES 的输出。
  5. CTR(计数器):每个明文块与一个加密的计数器进行 XOR。之后,计数器会随着每个后续块而递增。

我们得出结论,算法的基本步骤是:

  • 首先,我们需要使用 KeyGenerator 生成一个秘密 密钥
  • 创建两个 Cipher,一个用于加密,另一个用于解密。请记住,密钥必须与我们在 Initialization Vector(IV)中指定的密钥相同。
  • 最后,使用 CipherOutputStreamCipherInputStream 写入和读取加密或解密的数据。

让我们在 Java 程序中实现 DES 算法,看看数据是如何使用该算法进行加密和解密的。

DesProgram.java

在运行上述程序之前,您需要对程序进行一些更改。首先,您需要创建一个您想要加密的文本文件。在本例中,我们创建了一个名为 DemoData.txt 的文件,并将以下文本写入其中。您可以写任何内容。

DemoData.txt

Java Code for DES

让我们运行上面的程序,看看输出。

输出

Java Code for DES

当我们运行上面的程序时,它会在指定位置生成两个文件 encrypteddata.txtdeecrypteddata.txt。让我们看看加密和解密文件里面有什么。

encrypteddata.txt

Java Code for DES

deecrypteddata.txt

Java Code for DES

我们看到数据已解密为与我们在 DemoData.txt 文件中写入的相同文本。