实验二 DES加解密算法的实现

上传人:时间****91 文档编号:125091826 上传时间:2022-07-26 格式:DOC 页数:22 大小:207KB
收藏 版权申诉 举报 下载
实验二 DES加解密算法的实现_第1页
第1页 / 共22页
实验二 DES加解密算法的实现_第2页
第2页 / 共22页
实验二 DES加解密算法的实现_第3页
第3页 / 共22页
资源描述:

《实验二 DES加解密算法的实现》由会员分享,可在线阅读,更多相关《实验二 DES加解密算法的实现(22页珍藏版)》请在装配图网上搜索。

1、 实验二:DES的编程实现一、实验目的 在本实验中,用VC/ C/C+/Java实现DES的加解密算法。完毕实验后将可以进一步理解DES加解密算法及其在VC/ C/C+/Java中的实现过程。二、实验条件 熟悉VC/ C/C+/Java开发环境和有关DES算法的有关知识;一台安装有VC/ C/C+/Java的计算机。三、实验规定 本实验规定:输入十六位十六进制明文(占64Bit)和十六位十六进制密钥(占64Bit),输出十六位十六进制密文和六十四位二进制密文。四、实验环节对数据进行加密传播能有效地保证数据的机密性,DES是一种保证数据机密性的典型算法,本实验拟在VC/ C/C+/Java环境中

2、实现DES算法。如下以VC为例: 重要内容:在VC中建立三个文献:控制台应用程序的入口点:testMain.cpp,DES2加密类cpp文献zlDES2.cpp,DES2加密类头文献zlDES2.h。操作环节: (1)进入VC环境; (2)在VC环境中,执行“文献 | 新建”命令,在“新建”对话框中(如图1)选择“文献”页,在其左侧的列表框中选择“Win32 Console Application”,在右侧的“文献名”文本框中输入新文献名“DES”,在“位置”文本框中选择项目的存储途径(例如选择“e:des”)。然后单击“拟定”按钮。图1 “New(新建)”对话框(3)“Win32 Conso

3、le Application-环节1共1步”对话框中,选择“一种空工程”单选按钮,单击“完毕”按钮,再单击“拟定”按钮。图2 “Win32 Console Application-环节1共1步”对话框(4)在VC环境中,在其左侧的工程工作区窗口下端中选择标签“FileView”,单击“DES files”前面的“+”号展开。图3 标签“FileView”(5)鼠标右击“Source Files”,选择“添加文献到目录”,将testMain.cpp和zlDES.cpp添加进“Source Files”。同样,鼠标右击“Header Files”,选择“添加文献到目录”,将zlDES.h添加进“H

4、eader Files”。成果,如图4。图4 标签“FileView”(6)选择“组建|编译”,分别编译testMain.cpp和zlDES.cpp。然后再选择“组建|执行”,即可看到成果。五、编写源代码(1)DES算法详述(重要描述算法流程) DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法的主流程图如下:其中每一轮轮构造为:(2)可以参照如下VC+代码。 l DES算法代码: n testMain.cpp/#include stdafx.h#include zlDES.hvoid main()zlDES* my_des = new zlDES();/

