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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

C语言DES加密算法.docx

1、C语言DES加密算法云南大学软件学院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的算法依次对读取的64bi

3、ts明密文进出加解密处理。 主函数的操作也充分体现了程序的可操作性和健壮性,能够让用户自己选择相应的操作,比如加密、解密以及对程序的一些基本情况说明。但是对文件的路径的输入有比较严格的格式约束。如:盘符名:文件名.txt 格式错误则会导致文件打开失败,不能进行加解密操作。数据结构 本次实验的程序较为复杂,涉及对位的操作。实验过程中用到的主要数据结构为数组和文件型指针,在实验中我定义了2个文件型指针FILE *fp1,*fp2,其中一个指向明文文件,一个指向密文文件。另外还定义了多个字符数组,如char Plainfpath260声明字符数组存储明文文件的文件路径,char Cipherfpat

4、h260声明字符数组存储密文文件的文件路径,char key100声明字符数组存储密钥。对于读取出来的数据均以unsigned char的类型进行处理。这个程序的实现比较复杂的是对位的操作,主要包括取位值、移位和异或等,在对位的操作还主要用到了memcpy函数对unsigned char类型的字符串进行复制,除此之外没有采用更多的数据结构。程序流程程序模块结构图:开始 start选择操作解密函数退出程序加密函数 用户输入明密文文件路径和密钥明(密)文文件是否能打开 退出程序 对打开的文件进行操作,每次取出长度为8个byte的明密文。 将8byte的明密文和密钥转换为64bits 明密文进行初始

5、置换IP密钥进行置换选择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 *Plainfpat

6、h,char *Cipherfpath,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);/分组加密函数vo

7、id CToB(unsigned 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_Strin

8、g,unsigned 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(c

9、har *Plainfpath,char *Cipherfpath,unsigned char *Keys) Function: 实现的功能是:接收明文文件路径和密钥,并打开文件,然后根据对文件的 操作依次从文件中以二进制方式读取字符,并使用DES算法加密,然后将处理过 的二进制字符写入到密文文件中。 实现的主要思路:首先调用fopen()函数打开文件,对打开的文件进行操作, 调用fseek()函数定位读写指针函数fseek ,将文件的读写指针移到文件结束位置,调 用ftell()函数返回fp1指向的文件中的读写指针当前位置,即文件的长度,再调用 rewind()函数将文件读写指针移到文件开始

10、位置。调用fgetc()从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

11、 *Keys) Function: 实现的功能是:接收密文文件路径和密钥,并打开文件,然后根据对文件的 操作依次从文件中以二进制方式读取字符,并使用DES算法解密,然后将处理过 的二进制字符写入到明文文件中。 实现的主要思路:首先调用fopen()函数打开文件,对打开的文件进行操作, 调用fseek()函数定位读写指针函数fseek ,将文件的读写指针移到文件结束位置,调 用ftell()函数返回fp1指向的文件中的读写指针当前位置,即文件的长度,再调用 rewind()函数将文件读写指针移到文件开始位置。调用fgetc()从fp1所指向的密文 文件中依次以二进制的方式读取字符,然后调用Blo

12、ck_Decrypt()进行解密,并 把结果写入明文文件保存。此外对于之前有填充标记的分组在解密后应该删除 填充进去的*。 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

13、的明文,并使用DES算法加密,得到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

14、(type) unsigned 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的密文进行初始置

15、换、16轮F_function()函数的处理、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

16、: 无 Bug: 测试中尚未发现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

17、 char类型的数组 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()Inp

18、ut(type) unsigned 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)

19、,temp,count);/前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: 无 B

20、ug: 测试尚未发现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

21、),PC_Key+28,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: 对明密文的右半

22、部分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类型的数组 Retur

23、n(type): 无 Others: 无 Bug: 测试尚未发现实验输入(可加截图):实验输入:先选择加密,然后输入明文文件路径:c:123.jpg 密钥:yqg 需要保存的密文文件路径:c:12301.jpg 先选择解密,然后输入密文文件路径:c:12301.jpg 密钥:yqg 需要保存的明文文件路径:c:12302.jpg结果输出(可加截图): 先选择加密,然后输入明文文件路径:c:123.jpg 密钥:yqg 结果保存了密文文件,路径:c:12301.jpg 但是加密后格式无法打开。先选择解密,然后输入密文文件路径:c:12301.jpg 密钥:yqg 需要保存的明文文件路径:c:12

24、302.jpg实验小结 这次的实验比上次的难度增加了许多,尤其是涉及到取位值以及对位的操作,这个实验花费了很长的时间才基本完成实验的要求,实现了使用DES对任意文件进行加密解密。通过本次实验,我加深了对DES加密解密算法的的了解,另一方面,我进一步熟悉了C语言的语法知识,主要就是对二进制文件的一些打开关闭和读写操作,另外还有对位的操作等知识。在这次的实验中对文件打开的方式依然以二进制方式打开,但是因为本次实验中是每次对8个byte的字符进行加密解密操作,因此在读文件的时候使用了fread()函数,每次从文件中读取8个byte的字符,然后用 fwrite()函数将8个byte的字符写入文件,另外我把实验中的大部分数组都声明为unsigned char类型,在对字符串进行复制操作时调用了memcpy函数对字符串进行操作将更为方便。这次的实验虽然基本完成了实验题目的要求,但是由于个人能力的原因,算法设计得有点复杂,加密解密需要花费太长的时间,因此还需要再改进。

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

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