当前位置:文档之家› 云南大学软件学院数据结构实验三实验报告——文件加密译码器

云南大学软件学院数据结构实验三实验报告——文件加密译码器

云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □学期:任课教师:实验题目: 实验三栈和队列及其应用小组长:联系电话:电子邮件:完成提交时间:年月日云南大学软件学院2010学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:课题分析,算法设计,程序编写,后期调试,完成实验报告综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。

)云南大学软件学院2010学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:课题分析,算法设计,后期调试综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。

)(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。

难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)本次实验的目的在于使我们深入了解栈和队列的特性,以便在实际问题背景下灵活运用它们;同时还将巩固对这两种结构构造方法的理解。

核心算法:加密与解密算法。

加密算法:将文件各位取反,再加上密码值。

构成密文。

解密算法:将密文减去密码值,在按位取反,获得明文。

二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)定义一个类MyClass:class MyClass{char *buffer; //定义存储文件的缓存char name[MAX_PATH]; //来存储用户输入的文件名char pass[16]; //来存储用户输入的密码DWORD size, psdlen; //定义变量存储文件的长度,密码的长度DWORD GetSize(); //检查文件的长度void EncAlg(DWORD bsize); //声明加密函数void DecAlg(DWORD bsize); //声明解密函数public:MyClass(char *, char *); //声明构造函数~MyClass(); //声明析构函数FILE *fp; //指向文件流的指针BOOL Ecpenc(); //加密算法BOOL Ecpdec(); //解密算法};三、【实现描述(Implement)】(30%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。

)四、【测试结果(Testing)】(10%)(本部分应包括:对实验的测试结果,应具体列出每次测试所输入的数据以及输出的数据,并对测试结果进行分析总结)测试数据,文本文档1.txt,位于程序根目录内含有字符串:hello,world以密码123进行加密后显示密文为:-----犁---以密码123解密后显示为hello,world以密码12345解密后显示为helil-uipoe测试功能成功!四、【实验总结】(10%)(本部分应包括:自己在实验中完成的任务,注意组内的任意一位同学都必须独立完成至少一项接口的实现;对所完成实验的经验总结、心得)这次和我们小组完成这个文件加密解密程序,大家分工协作,配合默契。

我在这个小组中参与了课题分析,算法设计,后期测试。

独立完成了程序代码的编写,实验报告的编写。

通过这次试验,我们了解了,如何对一个文件通过c++语言进行操作,在使用文件流的时候应该注意哪些要素,成功解决了有些情况下密码错误也能正常解密的BUG五、【项目运作描述(Operate)】(10%)(本部分应包括:项目的成本效益分析,应用效果等的分析。

)1. 本程序运行的环境为32位MS-DOS操作系统或者Windows NT环境下的CMD 命令行模式。

2. 进入程序后的开始界面:3. 输入用户需要加密的文件路径及文件名,在当前目录下直接输入文件名即可:这是用来测试的文本文件,内含有内容hello,world输入文件名:1.txt4. 设定密码:5. 此时系统会弹出确认菜单,用户可以查看之前的输入是否正确:6. 如果用户检查出错误则键入n进行重新输入,如果用户确认正确则键入y确认,此时系统会弹出操作菜单,用户可以自行选择进行什么操作(加密文件,解密文件,退出)7. 选择1号功能将制定的文件加密,当加密成功后系统会有如下提示:8. 此时被加密文件显示为密文:当用户需要解密时,同样进行上述操作,在正确输入密码且选择解密功能后,系统显示为:被解密文件显示为正常的人类文字:9.如若用户输入了错误的密码并且选择解密功能的话,文件会被进一步加密,将无法读出被保护内容。

