实现 DES 的工作模式
一、 实验目的
-
掌握 DES 算法的工作原理;
-
熟悉分组加密算法的工作模式。
二、 实验原理
- DES 的基本原理
ppop 其入口参数有三个:key、data、mode。 Key 为加密解密使用的密钥,data 为加密解密的数据,mode 为其工作模式。当模式为加密模式时,明文按照 64 位进行分组,形成明文组, key 用于对数据加密,当模式为解密模式时,key 用于对数据解密。实际运用中,密钥只用到了 64 位中的 56 位,这样才具有高的安全性。
- 分组密码工作模式
电码本模式(ECB)的加密过程:
C i = E ( K , P i ) , i = 1 , 2 , ⋅ ⋅ ⋅ N \begin{aligned} C_i = E(K,P_i),i=1,2,···N \end{aligned} Ci=E(K,Pi),i=1,2,⋅⋅⋅N
密码分组链接模式(CBC)的加密过程:
C 1 = E ( K , [ P 1 ⨁ I V ] ) , C j = E ( K , [ P 1 ⨁ C j − 1 ] ) , j = 2 , 3 , ⋅ ⋅ ⋅ N C_1=E(K,[P_1\bigoplus IV]),\\ C_j =E(K,[P_1\bigoplus C_ {j-1}]),j=2,3,···N C1=E(K,[P1⨁IV]),Cj=E(K,[P1⨁Cj−1]),j=2,3,⋅⋅⋅N
DES 是原型块密码— 一种算法,它采用固定长度的明文位字符串,并通过一系列复杂的操作将其转换为另一个相同长度的密文位字符串。对于 DES,块大小为 64 位。DES还使用密钥来自定义转换,因此解密只能由那些知道用于加密的特定密钥的人执行。密钥表面上由64位组成;但是,算法实际使用了其中的56个。KEY的每个 8 位字节中的一个位可用于密钥生成、分发和存储中的错误检测。位 8、16,…, 64 用于确保每个字节具有奇偶校验。第八位仅用于检查奇偶校验,然后被丢弃。因此,有效密钥长度为 56 位。
该算法的整体结构如图 1 所示:有 16 个相同的处理阶段,称为轮次。还有一个初始和最终排列,称为IP和FP,它们是逆的(IP"撤消"FP的作用,反之亦然)。IP 和 FP 没有加密意义,但包括在内是为了便于在 20 世纪 70 年代中期基于 8 位的硬件中加载块。
在主回合之前,块被分成两个32位的半部分并交替处理;这种纵横交错被称为Feistel方案。Feistel 结构可确保解密和加密是非常相似的过程 — 唯一的区别是解密时子密钥以相反的顺序应用。算法的其余部分是相同的。这大大简化了实现,特别是在硬件中,因为不需要单独的加密和解密算法。
⊕符号表示抑或(XOR) 操作。F 函数将半个块与一些键一起打乱。然后,F函数的输出与块的另一半组合,并在下一轮之前交换一半。在最后一轮之后,交换一半;这是Feistel结构的一个特征,它使加密和解密过程相似。
DES 的 Feistel 函数(F 函数)
轮函数的作用是根据“右侧”和子密钥生成对“左侧”进行加密的比特序列,它是密码系统的核心。将轮函数的输出与“左侧”进行XOR运算,其结果就是“加密后的左侧”。也就是说,我们用XOR将轮函数的输出与“左侧”进行了合并。而输人的“右侧”则会直接成为输出的“右侧”。
总结一下,一轮的具体计算步骤如下:
- 将输人的数据等分为左右两部分
- 将输人的右侧直接发送到输出的右侧
- 将输人的右侧发送到轮函数
- 轮函数根据右侧数据和子密钥,计算出一串看上去是随机的比特序列
- 将上一步得到的比特序列与左侧数据进行XOR运算,并将结果作为加密后的左侧。
但是,这样一来“右侧”根本就没有被加密,因此我们需要用不同的子密钥对一轮的处理重复若干次,并在每两轮处理之间将左侧和右侧的数据对调。
Feistel具体的轮函数一次在半个块(32 位)上运行,由四个阶段组成:
- 扩展:32位半块使用扩展排列(在图中表示为E)通过复制一半的位来扩展到48位。输出由 8 个 6 位(8 × 6 = 48 位)片段组成,每个片段包含 4 个相应输入位的副本,以及从每个输入片段到任一侧的紧邻位的副本。
- 抑或:使用 XOR 操作将结果与子密码(subkey)组合在一起。16 个 48 位子密钥(每轮一个)使用从主密钥派生(如下所述)。
- S盒替换:在子键中混合后,块被分成八个6位片段,然后由或替换框处理。八个 S-box 中的每一个都根据非线性变换将其六个输入位替换为四个输出位,该变换以查找表的形式提供。S-box提供了DES安全性的核心 - 没有它们,密码将是线性的,并且很容易损坏。
- P盒排列:最后,来自S盒的32个输出根据固定排列重新排列,即P盒。这样做是为了在排列之后,本轮中每个 S 盒输出的位在下一轮中分布在四个不同的 S 盒中。
三、 实验要求
1.编写一个 DES 算法,输出其每一轮的加密结果并显示在屏幕上;
2.编程实现对文件的加密,加密模式:电码本、分组链接模式。
四、 实验内容
1. 编程实现 DES 算法;
java实现
先定义一个BOX类用于存放各种盒子
package com.des.demo;
public class Box {
// E 扩展置换
public static int[] E = {
32, 1, 2, 3, 4, 5,
4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13,
12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21,
20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29,
28, 29, 30, 31, 32, 1
};
//P置换表
public static int[] P = {
16, 7, 20, 21, 29, 12, 28, 17,
1, 15, 23, 26, 5, 18, 31, 10,
2, 8, 24, 14, 32, 27, 3, 9,
19, 13, 30, 6, 22, 11, 4, 25
};
// 置换选择1,PC_1将64位密钥减至56位
public static int[] PC_1 = {
57, 49, 41, 33, 25, 17, 9,
1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27,
19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15,
7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29,
21, 13, 5, 28, 20, 12, 4
};
//置换选择2,PC_2 用于将循环左移和右移后的56bit密钥压缩为48bit
public static int[] PC_2 = {
14, 17, 11, 24, 1, 5,
3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8,
16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55,
30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53,
46, 42, 50, 36, 29, 32
};
// IP FP置换表
public static int[] IP = {
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7
};
public static int[] FP = {
40, 8, 48, 16, 56, 24, 64, 32,
39, 7, 47, 15, 55, 23, 63, 31,
38, 6, 46, 14, 54, 22, 62, 30,
37, 5, 45, 13, 53, 21, 61, 29,
36, 4, 44, 12, 52, 20, 60, 28,
35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26,
33, 1</