密码学des

密码学des

2023年7月12日发(作者:)

一、实验目的

1. 掌握对称加密算法DES的算法结构、流程

2. 掌握DES的核心算法模块,掌握Feistel结构的中间处理过程

3. 掌握DES算法在信息安全中的应用

二、实现工具

Vs2012

三、 实验内容

(一)程序说明

1. 系统流程图(各个函数或类的调用流程图)

主函数:

1.主函数流程:开始获取输入的明文调用解密函数和密钥

调用加密函数输出对应的解密结果输出对应的流程结果输出解密后的密文结束

加密函数:

第 1 页 共 9 页 加密函数:开始IP初始变换For循环控制轮数左右32位交换输出变换后的密文结束F变换函数:

开始定义了两个bit型的数组临时存储或返回扩展后的数据扩展运算将扩展后变换后的数组与轮密钥进行异或运算,调用Xor()方法在将扩展后的48位经过压缩变换为32位将置换后的数组返回结束第 2 页 共 9 页

密钥的产生:

轮密钥生成函数:开始定义了两个数组判断当前的轮数是否等于1、2、9、16否左移2位否传递的轮参数是否等于0是返回置换选择后的数组是左移1位置换选择2将56位换位48位输出置换选择1,去掉8的倍数,将64位密钥转换56位返回生成的

permKey[48]返回一个56位的数组结束

解密函数

解密函数:开始

IP初始变换交换函数获取轮密钥调用解密逆初始置换结束

第 3 页 共 9 页 DES的基本原理:将明文分割成许多64位大小的块,每个块用64位密钥进行加密,实际上,密钥由56位数据位和8 位奇偶校验位组成。每块先用初始置换方法进行加密,再连续进行16次复杂的替换,最后再对其施用初始置换的逆。第i步的替换并不是直接利用原始的密钥K,而是由K与i计算出的密钥Ki。

1、初始置换

初始置换在第一轮运算之前执行,对输入分组实施变化,用初始置换矩阵IP做变换。例如,初始置换把明文的第58位换到第1位的位置,把第50位换到第2位的位置,把第42位换到第3位的位置,等等。

再将这64位数据分为左右两部分,每部分分别为32位。

2.密钥置换

一开始,由于不考虑每个字节的第8位,DES的密钥由64位减至56位,每个字节第8位可作为奇偶校验位以确保密钥不发生错误,所以将这64比特中的第8,16,……64位。

然后将这56位按照置换选择1进行变换 接着,56位密钥被分成两部分,每部分28位。然后,根据轮数,这两部分分别循环左移l位或2位。下表给出了每轮移动的位数。在DES的每一轮中,将56位密钥按置换选择2进行变换,选出其中48位作为当轮的子密钥(Sub Key)。

3.密钥产生过程:

在DES算法中,DES的解密过程和DES的加密过程完全类似,只不过将16圈的子密钥序列K1,K2……K16的顺序倒过来。即第一圈用第16个子密钥K16,第二圈用K15,其余类推。

如果K16=K1,K15=K2,…,K9=K8,则加密所用的子密钥与解密所用的子密钥相同,第 4 页 共 9 页 对一个明文X加密两次,得到的还是明文X。 更强的,若K1=K2=…=K16,则加密过程与解密过程完全一样。

弱密钥的定义也就是这样定义:若k使得加密函数与解密函数一致,则称k为弱密钥,

(二)实验步骤及结果

// 表置换函数 OK

void TablePermute(bool *DatOut,bool *DatIn,const char *Table,int Num)