六、【代码】(10%)(本部分应包括:完整的代码及充分的注释。

注意纸质的实验报告无需包括此部分。

格式统一为,字体: Georgia , 行距: 固定行距12,字号: 小五)#include <iostream>#include <fstream>#include <cstring>#include <cstdio>#include <windo ws.h>int psd1;class MyClass{char *buffer;char name[MAX_PATH];char pass[16];DWORD size, psdlen;DWORD GetSize();void EncAlg(DWORD bsize);void DecAlg(DWORD bsize);public:My Class(char *, char *);~MyClass();FILE *fp;BOOL Ecpenc();BOOL Ecpdec();};int TransPasswo rd(char * transp){int psd = 0,i;for(i=0;i<=15;i++){psd = psd * 10 + (int)(transp + i * sizeof(char));}transp;return psd;}int main(){char name[MAX_PATH];char psd[16];char c;std::cout << "Welco me to use EasyEncryption v1.0\n";std::cout << "Please enter the file name which y o u wanted: ";std::cin >> name;std::cout << "Please enter the passwo rd: ";std::cin >> psd;psd1 = TransPasswo rd(psd);My Class ecp(name,psd);do{std::cout << "What can we do fo r y o u?";std::cout << "\n1 - To encipher the file.";std::cout << "\n2 - To decipher the file.";std::cout << "\n3 - Exit this pro gram";std::cout << "\n\nPlease enter the number (1-3) to choose one service: ";std::cin >> c;}while( c <'1'|| c>'3' );switch(c){case '1':std::cout << "\nEnciphering,please wait...\n";if( ecp.Ecpenc() )std::cout << "Encipher succeeded.\n";elsestd::cout << "ERROR: Canno t Encipher the file.\n";break;case '2':std::cout << "\nDeciphering,please wait...\n";if( ecp.Ecpdec() )std::cout << "Decipher succeeded.\n";elsestd::cout << "ERROR:Canno t Decipher the file.\n";break;default:return 0;}std::cout << "\nPlease enter the ENTER key to exit this pro gram.\n";getchar();getchar();return 0;}My Class::MyClass(char *fname, char *psd){strcp y(name,fname);strcp y(pass,psd);size = GetSize();char ch;if(size == 0){std::cout << "ERROR: Canno t find the file o r unkno w erro r occured." << "\n";std::cout << "Press the ENTER key to exit." << "\n";getchar();getchar();exit(1);}psdlen = strlen(pass);std::cout << "+----------------confirmation table-----------------------+\n";std::cout << "| File name: " << name << '\n';std::cout << "| Lengh of file: " << size << '\n';std::cout << "| Lengh of Password: " << psdlen << '\n';std::cout << "+---------------------------------------------------------+\n";confirmatio n:std::cout << "Are y o u sure y o u have entered co rrect imfo rmation?(Y/N)\n";std::cin >> ch;if (ch == 'y' || ch == 'Y')goto next;else if (ch == 'n'||ch == 'N'){std::cout << "Please try again.\n";std::cout << "Press any key to exit...\n";getchar();getchar();exit(1);}else{std::cout << "Invalid enter, try again.\n";goto co nfirmatio n;}next:std::co ut << "\nWait a mo ment ...\n";fp = fopen(name,"rb+");buffer = new char [65535];}My Class::~MyClass(){delete buffer;fclose(fp);}BOOL My Class::Ecpdec (){DWORD t_size = size;DWORD bsize;DWORD offset = 0;while ( t_size > 65535 ){fread(buffer, 1, 65535, fp);DecAlg(65535);fseek(fp, size - t_size, SEEK_SET);fwrite(buffer,1 , 65535, fp);t_size -= 0x4000;fseek(fp, size - t_size, SEEK_SET);}bsize = fread(buffer,1 , 65535, fp);DecAlg(bsize);fseek(fp, size - t_size, SEEK_SET);fwrite(buffer, 1, bsize, fp);return TRUE;}BOOL My Class::Ecpenc (){DWORD t_size = size;DWORD bsize;DWORD offset = 0;while ( t_size > 65535 ){fread(buffer, 1, 65535, fp);EncAlg(65535);fseek(fp, size - t_size, SEEK_SET);fwrite(buffer,1 , 65535, fp);t_size -= 0x4000;fseek(fp, size - t_size, SEEK_SET);}bsize = fread(buffer,1 , 65535, fp);EncAlg(bsize);fseek(fp, size - t_size, SEEK_SET);fwrite(buffer, 1, bsize, fp);return TRUE;}DWORD My Class::GetSize (){WIN32_FILE_ATTRIBUTE_DATA attr;if( GetFileAttributesEx(name,GetFileExI nfoStandard,&attr) )return attr.nFileSizeLow;return 0;}void MyClass::EncAlg(DWORD bsize){char *p;for ( p = buffer; p < buffer + bsize; p++ ){*p = (*p ^ pass[ (p - buffer) % psdlen ])-psd1;}}void MyClass::DecAlg (DWORD bsize){char *p;for ( p = buffer; p < buffer + bsize; p++ ){*p = (*p+psd1) ^ pass[ (p - buffer) % psdlen ];}}。

相关主题