DES加解密算法实现
一、实验目的
在这一实验中,用VC++实现DES加解密算法。完成实验后,将能够深入理解DES加解密算法及其在VC++中的实现过程。
二、实验条件
熟悉VC++开发环境和有关DES算法知识,安装了VC++6.0系统的计算机。
三、任务描述
对数据进行加密传输能有效地保证数据的机密性,DES算法是一个保护数据的机密性的经典算法,本实验在VC++环境中实现DES算法。在VC++中建立一个项目,并将资料盘中的DES程序代码添入项目中,实现加/解密功能。
四、操作步骤
1.进入Microsoft Vilual C++ 6.0系统界面,选择菜单中的File--New,出现New对话框。
2.在对话框中,选择Projects页,在左侧的列表中选择MFC AppWizard[exe],在Project name文本框中输入新建项目的名称,如DES加解密算法,在Location文本框中选择项目存储路径。单击OK按钮出现MFC AppWizard-step1对话框。
3.在对话框中,选择Dialog based,单击Next按钮。
4.之后出现的对话框MFC AppWizard-step 2 of 4、 MFC AppWizard-step 3 of 4中均单击Next按钮。MFC AppWizard-step 4 of 4中单击Finish,出现New Project Information对话框。单击OK按钮,一个新项目就建成了。
5. 在对话框上添加控件资源,如图1所示。
6.在VC++菜单中选择View中ClassWizard命令,为控件资源定义变量,出现对话框。可以看到类的所有可被定义变量的控件资源,为每个资源分别定义变量。如:在列表中选择IDC_EDIT1,然后单击Add Variable按钮,在其后出现的对话框中输入变量名即可。
图1 DES加密解密对话框
7.添加其他变量,右击CDESDlg在弹出的菜单中选择Add Member Variable…命令,在新出现的对话框中,输入变量类型、变量名,选择变量的访问类型。
8.添加方法。双击按扭控件,可为其添加方法。
9.将方法中程序代码补充完整。
将# include“math.h”添加到DES加解密算法Dlg.cpp的头部。
10.项目完成,编译运行。点击“保存”按钮,将实验结果保存在指定文件如“试验数据.txt”中。
五、实验原理
1.DES算法描述
DES是一个16轮的Feistel型结构密码,它的分组长度为64bit,用一个56bit的密钥来加密一个64bit的明文串,输出一个64bit的密文串。其中,使用密钥为64bit,实用56bit,另8位用作奇偶校验。加密的过程是先对64位明文分组进行初始置换,然后分左、右两部分分别经过16轮迭代,然后再进行循环移位与变换,最后进行逆变换得出密文。加密与解密使用相同的密钥,因而它属于对称密码体制。
图2给出了DES过程框图。假设输入的明文数据是64比特。首先经过初
始置换后把其左半部分32比特记为L0, 右半部分32比特记为R0,即成了置换后的输入。然后把R0与密钥产生器产生的子密钥K1进行计算,其结果记为f(R0, K1)
图2 DES加密算法
再与L0进行模2加得到L0异或f(R0, K1),把R0记为K1放在左边,而把L0异或f(R0, K1)放在右边,从而完成了第一轮的迭代运算。在此基础上重复上述的迭代过程,一直迭代至第16轮。所得的第16轮迭代结果成为预输出,最后经过初始置换的逆置换运算后得到密文。下面会详述DES加密过程中的基本运算。
2.DES中的初始置换IP与逆置换IP_1
对于要加密的明文串64比特,初始置换把原来输入的第58位置换成第1位,原输入的第50位换为第2位,…, 把原输入的第7位置换成第64位,即最后一位。同样的逆初始置换是以预输出作为它的输入,该置换的输出以预输出块的第40位作为它的第1位,…,而以25位作为它的最后一位。
IP[65]={58,50,42,34,26,18,10,2, IP_1[65]= {40,8,48,16,56,24,64,32,
60,52,44,36,28,20,12,4, 39,7,47,15,55,23,63,31,
62,54,46,38,30,22,14,6, 38,6,46,14,54,22,62,30,
64,56,48,40,32,24,16,8, 37,5,45,13,53,21,61,29,
57,49,41,33,25,17,9,1, 36,4,44,12,52,20,60,28,
59,51,43,35,27,19,11,3, 35,3,43,11,51,19,59,27,
61,53,45,37,29,21,13,5, 34,2,42,10,50,18,58,26,
63,55,47,39,31,23,15,7}; 33,1,41,9,49,17,57,25};
3.密码函数f
函数f的输入是一个32比特串(当前状态的右半部)和子密钥。密钥编排方案(k1,k2,…,k32)由16个48比特的子密钥组成,这些子密钥由56比特的种子密钥k导出。每个ki都是由置换选择而来,子密钥的产生过程后面详述。图3给出了函数的示意图。它主要包含了一个应用S盒的替代以及其后跟随的一个固定置换P。密码函数f是整个加密的关键部分,它包含了如下四个功能:扩展函数E、S盒运算、模2加法、置换函数。
(1)扩展函数E
扩展函数E的功能就是将一个32位的输入块扩展为48位的输出块,而这48位的输入块再分成8个6位的块。它是按数组E所示数据选择它所输入中的位而取得的,E(R)的前3位是R的32,1,2位置上的值,而E(R)的最后两位是R的32,1上的值。
E[49]={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,31};
(2) S盒运算
在密码函数f(R,k)中有8个S盒,称为8个不同的选择函数,分别用(S1,S2,…S8)表示,参见下面所示参数设定。每个S盒都是将6位作为输入,得到一个4位块作为输出。S[4][16]= {
{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13},
{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9},
{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12},
{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14},
{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3},
{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13},
{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12},
{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}};
(3)模2加法
模2加功能就是将R的各位与密钥k的各位逐位做模2加,以得到输出bi,以S1为例,若B是6位的一个块,则S1(B)计算如下:B的第一和最后一位表示从0到3之间的二进制数,令该数为i;而B的中间4位表示从0到15之间的二进制数,令该数为j;在该表S1中查第i行第j列的数,它是从0到15之间的一个数,且唯一地由4位块代表,则该块就是输入B的S1的输出S1(B)。例如对于输入为101000而言,行就是10,即第2行;而列是由0100确定,即第5列,S1盒的第二行与底列的交叉处即为B,因而输出为1101,因此1101就是S盒S1在输入为101000时的输出。
在f(R, K)的计算中,它将由模2加运算得到的b1,b2,…,b48按每6个一组共分成8组,顺序记为B1,B2,…,B8,它们分别经过8个选择函数si运算变成C1,C2,…,C32,即S1(B1) S2(B2)…S8(B8)=C1,C2,…,C32。
(4)置换函数
置换函数是通过置换输入块的位,从32位输入中得到32位的输出。置换函数由下所示。由该表确定的函数P的输出P(C),是通过置换C的第16位为P(C)的第1位,取第7位为P(C)的第2位,…,取第25位为P(C)的第32位。
P[33]={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};
令S1,S2,…,S8为8个不同的选择函数,P为置换函数,E为扩展函数,为了计算f(R, K),先规定B1,B2,…,B8每个为6位块,且B1,B2,…,B8=ki与E(Ri-1)异或,于是有f(R, K)=P[S1(B1) S2(B2)…S8(B8)];因此在f(R, K)的计算中将k异或E(R)分8个块,即每位6块(Bi),然后每个Bi取作Si的一个输入就得到每个都为4位的8个块Si(Bi)(i=1,2,…,8)的输出,再将此8块连接成32位的整块。这个整块就构成了P的输入,经P置换,即为f(R, K)的输出。
4.子密钥的生成过程
在DES中,每一轮迭代都使用了一个轮密钥。轮密钥是从用户输入的密钥k(64位)产生的。实用密钥56位,另8位是奇偶校验位;输出密钥的第8,16,…,64位为奇偶校验位(每一字节的最后一位),这些位的值使得每个字节恰好包含了奇数个1,这样如果输入密钥中某个字节中存在一个错误,奇偶校验可以帮助查到这些错误。图4给出了子密钥的生成示意图。
图4 DES子密钥生成过程
具体的子密钥生成过程描述如下:
(1)输入的密钥先经过一个置换选择1进行重排。56位的置换结果被当成两个28位比特的量C0与D0,其中C0是置换结果的前28位,D0是置换结果的后28位;置换选择1如下所示,在置换选择1中不出现第8,16,24,32,40,48,6,4位,因此实际64位的密钥在经过置换选择1后,奇偶校验位被删除掉而仅保留下有效的56位密钥。置换选择1与初始置换IP的含义类似。例如,置换结果C0的第7位是输入密钥的第9位,而置换结果C0的第10位是输入密钥的第54位。
(2)在计算第i轮迭代所需要的子密钥时,首先对Ci-1与Di-1进行循环左移,分别得到Ci与Di。循环的次数取决于i的值,若i=1,2,9,16,循环的次数是1,否则循环左移的次数为2,这些经过移位的值将作为下一个循环的输入。然后,以CiDi作为另外一个又DES算法固定的置换选择2的输入,所得到的置换结果即为第i轮迭代所需要的子密钥ki。
PC_1[57]={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};
PC_2[49]={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};
5.DES的解密过程
DES的解密过程与加密过程共用了同样地计算过程。两者的不同之处仅在于解密时子密钥的使用顺序与加密时相反。设加密时的子密钥为k1,k2,…,k16,那么,解密时子密钥的使用顺序为k16,k15,…,k1,即:用DES解密时,将以64位密文作为输入,第一轮迭代使用子密钥k16,第二轮迭代使用子密钥k15,第16轮迭代使用子密钥k1,其他运算与加密时一样,最后输出的便是64位明文。
第二篇:用C实现DES的加密实验报告
一、实验目的
1、对算法描述可进行充分理解,精确理解算法的各个步骤。
2、完成DES软件算法的详细设计。
3、用C++完成算法的设计模块。
4、编制测试代码。
二、实验内容
根据DES加密标准,用C++设计编写符合DES算法思想的加密程序,并进行测试、分析,并尽量考虑程序的优化。
三、方案设计
DES的总体方案如下图所示。与其他任何一种加密方案一样,加密函数有两个输入:待
加密的明文和密钥。在这里,明文的长度必须为64bit,而密钥的长度为56bit.
DES加密算法的一般描述
观察上图的左边部分,可以看到明文的处理阶段经过了三个阶段。首先64BItde明文经过了一个初始置换IP后,比特重排产生了经过置换的输入。接下来的一个阶段是由对同一个函数进行16次循环组成的,这个函数本身既包含有置换又包含有替代函数。最后一个循环(第16个)的输出由64Bit组成,它是输入明文和密钥的函数,这个输出的左边和右边两个部分经过交换后就得到预输出。最后,预输出通过一个逆初始置换就生成了64bit的密文,这个置换是初始置换的逆置换。
上图的右半部分给出了54Bit密钥的使用方式,密钥首先通过一个置换函数,接着对于16个循环的每一个,都通过一个循环左移操作和一个置换草所的组合产生出一个密钥K1。对每一个循环来说,置换函数是相同的,但由于密钥比特的重复移位,产生的子密钥并不相同。
(a)初始置换
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 36 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
(b)逆初始置换
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 41 9 49 17 57 25
(c)DES的S盒子的定义:
S1
14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7
0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8
4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0
15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13
S2
15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10
3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5
0 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15
13 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9
S3
10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8
13 7 0 9 3 4 6 10 2 8 5 14 12 11 15 1
13 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7
1 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12
S4
7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15
13 8 11 5 6 15 0 3 4 7 2 12 1 10 14 9
10 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4
2 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14
S5
2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9
14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6
4 2 1 11 10 13 7 8 15 9 12 5 6 3 0 14
11 8 12 7 1 14 1 16 3 15 0 9 10 4 5 3
S6
12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11
10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8
9 14 15 5 2 8 12 3 7 0 4 10 1 13 11 6
4 3 2 12 9 5 15 10 11 14 1 7 5 0 8 13
S7
4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1
13 0 1 7 4 9 1 10 14 3 5 12 2 15 8 6
1 4 11 13 12 3 7 14 10 15 6 8 0 5 9 2
6 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12
S8
13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7
1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2
7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8
2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11
密钥的产生:
(a)舍弃64位密钥中的奇偶校验位,根据下表(PC-1)进行密钥变换得到56位的密钥,在变换中,奇偶校验位以被舍弃。
置换选择 1(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
(b) 置换选择2 (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
(c)左移调度
I: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
左移位数: 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1
四、详细设计
算法1
DES_ENC(X64)
Exterual IP, inIP, EXP, POS, SBOX1,……SBOX8
Global K48[1-16]
State64<-IP(x64)
For i<- 1 to 16
Do {令 state64=SL32||SR32
temp48<-EXT(SL32)
temp48<= temp48+K48[i]
令temp48=t6[1]||t6[2]||t6[3]||t6[4]||t6[5]||t6[6]||t6[7]||t6[8]
t4[1]<-SBOX[1] (t6[1])
t4[2]<-SBOX[2] (t6[2])
t4[3]<-SBOX[3] (t6[3])
t4[4]<-SBOX[4] (t6[4])
t4[5]<-SBOX[5] (t6[5])
t4[6]<-SBOX[6] (t6[6])
t4[7]<-SBOX[7] (t6[7])
t4[8]<-SBOX[8] (t6[8])
temp32=t4[1]||t4[2]||t4[3]||t4[4]||t4[5]||t4[6]||t4[7]||t4[8]
temp32<=POS(temp32)
SR32<- temp32(异或)SL32
SL32<-SR32
}
令State64=SL32||SL32
State64<-SR32||SL32
State64<-invIP(State64)
Return State64
算法2 初始置换(IP)
IP(X64)
ConstArray[1-64],<-{58,50,42,34,26,18,10,2,60,52,44,36,28,20,23,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,26,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}
令X64=x1[1]||x1[2]||……||x1[64]
Y64=y1[1]||y1[2]||……||y1[64]
For i<- to 64
do {y1[i] x1[ConstArrayi]
}
Return y64
算法3 逆初始置换
InvIP(m64)
ConstArray[1-64],<-{40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,3
,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,38,35,3,43,11,51,19,59,27,34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25}
令X64=m1[1]||m1[2]||……||m1[64]
Y64=n1[1]||n1[2]||……||n1[64]
For g<-1 to 64
Do {y1[i] = x1[ConstArray1}
Return y64
算法4 扩展置换
EXE(X32)
ConsArray[1-48],<-{32,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18, 19,20,21,22,23,24,25,26,27,28,29,30,31,32,1}
令X32=x1[1]||x1[2]||……||x1[32]
Y64=y1[1]||y1[2]||……||y1[64]
For j<-1 to 48
Do {y1[i] = x1[ConstArray1}
Return y48
算法5 置换函数(P)
ConstArray[1-32],<-{16,7,20,2,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,32,27,3,9,19,13,30,6,22,11,4,25}
令m32=m1[1]||m1[2]||……||m1[32]
Y64=n1[1]||n1[2]||……||n1[32]
For i<-1 to 32
Do {y1[i] = x1[ConstArray1}
Return n32
算法6 关于S盒算法
S盒1
SBOX1(M6)
ConstArray[0-3],[0-15]<-{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}
令m6=m1[1]||m1[2]||……||m1[6]
N4<-ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]+m1[4]*2+m1[5]]
Return n4
S盒2
SBOX2(M6)
ConstArray[0-3],[0-15]<-{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,3,13,4,7,15,2,8,1,4,12,0,1,10,6,9,11,5,0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}
令m6=m1[1]||m1[2]||……||m1[6]
N4<-ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]+m1[4]*2+m1[5]]
Return n4
S盒3
SBOX3(M6)
ConstArray[0-3],[0-15]<-{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}
令m6=m1[1]||m1[2]||……||m1[6]
N4<-ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]+m1[4]*2+m1[5]]
Return n4
S盒4
SBOX4(M6)
ConstArray[0-3],[0-15]<-{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}
令m6=m1[1]||m1[2]||……||m1[6]
N4<-ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]+m1[4]*2+m1[5]]
Return n4
S盒5
SBOX5(M6)
ConstArray[0-3],[0-15]<-{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,11,8,12,7,1,14,2,16,3,15,0,9,10,4,5,3}
令m6=m1[1]||m1[2]||……||m1[6]
N4<-ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]+m1[4]*2+m1[5]]
Return n4
S盒6
SBOX6(M6)
ConstArray[0-3],[0-15]<-{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,4,3,2,12,9,5,15,10,11,14,1,7,5,0,8,13}
S盒7令m6=m1[1]||m1[2]||……||m1[6]
N4<-ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]+m1[4]*2+m1[5]]
Return n4
SBOX7(M7)
ConstArray[0-3],[0-15]<-{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}
令m6=m1[1]||m1[2]||……||m1[6]
N4<-ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]+m1[4]*2+m1[5]]
Return n4
S盒8
SBOX8(M8)
ConstArray[0-3],[0-15]<-{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}
令m6=m1[1]||m1[2]||……||m1[6]
N4<-ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]+m1[4]*2+m1[5]]
Return n4
五、实现过程与测试
通过编译后输出界面如下:
输入8位密钥后,界面如下图所示。
输入字符明文,如下图所示:
六、实验结果分析
成功实现DES加解密算法,但只能完整的完成对于文件、字符串和16进制船的加密。