5、set keychar sz_16key17 = 33738;my_des-InitializeKey(sz_16key,0);printf(密钥 :n 33738 nn);/-stand test-/encryptchar sz_16txt17 = 30337;printf(明文 :n 30337 nn);my_des-EncryptData(sz_16txt,0);/Ciphertext in binprintf(Ciphertext in bin:n %snn,my_des-GetCiphertextInBinary();/Ciphertext in Hexprintf(Cipherte

6、xt in Hex:n %snn,my_des-GetCiphertextInHex();n zlDES.cpp/*-/ 文献名:zlDES.cpp/ 文献功能描述:DES2加密类 cpp文献/-*/#include stdafx.h#include zlDES.h/ permuted choice table (PC1)密钥置换Aconst static char PC1_Table56 = 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

7、, 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;/ permuted choice key (PC2)密钥置换Bconst static char PC2_Table48 = 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,

8、 33, 48,44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32;/ number left rotations of pc1 循环左移位数const static char Shift_Table16 = 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1;/ initial permutation (IP)初始置换IPconst static char IP_Table64 = 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 38, 30

9、, 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;/ expansion operation matrix (E)扩展选位表E盒const static char E_Table48 = 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,8, 9, 10, 11, 12, 13, 12, 13, 1

10、4, 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;/ The (in)famous S-boxes S盒const static char S_Box8416 = / S114, 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,

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

12、 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,

13、 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,/ 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,

14、 12, 7, 1, 14, 2, 13, 6, 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, 6, 0, 8, 13,/ S7 4, 11, 2, 14, 15, 0, 8, 13, 3,

15、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,/ 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

16、, 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;/ 32-bit permutation function P used on the output of the S-boxes P盒const static char P_Table32 = 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, 2

17、2, 11, 4, 25;/ final permutation IP-1 逆置换 IP-1const static char IPR_Table64 = 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, 4

18、1, 9, 49, 17, 57, 25;zlDES:zlDES()memset(szCiphertextRaw,0,64);memset(szPlaintextRaw,0,64);memset(szCiphertextInBytes,0,8);memset(szPlaintextInBytes,0,8);memset(szCiphertextInBinary,0,65);memset(szCiphertextInHex,0,17);memset(szPlaintext,0,9);memset(szFCiphertextAnyLength,0,8192);memset(szCiphertext

19、InHex,0,8192);memset(szPlaintextInHex,0,17);memset(szPlaintextInBinary,0,65);zlDES:zlDES()void zlDES:InitializeKey(char* srcHex,unsigned int keyN)/convert 8 char-bytes key to 64 binary-bitschar sz_64key64 = 0;Hex2Bits(srcHex,sz_64key,64);/PC 1char sz_56key56 = 0;for(int k=0;k56;k+)sz_56keyk = sz_64k

20、eyPC1_Tablek-1;CreateSubKey(sz_56key,keyN);void zlDES:CreateSubKey(char* sz_56key,unsigned int keyN)char szTmpL28 = 0;char szTmpR28 = 0;char szCi28 = 0;char szDi28 = 0;memcpy(szTmpL,sz_56key,28);memcpy(szTmpR,sz_56key + 28,28);for(int i=0;i16;i+)/shift to left/Left 28 bitsmemcpy(szCi,szTmpL + Shift_

21、Tablei,28 - Shift_Tablei);memcpy(szCi + 28 - Shift_Tablei,szTmpL,Shift_Tablei);/Right 28 bitsmemcpy(szDi,szTmpR + Shift_Tablei,28 - Shift_Tablei);memcpy(szDi + 28 - Shift_Tablei,szTmpR,Shift_Tablei);/permuted choice 48 bits keychar szTmp5656 = 0;memcpy(szTmp56,szCi,28);memcpy(szTmp56 + 28,szDi,28);f

22、or(int j=0;j48;j+)szSubKeyskeyNij = szTmp56PC2_Tablej-1;/Evaluate new szTmpL and szTmpRmemcpy(szTmpL,szCi,28);memcpy(szTmpR,szDi,28);void zlDES:EncryptData(char* _srcHex,unsigned int keyN)char szSrcBits64 = 0;char sz_IP64 = 0;char sz_Li32 = 0;char sz_Ri32 = 0;char sz_Final6464 = 0;Hex2Bits(_srcHex,s

23、zSrcBits,64);printf(二进制明文为:n %snn,szSrcBits);/IPInitialPermuteData(szSrcBits,sz_IP);memcpy(sz_Li,sz_IP,32);memcpy(sz_Ri,sz_IP + 32,32);for(int i=0;i16;i+)FunctionF(sz_Li,sz_Ri,i,keyN);/so D=LRmemcpy(sz_Final64,sz_Ri,32);memcpy(sz_Final64 + 32,sz_Li,32);/IPfor(int j=0;j64;j+)szCiphertextRawj = sz_Fin

24、al64IPR_Tablej-1;Bits2Hex(szCiphertextInHex,szCiphertextRaw,64);void zlDES:DecryptData(char* _srcHex,unsigned int keyN)char szSrcBits64 = 0;char sz_IP64 = 0;char sz_Li32 = 0;char sz_Ri32 = 0;char sz_Final6464 = 0;Hex2Bits(_srcHex,szSrcBits,64);/IP - return is sz_IPInitialPermuteData(szSrcBits,sz_IP)

25、;/divide the 64 bits data to two partsmemcpy(sz_Ri,sz_IP,32); /exchange L to Rmemcpy(sz_Li,sz_IP + 32,32); /exchange R to L/16 rounds F and xor and exchangefor(int i=0;i16;i+)FunctionF(sz_Ri,sz_Li,15-i,keyN);memcpy(sz_Final64,sz_Li,32);memcpy(sz_Final64 + 32,sz_Ri,32);/ IPfor(int j=0;j64;j+)szPlaint

26、extRawj = sz_Final64IPR_Tablej-1;Bits2Hex(szPlaintextInHex,szPlaintextRaw,64);void zlDES:FunctionF(char* sz_Li,char* sz_Ri,unsigned int iKey,unsigned int keyN)char sz_48R48 = 0;char sz_xor4848 = 0;char sz_P3232 = 0;char sz_Rii32 = 0;char sz_Key48 = 0;char s_Compress3232 = 0;memcpy(sz_Key,szSubKeyske

27、yNiKey,48);ExpansionR(sz_Ri,sz_48R);XOR(sz_48R,sz_Key,48,sz_xor48);CompressFuncS(sz_xor48,s_Compress32);PermutationP(s_Compress32,sz_P32);XOR(sz_P32,sz_Li,32,sz_Rii);memcpy(sz_Li,sz_Ri,32);memcpy(sz_Ri,sz_Rii,32);void zlDES:InitialPermuteData(char* _src,char* _dst)/IPfor(int i=0;i64;i+)_dsti = _srcI

28、P_Tablei-1;void zlDES:ExpansionR(char* _src,char* _dst)for(int i=0;i48;i+)_dsti = _srcE_Tablei-1;void zlDES:XOR(char* szParam1,char* szParam2, unsigned int uiParamLength, char* szReturnValueBuffer)for(unsigned int i=0; iuiParamLength; i+)szReturnValueBufferi = szParam1i szParam2i;void zlDES:Compress

29、FuncS(char* _src48, char* _dst32)char bTemp86=0;char dstBits4=0;for(int i=0;i8;i+)memcpy(bTempi,_src48+i*6,6);int iX = (bTempi0)*2 + (bTempi5);int iY = 0;for(int j=1;j5;j+)iY += bTempij(4-j);Int2Bits(S_BoxiiXiY, dstBits);memcpy(_dst32 + i * 4, dstBits, 4);void zlDES:PermutationP(char* _src,char* _ds

30、t)for(int i=0;i32;i+)_dsti = _srcP_Tablei-1;void zlDES:Int2Bits(unsigned int _src, char* dstBits)for(unsigned int i=0; i 4; i+)dstBitsi = (_src3;void zlDES:Bits2Hex(char *dstHex, char* srcBits, unsigned int sizeBits)memset(dstHex,0,sizeBits2);for(unsigned int i=0; i 2 += (srcBitsi (3 - (i & 3);for(u

31、nsigned int j=0;j 2);j+)dstHexj += dstHexj 9 ? 55 : 48; /convert to char 0-Fvoid zlDES:Hex2Bits(char *srcHex, char* dstBits, unsigned int sizeBits)memset(dstBits,0,sizeBits);for(unsigned int i=0;i 2);i+)srcHexi -= srcHexi 64 ? 55 : 48; /convert to char int 0-15for(unsigned int j=0; j 2 3;char* zlDES

32、:GetCiphertextInBinary()for(unsigned int i=0;i64;i+)szCiphertextInBinaryi = szCiphertextRawi + 48; / from int(0) to char(0) and int1 to char(1)szCiphertextInBinary64 = 0;return szCiphertextInBinary;char* zlDES:GetCiphertextInHex()return szCiphertextInHex;char* zlDES:GetCiphertextInBytes()return szCi

33、phertextInBytes;char* zlDES:GetPlaintext()memcpy(szPlaintext,szPlaintextInBytes,8);szPlaintext8 = 0;return szPlaintext;n zlDES.h/*- / 文献名:zlDES.h / 文献功能描述:DES2加密类 头文献/-*/-#ifndef zlDESH#define zlDESH#include class zlDESpublic:/类构造函数 zlDES(); /类析构函数 zlDES(); /功能:产生16个48位的key /参数:源8位的字符串(key),寄存key的序号

34、0-1 /成果:函数将调用private CreateSubKey将成果存于char SubKeyskeyN1648 void InitializeKey(char* srcHex,unsigned int keyN); /功能:加密8位字符串 /参数:8位字符串,使用Key的序号0-1 /成果:函数将加密后成果寄存于private szCiphertext16 / 顾客通过属性Ciphertext得到 void EncryptData(char* _srcHex,unsigned int keyN); /功能:解密16位十六进制字符串 /参数:16位十六进制字符串,使用Key的序号0-1 /

35、成果:函数将解密候成果寄存于private szPlaintext8 / 顾客通过属性Plaintext得到 void DecryptData(char* _srcHex,unsigned int keyN);/功能:Int到Bits的转换, /参数:待变换字符串,解决后成果寄存缓冲区指针void Int2Bits(unsigned int srcByte, char* dstBits);/功能:Bits到Hex的转换 /参数:待变换字符串,解决后成果寄存缓冲区指针,Bits缓冲区大小void Bits2Hex(char *dstHex, char* srcBits, unsigned int

36、 sizeBits);/功能:Bits到Hex的转换 /参数:待变换字符串,解决后成果寄存缓冲区指针,Bits缓冲区大小void Hex2Bits(char *srcHex, char* dstBits, unsigned int sizeBits);/szCiphertextInBinary的get函数 char* GetCiphertextInBinary();/szCiphertextInHex的get函数char* GetCiphertextInHex(); /Ciphertext的get函数char* GetCiphertextInBytes();/Plaintext的get函数 c

37、har* GetPlaintext();private: char szSubKeys21648;/储存2个16组48位密钥,第2个用于3DESchar szCiphertextRaw64; /储存二进制密文(64个Bits) int 0,1char szPlaintextRaw64; /储存二进制密文(64个Bits) int 0,1char szCiphertextInBytes8;/储存8位密文 char szPlaintextInBytes8;/储存8位明文字符串char szCiphertextInBinary65; /储存二进制密文(64个Bits) char 0,1,最后一位存0

38、char szCiphertextInHex17; /储存十六进制密文,最后一位存0char szPlaintext9;/储存8位明文字符串,最后一位存0 char szFCiphertextAnyLength8192;/任意长度密文 char szFPlaintextAnyLength8192;/任意长度明文字符串char szPlaintextInHex17;/存储16位十六进制数明文char szPlaintextInBinary65;/存储二进制明文(64个Bits) char 0,1,最后一位存0/功能:生成子密钥 /参数:通过PC1变换的56位二进制字符串,生成的szSubKeys

39、编号0-1 /成果:将保存于char szSubKeys1648 void CreateSubKey(char* sz_56key,unsigned int keyN);/功能:DES中的F函数, /参数:左32位,右32位,key序号(0-15),使用的szSubKeys编号0-1 /成果:均在变换左右32位 void FunctionF(char* sz_Li,char* sz_Ri,unsigned int iKey,unsigned int keyN);/功能:IP变换 /参数:待解决字符串,解决后成果寄存指针 /成果:函数变化第二个参数的内容 void InitialPermuteD

40、ata(char* _src,char* _dst);/功能:将右32位进行扩展位48位, /参数:原32位字符串,扩展后成果寄存指针 /成果:函数变化第二个参数的内容 void ExpansionR(char* _src,char* _dst);/功能:异或函数, /参数:待异或的操作字符串1,字符串2,操作数长度,解决后成果寄存指针 /成果: 函数变化第四个参数的内容 void XOR(char* szParam1,char* szParam2, unsigned int uiParamLength, char* szReturnValueBuffer);/功能:S-BOX , 数据压缩, /参数:48位二进制字符串, /成果:返回成果:32位字符串 void CompressFuncS(char* _src48, char* _dst32);/功能:IP逆变换, /参数:待变换字符串,解决后成果寄存指针 /成果:函数变化第二个参数的内容 void PermutationP(char* _src,char* _dst);#endif4程序的调试与分析

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!