{

int i=0;

static bool Temp[256]={0};

for(i=0;i

{

Temp[i]=DatIn[Table[i]-1]; // 原来的数据按对应的表上的位置排列

}

BitsCopy(DatOut,Temp,Num); // 把缓存Temp的值输出

}

第 5 页 共 9 页 // 子密钥的移位

void LoopMove(bool *DatIn,int Len,int Num) // 循环左移 Len数据长度 Num移动位数

{

static bool Temp[256]={0}; // 缓存 OK

BitsCopy(Temp,DatIn,Num); // 将数据最左边的Num位(被移出去的)存入Temp

BitsCopy(DatIn,DatIn+Num,Len-Num); // 将数据左边开始的第Num移入原来的空间

BitsCopy(DatIn+Len-Num,Temp,Num); // 将缓存中移出去的数据加到最右边

}

// 按位异或

void Xor(bool *DatA,bool *DatB,int Num) // 异或函数

{

int i=0;

for(i=0;i

{

DatA[i]=DatA[i]^DatB[i]; // 异或

}

}

// 输入48位 输出32位 与Ri异或

void S_Change(bool DatOut[32],bool DatIn[48]) // S盒变换

{

int i,X,Y; // i为8个S盒

for(i=0,Y=0,X=0;i<8;i++,DatIn+=6,DatOut+=4) // 每执行一次,输入数据偏移6位

{ // 每执行一次,输出数据偏移4位

Y=(DatIn[0]<<1)+DatIn[5]; // af代表第几行

X=(DatIn[1]<<3)+(DatIn[2]<<2)+(DatIn[3]<<1)+DatIn[4]; // bcde代表第几列

ByteToBit(DatOut,&S_Box[i][Y][X],4); // 把找到的点数据换为二进制

}

}

// F函数

void F_Change(bool DatIn[32],bool DatKi[48]) // F函数

{

static bool MiR[48]={0}; // 输入32位通过E选位变为48位

TablePermute(MiR,DatIn,E_Table,48);

Xor(MiR,DatKi,48); // 和子密钥异或

S_Change(DatIn,MiR); // S盒变换

TablePermute(DatIn,DatIn,P_Table,32); // P置换后输出

}

第 6 页 共 9 页 void SetKey(char KeyIn[8]) // 设置密钥 获取子密钥Ki

{

int i=0;

static bool KeyBit[64]={0}; // 密钥二进制存储空间

static bool *KiL=&KeyBit[0],*KiR=&KeyBit[28]; // 前28,后28共56

ByteToBit(KeyBit,KeyIn,64); // 把密钥转为二进制存入KeyBit

TablePermute(KeyBit,KeyBit,PC1_Table,56); // PC1表置换 56次

for(i=0;i<16;i++)

{

LoopMove(KiL,28,Move_Table[i]); // 前28位左移

LoopMove(KiR,28,Move_Table[i]); // 后28位左移

TablePermute(SubKey[i],KeyBit,PC2_Table,48);

// 二维数组 SubKey[i]为每一行起始地址

// 每移一次位进行PC2置换得 Ki 48位

}

}

void PlayDes(char MesOut[8],char MesIn[8]) // 执行DES加密

{ // 字节输入 Bin运算 Hex输出

static bool MesBit[64]={0}; // 明文二进制存储空间 64位

static bool Temp[32]={0};

static bool *MiL=&MesBit[0],*MiR=&MesBit[32]; // 前32位 后32位

ByteToBit(MesBit,MesIn,64); // 把明文换成二进制存入MesBit

TablePermute(MesBit,MesBit,IP_Table,64); // IP置换

BitsCopy(Temp,MiR,32); // 临时存储

F_Change(MiR,SubKey[i]); // F函数变换

Xor(MiR,MiL,32); // 得到Ri

BitsCopy(MiL,Temp,32); // 得到Li

TablePermute(MesBit,MesBit,IPR_Table,64);

BitToHex(MesOut,MesBit,64);

}

实验结果:

第 7 页 共 9 页 五、实验总结

答:程序分析:由于实现过程较为复杂,逻辑关系必须要清晰。为此采用模块化的程序设计编程思想十分有必要;在扩展运算和压缩变换运算时候的数据的存储和处理逻辑的实现;密钥的产生这个过程的实现,如何进行移位后的存储。

学习收获:通过这种实际的练习操作,对密码学的设计思想有了深刻的认识,通过对数学问题的复杂性,抽象出对于实际问题的程序逻辑来实现特殊数据的加密,某一个量的变换导致其它相关因子的巨大变化,密码学可以说是程序逻辑和算数逻辑共同作用的学科,同时也是理论和实践结合的课程。此次实验中,大部分均为自己完成,尤其是弱密钥的分析与寻找,花费了较长的时间。首先我查阅了相关资料,了解到什么是弱密钥,分析弱密钥的产生原理和过程,手动算出弱密钥对应的二进制位,查阅ACSII码表,找出对应的字符,计算弱密钥的个数,调试程序时候也遇到很多问题,通过反复的调试才得出了正确结果。

比如将字符转化成二进制位,将二进制位转化为字节,还有S盒的压缩运算,上网查阅了相关资料才得以解决,还有对函数的调用知识掌握不牢,在传参问题上总是出差错,增加了实验的难度。

通过本次实验,不仅让我进一步加深了对DES算法的理解,更重要的是锻炼了动手操作的能力,了解到编程的不易,认识到自身的不足和练习编程的重要性。这是我第一次细致专研一个算法并尝试编为程序,虽然花费了很长时间、遇到了很多困难,但是当程序正式运行时的喜悦是难以表达的,所以这次试验我获益匪浅,也体会到了一些新的编程思想。

第 8 页 共 9 页 第 9 页 共 9 页

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689170999a216120.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信