ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:134.63KB ,
资源ID:8066388      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8066388.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(密码学实验三DES算法的实现.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

密码学实验三DES算法的实现.docx

1、密码学实验三DES算法的实现实验三 用DES实现对数据的加解密一、实验目的1. 用DES加密方法实现对明文的加密2用DES解密加密后的密文二、实验内容1、给定八字节明文,输入8位密钥对明文加密2、用同一个密钥对加密的密文解密的到原来的明文三、实验原理实验步骤(包括流程图、功能模块)【实验原理】1、DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则见下表:58,50,12,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38

2、,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,2. 将输入的第58位换到第一位,第50位换到第2位,.,依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0 是右32位,例:设置换前的输入值为D1D2D3.D64,则经过初始置换后的结果为:L0=D550.D8;R0=D57D49.D7。经过26次迭代运算后。得到L16、R16,将此作为输入,进行逆

3、置换,即得到密文输出。逆置换正好是初始置的逆运算,例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位,其逆置换规则如下表所示: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,3. DES算法的解密过程是一样的,区别仅仅在於第一次迭代时用子密钥K15,

4、第二次K14、.,最后一次用K0,算法本身并没有变化。【算法流程图】【功能模块】1.输入明文: void DES:SetMsg(char* _msg, int _length) if (_length8) return; for (int i = 0; i 8) return; for (int i = 0; i _length; i+) keyi = _keyi; /转成二进制 Char2Bit(key, bkey, 8);3.各种置换: void DES:InitSwap(bool in64) /打乱 for (int i = 0; i 32; i+) lmsgii = inipi - 1

5、; rmsgii = inipi + 32 - 1; ;/初始逆置换函数void DES:InitReSwap(bool out64) /组合成64数组 bool temp64; for (int i = 0; i 32; i+) tempi = rmsgii; temp32 + i = lmsgii; /按照逆ip矩阵 for (int i = 0; i 64; i+) outi = tempback_ipi - 1; ;/void DES:SubKeyOff(bool* _subkey, int _off) bool temp; for (int i = 0; i _off; i+) te

6、mp = _subkey0; for (int i = 0; i 27; i+) _subkeyi = _subkeyi + 1; _subkey27 = temp; ;4.S盒处理: void DES:DealSBox(bool in48, bool out32) bool _in6, _out4; /8个盒子 for (int i = 0; i 8; i+) /提取盒子 for (int j = 0; j 6; j+) _inj = ini * 6 + j; /压缩 _DealSBox(_in, _out, i); /放进out数组 for (int jj = 0; jj 4; jj+)

7、outi * 4 + jj = _outjj; ;5.加密函数: void DES:CrypteFunction(bool in32, int isubkey, bool out32) /e 操作 bool temp148; EOperation(in, temp1); bool temp248; Mode2Add(temp1, (bool *)subkeyisubkey, temp2, 48);/ok /盒子压缩 bool temp348; DealSBox(temp2, temp3); /置换运算p POperation(temp3, out);6.解密函数: void DES:Decip

8、her() bool temp132, temp232; /初始置换ip InitSwap(bcryptedmsg); /16轮迭代加密 for (int i = 0; i 16; i+) if (i % 2 = 0) /L1=R0 CopyArray(rmsgi, lmsgi1, 32); /f(R0,k0) CrypteFunction(rmsgi, 15 - i, temp1); /L0+f(R0,k0) Mode2Add(lmsgi, temp1, temp2, 32); /R1=L0+f(R0,k0) CopyArray(temp2, rmsgi1, 32); else /L2=R1

9、 CopyArray(rmsgi1, lmsgi, 32); /f(R1,k1) CrypteFunction(rmsgi1, 15 - i, temp1); /L1+f(R1,k1) Mode2Add(lmsgi1, temp1, temp2, 32); /R2=L1+f(R1,k1) CopyArray(temp2, rmsgi, 32); /逆初始置换ip InitReSwap(bdecipher); /转成字符 Bit2Char(bdecipher, decipher);四、软件使用说明(开发环境、参数使用详细说明、实验结果+相应截图等)【开发环境】Microsoft Visual S

10、tudio 2015Microsoft Windows 10【参数使用】 char* msg;char *key;【实验结果】实验数据:六、参考资料(书籍或网络文章)密码编码学与网络安全原理与实践(第五版)XX七、实验心得和总结 做这次DES加解密实验前首先要充分了解其原理,在这个实验中,比较难的就是,要将明文和密钥经过初始变换和十六轮加密变换等一系列变换后才能得到置换,其中的变换步骤比较多,而且比较复杂,还要将十六进制转化为二进制,工作量比较大。附:程序源代码#includestdafx.h#include#includeusing namespace std;class DESprivat

11、e: /明文 char msg8; bool bmsg64; /密钥 char key8; bool bkey64; /16个子密钥 bool subkey1648; /l0 r0中间变量 bool rmsgi32, lmsgi32;/第i个 bool rmsgi132, lmsgi132;/第i+1个 /密文 bool bcryptedmsg64; char cryptedmsg8; /解密的结果 bool bdecipher64; char decipher8;private: /静态常量 /不允许在类内初始化 /初始值换ip const static int ip64; /子密钥 /置换

12、选择1 const static int c028; const static int d028; /循环左移表 const static int keyoff16; /置换选择2 const static int di48; /加密函数 /e运算 const static int e_operate48; /sbox const static int sbox864; /置换运算p const static int p_operate32; /逆初始置换ip const static int back_ip64; /位掩码 const static char bitmask8;public:

13、 /设置明文和密钥 /_length要小于或等于8 void SetMsg(char* _msg, int _length); void SetKey(char* _msg, int _length); /生产子密钥 void ProduceSubKey(); /总的的加密流程 void Crypte(); /解密 void Decipher(); /输出密文 void OutPutCryptedMsg(); /二进制转成字符 void Bit2Char(bool* _barray, char* _carray);/length=64 /输出解密后的明文 void OutPutDecipher

14、();private: /字符转成二进制,并保存到64位bool数组中 void Char2Bit(char* _carray, bool* _barray, int length); /二进制转成字符 /void Bit2Char(bool* _barray,char* _carray);/length=64 /初始置换 void InitSwap(bool in64); /初始逆置换 void InitReSwap(bool out64); /循环左移 void SubKeyOff(bool* _subkey, int _off); /e运算操作函数 void EOperation(boo

15、l a32, bool b48); /模2相加 /相同为0 不同为1 void Mode2Add(bool a, bool b, bool c, int length); /sbox void DealSBox(bool in48, bool out32); void _DealSBox(bool in6, bool out4, int box); /p opraration void POperation(bool temp32, bool result32); /加密函数 void CrypteFunction(bool in32, int isubkey, bool out32); /数

16、组之间赋值 void CopyArray(bool array1, bool array2, int size);using namespace std;/静态常量const int DES:ip64 = 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;const i

17、nt DES:c028 = 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;const int DES:d028 = 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;const int DES:keyoff16 = 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1;const int DES:di48 = 14,17,11,24,1,5, 3,28

18、,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;const int DES:e_operate48 = 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;const int DES

19、:sbox864 = 14, 4, 13, 1, 1, 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

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

21、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, 1

22、1, 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,

23、 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

24、, 9, 5, 0, 15, 14, 2, 3, 12 , 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 13, 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 ;const int DES:p_operate32 = 16,7,20,21, 29,12,28,17,

25、1,15,23,26, 5,18,31,10, 2,8,24,14, 32,27,3,9, 19,13,30,6, 22,11,4,25;const int DES:back_ip64 = 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;const char DES:

26、bitmask8 = 128,64,32,16,8,4,2,1 ;/实现函数/设置明文/void DES:SetMsg(char* _msg, int _length) if (_length8) return; for (int i = 0; i 8) return; for (int i = 0; i _length; i+) keyi = _keyi; /转成二进制 Char2Bit(key, bkey, 8);/字符转成二进制void DES:Char2Bit(char* _carray, bool* _barray, int length) /int index=0; for (int i = 0; i length; i+) for (int j = 0; j j) & 1; ;/二进制转成字符/void DES:Bit2Char(bool* _barray, char* _carray) char temp; for (int i = 0; i 8; i+) /数学方法转成字符 temp = 0; for (int j = 0; j 8; j+) if (_barrayi * 8 + j = 1) temp |= bitmaskj; /couttemp; _carr

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1