网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

简化版数据加密标准 | 第二部分

更新时间:2026年03月27日   作者:spoto   标签(Tag):

先决条件 –简化版数据加密标准 | 第1部分

简化版数据加密标准这是一种简化版的数据加密标准算法,其密钥长度为10位,明文长度则為8位。与DES算法相比,它的规模要小得多,因为DES需要64位的明文才能完成加密过程,而该算法只需要8位的明文即可。该算法是为了便于理解DES而设计的。它是一种分组密码算法,采用对称密钥进行加密和解密操作,即使用相同的密钥来完成加密和解密过程。该算法包含两轮加密过程,每轮使用不同的密钥。

首先,我们需要在加密之前生成两个密钥。生成了这些密钥之后, chúng sẽ被传递到每个单独的轮次中,以进行 s-des 加密操作。下图展示了 s-des 算法中的各个步骤。


组件:
S-DES加密算法涉及四个函数。

初始排列(IP)——


2. 复函数(fk)–
这是排列与替换函数的结合。下面的图片展示了一轮加密和解密的过程。这一轮操作在每次加密和解密过程中都会重复两次。
 

fk中的组件包括:
a. 扩展排列法(EP) –
它接受一个4位数的输入,并将其转换为8位数的输出。
 

       
b. S-boxes(S0和S1)—
它是对称密钥算法中的一个基本组成部分,负责执行替换操作。
 

       
c. 排列P4 –


3. 开关(SW) –
 


4. 初始排列的逆序(IP-1)


首先,在加密之前,我们需要生成两个密钥。

Consider, the entered 10-bit key is - 1 0 1 0 0 0 0 0 1 0

因此,

Key-1 is - 1 0 1 0 0 1 0 0Key-2 is - 0 1 0 0 0 0 1 1

加密技术

Entered 8-bit plaintext is - 1 0 0 1 0 1 1 1

步骤1:
我们使用IP表对8位长的明文进行初始排列处理。所谓初始排列,指的是对文本进行重新排列的过程。

IP(k1, k2, k3, k4, k5, k6, k7, k8) = (k2, k6, k3, k1, k4, k8, k5, k7)After ip = 0 1 0 1 1 1 0 1

步骤2:
在进行了初始的排列之后,我们得到了一个8位长的文本块。然后,我们将这个8位块分成两半,每半为4位长。

l = 0 1 0 1  and r = 1 1 0 1

在右侧部分,我们使用EP表来进行扩展排列操作,该表可以将4位转换为8位。所谓扩展排列,就是如此定义的——

EP(k1, k2, k3, k4) = (k4, k1, k2, k3, k2, k3, k4, k1)
After ep = 1 1 1 0 1 0 1 1

我们使用第一个密钥 K1 来执行 XOR 运算,其输出结果就是扩展排列的结果。

Key-1 is - 1 0 1 0 0 1 0 0(1 0 1 0 0 1 0 0) XOR (1 1 1 0 1 0 1 1) =  0 1 0 0 1 1 1 1After XOR operation with 1st Key = 0 1 0 0 1 1 1 1

我们再次将 XOR 的输出分为两半,每半为4位。

l = 0 1 0 0  and r = 1 1 1 1

我们将第1位和第4位视为S盒的行,而第2位和第3位则视为S盒的列。

S0 = [1,0,3,2      3,2,1,0      0,2,1,3      3,1,3,2]S1=  [0,1,2,3      2,0,1,3      3,0,1,0      2,1,0,3]For l = 0 1 0 0row = 00 = 0, column = 10 = 2S0 = 3 = 11For r = 1 1 1 1 row = 11 = 3, column = 11 = 3S1 = 3 = 11After first S-Boxes combining S0 and S1 = 1 1 1 1

S盒会输出2位的数据,我们将这些数据组合在一起,得到4位的数据。然后,我们使用P4表来进行置换操作。P4的定义如下:

P4(k1, k2, k3, k4) = (k2, k4, k3, k1)After P4 = 1 1 1 1

我们将P4表的输出与初始排列表即IP表的左半部分进行XOR运算。

(0 1 0 1) XOR (1 1 1 1) = 1 0 1 0After XOR operation with left nibble of after ip = 1 0 1 0

我们将这两部分结合起来,也就是初始排列中的右侧部分以及 IP 的输出结果。

Combine 1 1 0 1 and 1 0 1 0After combine = 1 0 1 0 1 1 0 1

步骤3:
现在,将输出结果分成两半,每半为4位。然后再次将它们合并起来,不过这次,左边的部分应该变成右边的部分,而右边的部分则变成左边的部分。

After step 3 = 1 1 0 1 1 0 1 0

步骤4:
请再次执行步骤2,但这次在进行扩展排列后的XOR运算时,使用密钥2而不是密钥1。

Expand permutation is defined as - 4 1 2 3 2 3 4 1After second ep = 0 1 0 1 0 1 0 1After XOR operation with 2nd Key = 0 0 0 1 0 1 1 0After second S-Boxes = 1 1 1 1P4 is defined as - 2 4 3 1After P4 = 1 1 1 1After XOR operation with left nibble of after first part = 0 0 1 0After second part = 0 0 1 0 1 0 1 0l = 1 1 0 1  and r = 1 0 1 0

