现代密码学-DES加密算法 实验报告.doc_第1页
现代密码学-DES加密算法 实验报告.doc_第2页
现代密码学-DES加密算法 实验报告.doc_第3页
现代密码学-DES加密算法 实验报告.doc_第4页
现代密码学-DES加密算法 实验报告.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

现代密码学实验报告院系:班级:姓名:学号:前言 密码学(Cryptology)是研究秘密通信的原理和破译秘密信息的方法的一门学科。密码学的基本技术就是对数据进行一组可逆的数学变换,使未授权者不能理解它的真实含义。密码学包括密码编码学(Cryptography)和密码分析学(Cryptanalyst)两个既对立又统一的主要分支学科。研究密码变化的规律并用之于编制密码以保护信息安全的科学,称为密码编码学。研究密码变化的规律并用之于密码以获取信息情报的科学,称为密码分析学,也叫密码破译学。 密码学在信息安全中占有非常重要的地位,能够为信息安全提供关键理论与技术。密码学是一门古老而深奥的学问,按其发展进程,经历了古典密码和现代密码学两个阶段。现代密码学(Modern Cryptology)通常被归类为理论数学的一个分支学科,主要以可靠的数学方法和理论为基础,为保证信息的机密性、完整性、可认证性、可控性、不可抵赖性等提供关键理论与技术。 DES加密算法的实现实验目的理解对称加密算法的原理和特点。实验原理DES是一种分组加密算法,所谓分组加密算法就是对一定大小的明文或密文来做加密或解密动作。而在DES这个加密系统中,每次加密或解密的分组大小均为64位,所以DES没有密文扩充的问题。对大于64位的明文只要按每64位一组进行切割,而对小于64位的明文只要在后面补“0”即可。另一方面,DES所用的加密或解密密钥也是64位大小,但因其中有8个位是用来作奇偶校验的,所以64位中真正起密钥作用的只有56位,密钥过短也是DES最大的缺点。DES加密与解密所用的算法除了子密钥的顺序不同外,其他部分完全相同。实验环境运行Windows或Linux操作系统的PC机。实验代码: -本实验采用56位密钥加密64位数据- #include #include #include bool.h / 位处理 #include tables.hvoid BitsCopy(bool *DatOut,bool *DatIn,int Len); / 数组复制 void ByteToBit(bool *DatOut,char *DatIn,int Num); / 字节到位 void BitToByte(char *DatOut,bool *DatIn,int Num); / 位到字节void BitToHex(char *DatOut,bool *DatIn,int Num); / 二进制到十六进制 64位 to 4*16字符void HexToBit(bool *DatOut,char *DatIn,int Num); / 十六进制到二进制 void TablePermute(bool *DatOut,bool *DatIn,const char *Table,int Num); / 位表置换函数 void LoopMove(bool *DatIn,int Len,int Num); / 循环左移 Len长度 Num移动位数 void Xor(bool *DatA,bool *DatB,int Num); / 异或函数 void S_Change(bool DatOut32,bool DatIn48); / S盒变换 void F_Change(bool DatIn32,bool DatKi48); / F函数 void SetKey(char KeyIn8); / 设置密钥void PlayDes(char MesOut8,char MesIn8); / 执行DES加密void KickDes(char MesOut8,char MesIn8); / 执行DES解密 int main() int i=0; char MesHex16=0; / 16个字符数组用于存放 64位16进制的密文 char MyKey8=0; / 初始密钥 8字节*8 char YourKey8=0; / 输入的解密密钥 8字节*8 char MyMessage8=0; / 初始明文 /*-*/ printf(Welcome! Please input your Message(64 bit):n); gets(MyMessage); / 明文 printf(Please input your Secret Key:n); gets(MyKey); / 密钥 while(MyKeyi!=0) / 计算密钥长度 i+; while(i!=8) / 不是8 提示错误 printf(Please input a correct Secret Key!n); gets(MyKey); i=0; while(MyKeyi!=0) / 再次检测 i+; SetKey(MyKey); / 设置密钥 得到子密钥Ki PlayDes(MesHex,MyMessage); / 执行DES加密 printf(Your Message is Encrypted!:n); / 信息已加密 for(i=0;i16;i+) printf(%c ,MesHexi); printf(n); printf(n); printf(Please input your Secret Key to Deciphering:n); / 请输入密钥以解密 gets(YourKey); / 得到密钥 SetKey(YourKey); / 设置密钥 KickDes(MyMessage,MesHex); / 解密输出到MyMessage printf(Deciphering Over !:n); / 解密结束 for(i=0;i8;i+) printf(%c ,MyMessagei); printf(n); system(pause); /*- 把DatIn开始的长度位Len位的二进制 复制到DatOut后-*/void BitsCopy(bool *DatOut,bool *DatIn,int Len) / 数组复制 OK int i=0; for(i=0;iLen;i+) DatOuti=DatIni; /*- 字节转换成位函数 每8次换一个字节 每次向右移一位 和1与取最后一位 共64位 -*/void ByteToBit(bool *DatOut,char *DatIn,int Num) / OK int i=0; for(i=0;i(i%8)&0x01; /*- 位转换成字节函数 字节数组每8次移一位 位每次向左移 与上一次或 -*/void BitToByte(char *DatOut,bool *DatIn,int Num) / OK int i=0; for(i=0;i(Num/8);i+) DatOuti=0; for(i=0;iNum;i+) DatOuti/8|=DatIni(i%8); /*- 二进制密文转换为十六进制 需要16个字符表示-*/void BitToHex(char *DatOut,bool *DatIn,int Num) int i=0; for(i=0;iNum/4;i+) DatOuti=0; for(i=0;iNum/4;i+) DatOuti = DatIni*4+(DatIni*4+11) +(DatIni*4+22)+(DatIni*4+39) DatOuti=DatOuti%16+7; / 余数大于9时处理 10-15 to A-F / 输出字符 else DatOuti=DatOuti%16+0; / 输出字符 /*- 十六进制字符转二进制-*/void HexToBit(bool *DatOut,char *DatIn,int Num) int i=0; / 字符型输入 for(i=0;i9) / 大于9 DatOuti=(DatIni/4-7)(i%4)&0x01; else DatOuti=(DatIni/4-0)(i%4)&0x01; / 表置换函数 OKvoid TablePermute(bool *DatOut,bool *DatIn,const char *Table,int Num) int i=0; static bool Temp256=0; for(i=0;iNum;i+) / Num为置换的长度 Tempi=DatInTablei-1; / 原来的数据按对应的表上的位置排列 BitsCopy(DatOut,Temp,Num); / 把缓存Temp的值输出 / 子密钥的移位void LoopMove(bool *DatIn,int Len,int Num) / 循环左移 Len数据长度 Num移动位数 static bool Temp256=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;iNum;i+) DatAi=DatAiDatBi; / 异或 / 输入48位 输出32位 与Ri异或void S_Change(bool DatOut32,bool DatIn48) / S盒变换 int i,X,Y; / i为8个S盒 for(i=0,Y=0,X=0;i8;i+,DatIn+=6,DatOut+=4) / 每执行一次,输入数据偏移6位 / 每执行一次,输出数据偏移4位 Y=(DatIn01)+DatIn5; / af代表第几行 X=(DatIn13)+(DatIn22)+(DatIn31)+DatIn4; / bcde代表第几列 ByteToBit(DatOut,&S_BoxiYX,4); / 把找到的点数据换为二进制 / F函数void F_Change(bool DatIn32,bool DatKi48) / F函数 static bool MiR48=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置换后输出void SetKey(char KeyIn8) / 设置密钥 获取子密钥Ki int i=0; static bool KeyBit64=0; / 密钥二进制存储空间 static bool *KiL=&KeyBit0,*KiR=&KeyBit28; / 前28,后28共56 ByteToBit(KeyBit,KeyIn,64); / 把密钥转为二进制存入KeyBit TablePermute(KeyBit,KeyBit,PC1_Table,56); / PC1表置换 56次 for(i=0;i16;i+) LoopMove(KiL,28,Move_Tablei); / 前28位左移 LoopMove(KiR,28,Move_Tablei); / 后28位左移 TablePermute(SubKeyi,KeyBit,PC2_Table,48); / 二维数组 SubKeyi为每一行起始地址 / 每移一次位进行PC2置换得 Ki 48位 void PlayDes(char MesOut8,char MesIn8) / 执行DES加密 / 字节输入 Bin运算 Hex输出 int i=0; static bool MesBit64=0; / 明文二进制存储空间 64位 static bool Temp32=0; static bool *MiL=&MesBit0,*MiR=&MesBit32; / 前32位 后32位 ByteToBi

温馨提示

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

评论

0/150

提交评论