您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页DES算法实验报告

DES算法实验报告

来源:飒榕旅游知识分享网


实 验 报 告

:xxxx 学号:0XXXXX 班级:XXXXXXX 日期:2013/11/*

题目:DES算法实验

一、实验环境

1.硬件配置:

处理器:Inter(R) Core(TM) i5-2430M CPU 2.40GHz (4 CPUs) ,~2.4GHz 存:2048MB RAM 2.使用软件:

(1) 操作系统:win7 旗舰版

(2) 软件工具:Microsoft Visual c++ 6.0

二、实验涉及的相关概念或基本原理

DES是一个分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56位)对64比特的数据分组(二进制数据)加密,产生64位密文数据。DES是一个对称密码体制,加密和解密使用同意密钥,解密和加密使用同一算法(这样,在硬件与软件设计时有利于加密单元的重用)。DES的所有的性均依赖于密钥。

DES的加密过程可分为加密处理,加密变换和子密钥生成几个部分组成。 1.加密处理过程 (1)初始置换IP。加密处理首先要对64位的明文按表1所示的初始换位表IP进行变换。表中的数值表示输入位被置换后的新位置。

word资料

(2)加密处理。上述换位处理的输出,中间要经过16轮加密变换。初始置换的64位的输出作为下一次的输入,将64位分为左、右两个32位,分别记为L0和R0,从L0、R0到L16、R16,共进行16轮加密变换。其中,经过i轮处理后的点左右32位分别为Li和Ri则可做如下定义:

Li=Ri-1

Ri=Li-1 ⊕F(Ri-1,K) 其中,F为F变换

(3)最后换位。进行16轮的加密变换之后,将L16和R16合成64位的数据,再按照表2所示的最后换位表进行IP-1的换位,得到64位的密文,这就是DES算法加密的结果。

2.加密变换过程

64位的密钥先由置换选择1减少至56六位,进行循环左移,然后通过置换选择2减少至48位。而通过扩展运算将32位按表3扩展换位表扩展为48位的右半部分通过异或操作和48位的密钥结合,并分成6位的8个分组,通过8个S-盒将这48位替代成新的32位数据。

word资料

按此进行,输出32位,再按照表4 换位表P进行变换,这样就完成了F(R,K)的变换。

3.子密钥生成过程

密钥通常表示为64位的自然数,首先通过压缩换位Key_Exchange去掉每个字节的第8位,用作奇偶校验。因此,密钥去掉第8、16、24……64位减至56位,所以实际密钥长度为56位。而每轮要生成48位的子密钥。输入的64位密钥,首先通过压缩换位得到56位的密钥,每层分成两部分,一部分28位为C0,一部分为D0。C0和D0依次进行循环左移操作生成了C1和D1,将C1和D1合成56位,再通过压缩换位Compression输出48位的子密钥K1,再将C1和D1进行循环左移和Compression压缩换位,得到子密钥K2……以此类推,得到16个子密钥。密钥压缩换位表如表5表6所示。

word资料

在产生子密钥的过程中左移次数如表7所示。

4.解密处理过程

从密文到明文的解密过程可采用与加密完全相同的算法。不过解密要用加密的逆变换,就是把上面的最后换位表和初始换位表完全倒过来变换。 三、实验容 流程图:

word资料

主要代码: ①初始置换

unsigned char Initial [] = {

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 };

②逆初始置换

unsigned char Final[] = {

word资料

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 };

③扩展变换E

unsigned char Expansion[] = {

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_盒置换

unsigned char P_Box[]= {

16, 7, 20, 21, 29, 12, 28, 17,1, 15, 23, 26, 5, 18, 31, 30,2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 };

⑤S盒置换

unsigned char S_Box[8][4][16] = {

/* 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}, {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},

word资料

{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}}, /* 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, 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, 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}} };

⑥置换选择1

unsigned char Key_Exchange[56] = {

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

unsigned char Compression[] = {

14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 9, 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 };

⑧循环左移位数

unsigned char Key_Move[]= {

1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 1 };

⑨产生子密钥

int Key_Process(bool key[64],bool Sub_Key[16][48] ) {

int round ; bool temp[56];

Key_Transform1(key,temp); for(round=0;round<16;round++)

word资料

{

Key_Rotate(temp,Key_Move[round]) ; Key_Transform2(temp,Sub_Key[round]); }

return 0; }

异或

int XOR(bool KR[48],bool KL[48] ,int count) {

int i;

for(i=0;iKR[i]^=KL[i]; }

return 0; }

加密算法

int DES_Encrypt(bool Message[8],bool Sub_Key[16][48], bool Final_Result[8]) {

bool Expanded_Right[48]; bool Result[64]; int round;

Char8ToBit64(Message,Result); Initial_Exchange(Result);

for(round=0;round<16;round++) {

memcpy(Expanded_Right,Result+32,32); M_Expand(Expanded_Right);

XOR(Expanded_Right,Sub_Key[round],48); S_function(Expanded_Right); P_function(Expanded_Right); XOR(Result,Expanded_Right,32); if(round!=15)

Swap(Result,Result+32); }

Final_Exchange(Result);

Bit64ToChar8(Result,Final_Result); return 0; }

解密算法

int DES_Decrypt(bool Final_Result[8],bool Sub_Key[16][48],

word资料

bool Message[8]) {

bool Expanded_Right[48]; bool Result[64]; int round;

Char8ToBit64(Final_Result,Result); Initial_Exchange(Result);

for(round=15;round>=0;round--) {

memcpy(Expanded_Right,Result+32,32); M_Expand(Expanded_Right);

XOR(Expanded_Right,Sub_Key[round],48); S_function(Expanded_Right); P_function(Expanded_Right); XOR(Result,Expanded_Right,32); if(round!= 0)

Swap(Result,Result+32); }

Final_Exchange(Result);

Bit64ToChar8(Result,Message); return 0; }

加密文件

int DES_EncryptFile(char *Final_Result) {

FILE *input,*output; int count;

unsigned name[30]; unsigned char key[64];

bool InputBlock[8],OutputBlock[8],keyBlock[8]; bool bKey[64];

bool Sub_Key[16][48]; printf(\"输入文件名\\n\"); scanf(\"%s\

printf(\"输入密钥\\n\"); scanf(\"%s\ getchar();

if((input=fopen(name,\"rb\")) == NULL) return 0;

if((output=fopen(Final_Result,\"wb\")) == NULL) return 0;

memcpy(keyBlock,key,8);

Char8ToBit64(keyBlock,bKey); Key_Process(bKey,Sub_Key); while(!feof(input))

word资料

{

if((count=fread(InputBlock,sizeof(char),8,input)) == 8) {

DES_Encrypt(InputBlock,Sub_Key,OutputBlock); fwrite(OutputBlock,sizeof(char),8,output); } }

if(count) {

memset(InputBlock+ count,'\\0',7 - count); InputBlock[7] = 8 - count;

DES_Encrypt(InputBlock,Sub_Key,OutputBlock); fwrite(OutputBlock,sizeof(char),8,output); }

fclose(input); fclose(output); return 1; }

解密文件

int DES_DecryptFile(char *Message) {

FILE *input, *output; int count,times = 0; long fileLen;

unsigned name[30]; unsigned char key[64];

bool inputBlock[8],outputBlock[8],keyBlock[8]; bool bKey[64];

bool Sub_Key[16][48]; printf(\"输入文件名\\n\"); scanf(\"%s\ printf(\"输入密钥\\n\"); scanf(\"%s\ getchar();

if((output = fopen(name,\"rb\")) == NULL) return 0;

if((input = fopen(Message,\"wb\")) == NULL) return 0;

memcpy(keyBlock,key,8);

Char8ToBit64(keyBlock,bKey); Key_Process(bKey,Sub_Key); fseek(output,0,SEEK_END); fileLen=ftell(output); rewind(output); while(1)

word资料

{

fread(outputBlock,sizeof(char),8,output); DES_Decrypt(outputBlock,Sub_Key,inputBlock); times += 8;

if(times < fileLen)

fwrite(inputBlock,sizeof(char),8,input); else break; }

if(inputBlock[7]<8) {

for(count=8-inputBlock[7];count<7;count++) {

if(inputBlock[count]!='\\0') {

break; } } }

if(count == 7)

fwrite(inputBlock,sizeof(char),8 - inputBlock[7],input); else {

fwrite(inputBlock,sizeof(char),8,input); }

fclose(input); fclose(output); return 1; }

四、实验总结分析

1、心得体会

对DES加密算法有了进一步的认识与了解,对DES算法的结构和优缺点也有了了解,相信在以后的学习与实践中,能够更好地运用这些算法。

word资料

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sarr.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务