




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、云南大学软件学院School of Software, Yunnan University成绩学 期: 2011秋季学期 课程名称: 密码技术 任课教师: 学生姓名: 学 号: 实验项目: 实验二 DES加密算法 联系电话: 电子邮件: 完成提交时间: 年 月 日密码技术实验报告实验项目:实验二,第2题 实现DES对任意文件的加解密实验要求(内容)实现DES对任意文件的加解密,利用控制台对所有文件(中英文文本、符号甚至任意的文件)的加解密。加解密形式如下: cipher -e/-d key inputfile outputfile 说明:对于加密来说,输入文件名就是明文文件,对于解密来说,输入
2、文件名就是密文文件,注意文件读取方式和控制文件结束控制台编程: int main(int argc, char *argv )实验环境操作系统:win7编译环境:Microsoft Visual Studio 2010实现功能本次实验达到了题目的要求: 实现了用DES实现控制台对任意文件的加解密,用键盘接收明文(密文)文件路径和密钥,然后再输入需要保存的密文(明文)文件路径,然后就可以把加解密后得到的密明文文件保存该路径下。程序主要采取对数据的位操作的形式,把明密文文件中的内容以字节为单位读取,每次读取8个byte共65bits,然后使用标准DES的算法依次对读取的64bits明密文进出加解密
3、处理。 主函数的操作也充分体现了程序的可操作性和健壮性,能够让用户自己选择相应的操作,比如加密、解密以及对程序的一些基本情况说明。但是对文件的路径的输入有比较严格的格式约束。如:盘符名:文件名.txt 格式错误则会导致文件打开失败,不能进行加解密操作。数据结构 本次实验的程序较为复杂,涉及对位的操作。实验过程中用到的主要数据结构为数组和文件型指针,在实验中我定义了2个文件型指针FILE *fp1,*fp2,其中一个指向明文文件,一个指向密文文件。另外还定义了多个字符数组,如char Plainfpath260声明字符数组存储明文文件的文件路径,char Cipherfpath260声明字符数组
4、存储密文文件的文件路径,char key100声明字符数组存储密钥。对于读取出来的数据均以unsigned char的类型进行处理。这个程序的实现比较复杂的是对位的操作,主要包括取位值、移位和异或等,在对位的操作还主要用到了memcpy函数对unsigned char类型的字符串进行复制,除此之外没有采用更多的数据结构。程序流程程序模块结构图:开始 start选择操作解密函数退出程序加密函数 用户输入明密文文件路径和密钥明(密)文文件是否能打开 退出程序 对打开的文件进行操作,每次取出长度为8个byte的明密文。 将8byte的明密文和密钥转换为64bits 明密文进行初始置换IP密钥进行置换
5、选择1循环左移和置换选择2产生子密钥分成左右两部分进入F函数 右半部分在F函数里依次进行扩展置换、与子密钥异或、S盒置换和P置换经F函数处理的与左半部分异或后成右半部分,原先的右半部分作为左半部分32bits对换,然后进行逆初始置换将结果由64bits转换成8byte,然后写入文件保存main()函数的调用关系:Encrypt()Decrypt()Explain()Block_Decrypt()Block_Encrypt()L_Shift()R_Shift()BToC()CToB()F_function()函数的接口:void Encrypt(char *Plainfpath,char *Ci
6、pherfpath,unsigned char *Keys);/加密函数void Decrypt(char *Cipherfpath,char *Plainfpath,unsigned char *Keys);/解密函数void Block_Encrypt(unsigned char *Plain,unsigned char *Cipher,unsigned char *Key);/分组加密函数void Block_Decrypt(unsigned char *Cipher,unsigned char *Plain,unsigned char *Key);/分组加密函数void CToB(un
7、signed char *C_String,unsigned char *B_String);/将字符类型转换成二进制类型的函数void BToC(unsigned char *B_String,unsigned char *C_String);/将二进制类型转换成字符类型的函数void L_Shift(unsigned char *PC_Key,int count);/加密中循环左移函数void R_Shift(unsigned char *PC_Key,int count);/解密中循环右移函数void F_function(unsigned char *R_String,unsigned
8、 char *S_Key);/F函数void Explain();/程序说明函数代码与代码分析主要函数的接口、调用与被调用函数、所实现的功能和实现的主要思路: int main(char ch) :Function: 为用户提供基本操作,调用加密解密函数。 Calls: Encrypt(),Decrypt()和Explain()。Called By: 未被其它函数调用。Input(type) 字符型(char)。 Output(type): 无,只是输出“”中的字符串。 Return(type): 整型 Others: 无 Bug: 测试尚未发现void Encrypt(char *Plain
9、fpath,char *Cipherfpath,unsigned char *Keys) Function: 实现的功能是:接收明文文件路径和密钥,并打开文件,然后根据对文件的 操作依次从文件中以二进制方式读取字符,并使用DES算法加密,然后将处理过 的二进制字符写入到密文文件中。 实现的主要思路:首先调用fopen()函数打开文件,对打开的文件进行操作, 调用fseek()函数定位读写指针函数fseek ,将文件的读写指针移到文件结束位置,调 用ftell()函数返回fp1指向的文件中的读写指针当前位置,即文件的长度,再调用 rewind()函数将文件读写指针移到文件开始位置。调用fgetc
10、()从fp1所指向的明文 文件中依次以二进制的方式读取字符,然后调用Block_Encrypt进行加密,并 把结果写入密文文件保存。此外对于不足8byte的分组将填充*并作标记以便 进行加密。 Calls: Block_Encrypt() Called By: main() Input(type) char类型的数组 Output(type): char类型的数组 Return(type): 无返回值的类型。 Others: 无 Bug: 测试中尚未发现void Decrypt(char *Cipherfpath,char *Plainfpath,unsigned char *Keys) Fu
11、nction: 实现的功能是:接收密文文件路径和密钥,并打开文件,然后根据对文件的 操作依次从文件中以二进制方式读取字符,并使用DES算法解密,然后将处理过 的二进制字符写入到明文文件中。 实现的主要思路:首先调用fopen()函数打开文件,对打开的文件进行操作, 调用fseek()函数定位读写指针函数fseek ,将文件的读写指针移到文件结束位置,调 用ftell()函数返回fp1指向的文件中的读写指针当前位置,即文件的长度,再调用 rewind()函数将文件读写指针移到文件开始位置。调用fgetc()从fp1所指向的密文 文件中依次以二进制的方式读取字符,然后调用Block_Decrypt
12、()进行解密,并 把结果写入明文文件保存。此外对于之前有填充标记的分组在解密后应该删除 填充进去的*。 Calls: Block_Decrypt() Called By: main() Input(type) char类型的数组 Output(type): char类型的数组 Return(type): 无返回值的类型。 Others: 无 Bug: 测试中尚未发现void Block_Encrypt(unsigned char *Plain,unsigned char *Cipher,unsigned char *Key)Function: 实现的功能是:接收8个byte的明文,并使用DES
13、算法加密,得到8个byte 的密文。 实现的主要思路:首先调用CToB()将二进制明文字符与密钥字符转换成 64bits,再依次对64bit的明文进行初始置换、16轮F_function()函数的处理、32bit 对换和逆初始置换得到64bit密文。在F函数中使用的子密钥是将输入的密钥进 行置换选择1的处理然后在每轮加密中再对密钥进行循环左移和置换选择2 的处 理后得到子密钥。最后调用BToC()将64bit转换成8个byte的密文。 Calls: CToB(),F_function(), L_Shift和BToC()。 Called By: Encrypt() Input(type) uns
14、igned char类型的数组 Output(type): unsigned char类型的数组 Return(type): 无返回值的类型。 Others: 无 Bug: 测试中尚未发现void Block_Decrypt(unsigned char *Cipher,unsigned char *Plain,unsigned char *Key); Function: 实现的功能是:接收8个byte的密文,并使用DES算法加密,得到8个byte 的明文。 实现的主要思路:首先调用CToB()将二进制密文字符与密钥字符转换成 64bits,再依次对64bit的密文进行初始置换、16轮F_fun
15、ction()函数的处理、32bit 对换和逆初始置换得到64bit明文。在F函数中使用的子密钥是将输入的密钥进 行置换选择1的处理然后在每轮解密中再对密钥进行循环右移和置换选择2 的处 理后得到子密钥。最后调用BToC()将64bit转换成8个byte的明文。 Calls: CToB(),F_function(), R_Shift和BToC()。 Called By: Decrypt() Input(type) unsigned char类型的数组 Output(type): unsigned char类型的数组 Return(type): 无返回值的类型。 Others: 无 Bug: 测
16、试中尚未发现void CToB(unsigned char *C_String,unsigned char *B_String)Function: 将字符(8byte)转换成二进制位值(64bit) 实现的主要思路:利用表达式*(B_String+(8*i+7-j)=(C_Stringij)&1 对C_Stringi中的字符进行移位操作取出每个位的值赋值给B_String。 Calls: 无Called By: Block_Encrypt和Block_Decrypt()Input(type) unsigned char类型的数组 Output(type): unsigned char类型的数组
17、 Return(type): 无 Others: 无 Bug: 测试尚未发现void BToC(unsigned char *B_String,unsigned char *C_String)Function: 将二进制位值(64bit)转换成字符(8byte) 实现的主要思路:利用表达式*(C_String+i)=*(C_String+i)|(*(B_String+ (8*i+j)(7-j)将B_String中的每8个值进行移位的等操作构成C_String中的 一个值。 Calls: 无Called By: Block_Encrypt和Block_Decrypt()Input(type) u
18、nsigned char类型的数组 Output(type): unsigned char类型的数组 Return(type): 无 Others: 无 Bug: 测试尚未发现void L_Shift(unsigned char *PC_Key,int count)Function: 将56bit的密钥分两部分左移count位 实现的主要思路:利用memcpy()对密钥进行复制操作,具体步骤如下: memcpy(temp,PC_Key,count); memcpy(PC_Key,PC_Key+count,28-count); memcpy(PC_Key+(28-count),temp,coun
19、t);/前28位左移count位 memcpy(temp,PC_Key+28,count); memcpy(PC_Key+28,PC_Key+(28+count),28-count); memcpy(PC_Key+(56-count),temp,count);/后28位左移count位 Calls: 无Called By: Block_Encrypt和Block_Decrypt()Input(type) unsigned char类型的数组和int型的值 Output(type): unsigned char类型的数组 Return(type): 无 Others: 无 Bug: 测试尚未发现
20、void R_Shift(unsigned char *PC_Key,int count)Function: 将56bit的密钥分两部分右移count位 实现的主要思路:利用memcpy()对密钥进行复制操作,具体步骤如下: memcpy(temp,PC_Key+(28-count),count); memcpy(PC_Key+count,PC_Key,28-count); memcpy(PC_Key,temp,count);/前28位右移count位 memcpy(temp,PC_Key+(56-count),count); memcpy(PC_Key+(28+count),PC_Key+2
21、8,28-count); memcpy(PC_Key+28,temp,count);/后28位右移count位 Calls: 无Called By: Block_Encrypt和Block_Decrypt()Input(type) unsigned char类型的数组和int型的值 Output(type): unsigned char类型的数组 Return(type): 无 Others: 无 Bug: 测试尚未发现void F_function(unsigned char *R_String,unsigned char *S_Key)Function: 对明密文的右半部分F函数进行处理,包括扩展置换、与子密钥异或、S 盒置换和P置换 实现的主要思路:扩展置换利用E表将32位扩展到48位,然后与48位的子 密钥进行异或;S盒置换将48位的明密文分成8个6位块分别对应8个S盒替换 表,然后每个6位块中的第1和6位作为行号,其余的作为列号,在S盒替换表 中找到对应的值,这样将48位压缩到32位,然后再根据置换函数P进行置换操 作。 Calls: 无Called By: Block_Encrypt和Block_Decrypt()Input(type) unsigned char类型的数组 Output(type): unsigned char类型的数组 Return
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 注重实战演练2025年乡村全科执业助理医师试题及答案
- 物流师实操试题及答案
- 传染病基础试题及答案
- 天府名校三诊试题及答案
- 健康教育的实施方式试题及答案
- 提升母猪生殖效率的试题及答案
- 吉林特岗招聘试题及答案
- 系统规划与管理师考试备考过程中的心得体会试题及答案
- 2025年医师常识试题及答案
- 医学统计学基础试题及答案
- 北师大版三年级下册数学口算题通关练习1000道带答案
- 广东广州市2025届高考数学二模试卷含解析
- 【MOOC】城市景观设计-南京铁道职业技术学院 中国大学慕课MOOC答案
- 医疗机构医疗废物管理规范考试试题及答案
- 机械CAD、CAM-形考任务三-国开-参考资料
- 医疗质量和医疗安全培训
- 作业活动风险分级管控清单
- 代理商和厂家拿货合同范本
- 2024年继续教育公需课考试题目及答案
- 隐私保护与数据安全合规性测试考核试卷
- 大型群众性活动安全许可申请表
评论
0/150
提交评论