在右侧部分,我们使用EP表来进行扩展排列操作。该表可以将4位转换为8位。所谓扩展排列,就是如此定义的——

EP(k1, k2, k3, k4) = (k4, k1, k2, k3, k2, k3, k4, k1)After second ep = 0 1 0 1 0 1 0 1

我们使用第二个密钥K2来执行XOR运算,其输出结果即为扩展置换的结果。

Key-2 is - 0 1 0 0 0 0 1 1(0 1 0 0 0 0 1 1) XOR (0 1 0 1 0 1 0 1) =  0 0 0 1 0 1 1 0After XOR operation with 2nd Key = 0 0 0 1 0 1 1 0

我们再次将 XOR 的运算结果分为两半,每半为4位。

l = 0 0 0 1  and r = 0 1 1 0

我们将第1位和第4位视为S盒的行,而第2位和第3位则视为S盒的列。

S0 = [1,0,3,2      3,2,1,0      0,2,1,3      3,1,3,2]S1 = [0,1,2,3      2,0,1,3      3,0,1,0      2,1,0,3]For l = 0 0 0 1row = 01 = 1 , column = 00 = 0S0 = 3 = 11For r = 0 1 1 0row = 00 = 0 , column = 11 = 3S1 = 3 = 11After first S-Boxes combining S0 and S1 = 1 1 1 1

S盒会输出2位的数据,我们将这些数据组合在一起,得到4位的数据。然后,我们使用P4表来进行置换操作。P4的定义如下:

P4(k1, k2, k3, k4) = (k2, k4, k3, k1)After P4 = 1 1 1 1

我们将P4表的输出与初始排列表即IP表的左半部分进行XOR运算。

(1 1 0 1) XOR (1 1 1 1) = 0 0 1 0After XOR operation with left nibble of after first part = 0 0 1 0

我们将这两部分结合起来,也就是初始排列的右边部分以及IP的输出结果。

Combine 1 0 1 0 and 0 0 1 0After combine = 0 0 1 0 1 0 1 0After second part = 0 0 1 0 1 0 1 0

步骤5:
执行逆初始排列操作。该表的输出结果即为8位数据的密文。

Output of step 4 : 0 0 1 0 1 0 1 0

逆初始排列的定义如下:

IP-1(k1, k2, k3, k4, k5, k6, k7, k8) = (k4, k1, k3, k5, k7, k2, k8, k6)

8位密文将等于:0 0 1 1 1 0 0 0

Java
/*包名:whatever //此处无需填写包名*/进口java.io.*;公开的类/类别 GFG{// int key[] = {0, 0, 1, 0, 0, 1, 0, 1, 1, 1};整数关键/重要点[]={1,0,1,0,0,0,0,0,1,0};// 用于检查目的的额外示例整数P10[]={3,5,2,7,4,10,1,9,8,6};整数P8[]={6,3,7,4,8,5,10,9};整数key1[]=新的整数[8];整数key2[]=新的整数[8];整数[]IP={2,6,3,1,4,8,5,7};整数[]EP={4,1,2,3,2,3,4,1};整数[]P4={2,4,3,1};整数[]IP_inv={4,1,3,5,7,2,8,6};整数[][]S0={{1,0,3,2},{3,2,1,0},{0,2,1,3},{3,1,3,2}};整数[][]S1={{0,1,2,3},{2,0,1,3},{3,0,1,0},{2,1,0,3}};// 这个函数基本上就是用来生成密钥的(key1和…)//key2) 使用P10和P8进行左移操作,移位次数分别为1和2次无效/无意义关键生成(){整数关键/重要点[]=新的整数[10];为了(整数i=0;i<10;i++){关键/重要[i]=关键/重要事项[P10[i]-1];}整数Ls[]=新的整数[5];整数Rs[]=新的整数[5];为了(整数i=0;i<5;i++){Ls[i]=关键/重要点[i];Rs[i]=关键/重要[i+5];}整数[]Ls_1=切换/转换(Ls,1);整数[]Rs_1=切换/转换(Rs,1);为了(整数i=0;i<5;i++){关键/重要[i]=Ls_1[i];关键/重要[i+5]=Rs_1[i];}为了(整数i=0;i<8;i++){key1[i]=关键/重要点[P8[i]-1];}整数[]Ls_2=切换/转换(Ls,2);整数[]Rs_2=切换/转换(Rs,2);为了(整数i=0;i<5;i++){关键/重要点[i]=Ls_2[i];关键/重要点[i+5]=Rs_2[i];}为了(整数i=0;i<8;i++){key2[i]=关键/重要[P8[i]-1];}系统/体系.外出/离开.println(您的Key-1:);为了(整数i=0;i<8;i++)系统/体系.外出/离开.打印(key1[i]+“”);系统/体系.出去/离开.println();系统/体系.出去/离开.println(您的答案:Key-2);为了(整数i=0;i<8;i++)系统/体系.出去.打印(key2[i]+“ ”);}// 该函数主要用于实现循环移位操作。//数组中的第 n 个位置在左侧整数[]切换/转换
              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料