资源描述
学生学号 实验课成绩学 生 实 验 报 告 书实验课程名称MIS系统软件开课学院管理学院指导教师姓名江长斌学生姓名学生专业班级2011-2012学年第二学期实验项目名称加密解密算法实验成绩实 验 者专业班级组 别同 组 者无实验日期2012年03月07日第一部分:实验预习报告1、 实验目的、意义通过简单的加密解密算法的实现理解系统中加密解密的基本思想,熟练掌握使用C语言基本语句。2、 实验基本原理与方法单字母替换加密方法恺撒密码加密方法是把英文字母按字母表的顺序编号作为明文,将密钥定为m,加密算法为将明文加上密钥m,得到密码表,通过相反的过程由密文得到明文。单字母替换加密方法单表置换密码 由密钥Key构造字符置换表,完成加密和解密过程。多字母替换加密方法维吉利亚密码假设明文m=m1 m2 m3 mn;密钥k=k1k2 k3 kn,对应密文c=c1 c2 c3 cn,密文为:ci=(mi+ki )mod 26 ,26个字母的序号依次为025,ci , mi ,ki是分别是密文明文密钥中第i个字母的序号。转换加密方法 通过将明文每m个字符一组按顺序分为若干个字符串,再按照先列后行形成密文,并分析给出解密的方法。 或者通过给出一个密钥字符串,将明文按密钥字符串长度按顺序分为若干组字符串,再按照密钥字符串各个字符的顺序形成密文,并分析给出解密的方法。3、 主要仪器设备及耗材实验室提供计算机和上网条件,C语言上机环境。4、 实验方案与技术路线(综合性、设计性实验)本实验设计路线如下图所示:第二部分:实验过程记录实验原始记录(包括实验数据记录,实验现象记录,实验过程发现的问题等)加密解密方法描述:1. 凯撒密码加密方法是把英文字母按字母表的顺序编号作为明文,将密钥定为m,加密算法为将明文加上密钥m,得到密码表,通过相反的过程由密文查询出明文。加密过程:首先输入密钥6,然后输入明文verygood,明文字母对应的数字值如下所示,则会产生的对应关系如下图所示。解密过程:首先输入密文bkxemuuj,输入密钥6,则可得到其对应的明文为verygood。2. 单表替换先选定一个单词,然后将它排列在密码对照表(两行26列第一行存a到Z的字母,第二行存对照密码)下方,重复出现的字母以第一次出现的明文字母为准,后面以该单词中未出现的字母按顺序排列备齐,生成一个密码,然后可以用此密码进行加密或解密。加密过程:首先输入明文verygood,输入密钥pengia,则会产生的对应关系如下图所示。解密过程:首先输入密文virybmmj,输入密钥pengia,则可得到其对应的明文为verygood。 3、多字母替换 假设明文m=m1 m2 m3 mn;密钥k=k1k2 k3 kn;对应密文c=c1 c2 c3 cn密文为:ci=(mi+ki )mod 26 ,26个字母的序号依次为025,ci , mi ,ki是分别是密文明文密钥中第i个字母的序号加密过程:首先输入明文verygood,输入密钥pengia,则会产生的对应关系如下图所示。解密过程:首先输入密文kieeoodh,输入密钥pengia,则可得到其对应的明文为verygood。4、置换算法属于转换加密法中的一种,也可以称作为轮转法,通过将明文每m个字符一组按顺序分成若干个字符串,再按照先列后行形成密文,并分析给出解密的方法。加密过程:输入明文verygood输入密钥6后,将形成如下排列:v e r y g oo d 由此可得其密文为:voedrygo。 解密过程:输入密文voedrygo,输入密钥6,即可反过来解密得到明文verygood。第三部分 结果与讨论(可加页)实验结果分析(包括数据处理、实验现象分析、影响因素讨论、综合分析和结论等)程序设计类实验:包括原程序、输入数据、运行结果、实验过程发现的问题及解决方法等;分析与设计、软件工程类实验:编制分析与设计报告,要求用标准的绘图工具绘制文档中的图表。系统实施部分要求记录核心处理的方法、技巧或程序段;其它实验:记录实验输入数据、处理模型、输出数据及结果分析一、实验数据记录和实验现象记录截图如下:(一)选用凯撒算法加密来测试1、 点击组建,选择开始调试,选择go后将进入界面2、 选择凯撒算法,输入13、 选择加密,输入1.4、 输入密钥6 5、输入加密数据 verygood6、打开04090917.txt查看文件内容为: (二)选用单表替换加密来测试1、第一步同上、第二步选择2、第三步同上、第四步输入密钥pengia、第五步输入verygood,得到:(三)选用多字母替换加密来测试1、第一步同上、第二步选择3、第三步同上、第四步输入密钥pengia、第五步输入verygood,得到:(四)选用置换算法加密来测试1、第一步同上、第二步选择4、第三步同上、第四步输入密钥6、第五步输入verygood,得到:(五)选用凯撒算法解密来验证1、第一步同上、第二步选择1、第三步选择2、第四步输入密钥6、第五步输入bkxemuuj,得到明文为verygood与前面的测试相对应:(6)其他算法的解密验证就不在这一一列举。二、实验过程中的结果与感受 总体上说还是比较顺利的,在理解了每一种加密解密算法的规则后,算法就不那么容易错了,实验的大体框架很明确,按照需求选择算法来选择加密或者解密,通过主函数来调用各个算法,而对于算法可能还存在一些不足人意的地方,还待发掘和完善。三、实验源代码#include #include #include kaiser(int mode)/凯撒算法加密char str1100,str2100,svKey3;int i,key;printf(nnnn这里是凯撒算法nnn);/输入并检验key合法性printf(请输入一个密钥key(1-25之间的整数)n);scanf(%d,&key);while(key25|key1)printf(非法输入,请重新输入一个1-25之间的密钥(整数)n);scanf(%d,&key);fflush(stdin);switch (mode)case 1:printf(请输入需要加密的数据(本版本暂时仅支持字母加密)n);gets(str1);for(i=0;istrlen(str1);i+)if(A=str1i&str1i10)svKeyi+=key/10+48;svKeyi+=key%10+48;svKeyi=0;show(str1,str2,svKey);fileWrite(1,str1,str2,svKey);break;case 2:printf(nnn请输入需要解密的数据(本版本暂时仅支持字母解密)n);gets(str1);for(i=0;istrlen(str1);i+)if(A=str1i&str1i10)svKeyi+=key/10+48;svKeyi+=key%10+48;svKeyi=0;show(str2,str1,svKey);fileWrite(1,str2,str1,svKey);break;/此函数检验密钥中是否有重复字母int check(char k)int i,j;for(i=0;istrlen(k);i+)if(kiz) return 1;for(j=i+1;jstrlen(k);j+)if(ki=kj) return 1;return 0;single(int mode)int i,num26,j=0,sign;char letter127=a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0;char letter227,str1100,str2100,key26;printf(nnnn这里是单表替换法nnn);printf(请输入字母密钥key(建议在5-10个字母之间)n);gets(key);/大小写自动转换for(i=0;i=A&keyi=Z) keyi=keyi+32;/确保字母唯一性函数sign=check(key);while(sign!=0)printf(非法输入,key中不可存在重复字母以及非字母字符,请重新输入一个keyn);gets(key);for(i=0;i=A&keyi=Z) keyi=keyi+32;/printf(%cn,keyi);/确保字母唯一性函数sign=check(key);/这部分建立字母对应转换数组for(i=0;istrlen(key);i+)letter2i=keyi;letter1keyi-a=_;for(i=0;i26;i+)if(letter1i!=_) letter2strlen(key)+j+=letter1i;letter226=0;/将letter1中的数据恢复for(i=0;i26;i+)letter1i=i+a;switch (mode)case 1:printf(请输入需要进行加密的数据(本版本暂时仅支持字母加密)n);gets(str1);for(i=0;istrlen(str1);i+)if(A=str1i&str1i=Z) str2i=letter2str1i-A-32;else str2i=letter2str1i-a;str2i=0;puts(key);puts(str2);show(str1,str2,key);fileWrite(2,str1,str2,key);break;case 2:printf(请输入需要解密的数据(本版本仅支持字母加密)n);gets(str1);for(i=0;istrlen(str1);i+)for(j=0;j26;j+)if(str1i=letter2j|str1i=(letter2j-32) break;if(A=str1i&str1i=Z) str2i=letter1j-32;else str2i=letter1j;str2i=0;show(str2,str1,key);fileWrite(2,str2,str1,key);break;/解密words(int mode)char key26,str1100,str2100;char letter127=a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0;int i,sign;printf(nnnn这里是多字母替换法nnn);printf(请输入字母密钥key(建议在5-10个字母之间)n);gets(key);/大小写自动转换for(i=0;i=A&keyi=Z) keyi=keyi+32;/确保字母唯一性函数sign=check(key);while(sign!=0)printf(非法输入,key中不可存在重复字母以及非字母字符,请重新输入一个keyn);gets(key);for(i=0;i=A&keyi=Z) keyi=keyi+32;/printf(%cn,keyi);/确保字母唯一性函数sign=check(key);switch (mode)case 1:printf(请输入需要进行加密的数据(本版本暂时仅支持字母加密)n);gets(str1);for(i=0;istrlen(str1);i+)if(A=str1i&str1i=Z) str2i=(keyi%strlen(key)-A)%26+(str1i-A)%26)%26+A;else str2i=(keyi%strlen(key)-a)%26+(str1i-a)%26)%26+a;str2i=0;show(str1,str2,key);fileWrite(3,str1,str2,key);break;case 2:printf(请输入需要解密的数据(本版本仅支持字母加密)n);gets(str1);for(i=0;istrlen(str1);i+)if(A=str1i&str1i=Z) str2i=(str1i-A)%26+52-(keyi%strlen(key)-A)%26)%26+A;else str2i=(str1i-a)%26+52-(keyi%strlen(key)-a)%26)%26+a;str2i=0;show(str2,str1,key);fileWrite(3,str2,str1,key);break;replace(int mode)char str1100,str2100,svKey2;int i,j,k,key;int len1;printf(nnnn这里是置换算法nnn);printf(请输入一个密钥(3-10之间的整数)n);scanf(%d,&key);while(key10)printf(非法输入,请重新输入一个密钥(3-10之间的整数)n);scanf(%d,&key);fflush(stdin);switch (mode)case 1:printf(请输入需要进行加密的数据(本版本暂时仅支持字母加密)n);gets(str1);k=0;str1strlen(str1)=0;len1=strlen(str1);for(i=0;ikey;i+)/printf(%d %dn,strlen(str1),key);for(j=0;j=len1) break;str2k+=str1j*key+i;/printf(%c %dn,str1j*key+i,j*key+i);str2k=0;svKey0=key+48;svKey1=0;show(str1,str2,svKey);fileWrite(4,str1,str2,svKey);break;case 2:printf(请输入需要进行加密的数据(本版本暂时仅支持字母加密)n);gets(str1);len1=strlen(str1);for(i=k=0;ilen1/key;i+)for(j=0;jkey;j+)if(jlen1%key)str2k+=str1j*(len1/key+1)+i;elsestr2k+=str1(len1%key)*(len1/key+1)+(j-len1%key)*len1/key+i;for(i=0;itm_year)%100;temp0=1+timeinfo-tm_mon;temp1=timeinfo-tm_mday;temp2=timeinfo-tm_hour;temp3=timeinfo-tm_min;i=0;if(temp010) fileNamei+=0;else fileNamei+=temp0/10+48;fileNamei+=temp0%10+48;if(temp110) fileNamei+=0;else fileNamei+=temp1/10+48;fileNamei+=temp1%10+48;if(temp210) fileNamei+=0;else fileNamei+=temp2/10+48;fileNamei+=temp2%10+48;if(temp310) fileNamei+=0;else fileNamei+=temp3/10+48;fileNamei+=temp3%10+48;fileNamei+=.;fileNamei+=t;fileNamei+=x;fileNamei+=t;fileNamei=0;/puts(fileName);/开始文件操作fp=fopen(fileName,w);fprintf(fp,你使用的算法是:);switch (way)case 1:fprintf(fp,凯撒算法);break;case 2:fprintf(fp,单表替换法);break;case 3:fprintf(fp,多字母替换);break;case 4:fprintf(fp,置换算法);break;fprintf(fp,nn你的明文是:);fputs(str1,fp);fprintf(fp,n你的密文是:);fputs(str2,fp);fprintf(fp,n你的密钥是:);fputs(key,fp);fprintf(fp,nnnn温馨提示,请将明文删除,并将密钥和密文分开存放,需要解密时可以继续使用本软件n);fprintf(fp,nn-nnn);fclose(fp);fflush(stdin);printf(nn本次算法结果已经存储进运算器同级目录,名为以下的文件中,请查看:n);puts(fileName);main()int way,mode;printf(n 欢迎使用加解密软件nn);printf(*n);printf(本软件提供四种加解密算法,用户可以选择其中一种进行加解密运算n);printf(*nn);printf( 选择你想使用的算法:nn);printf(-1 凯撒算法-n);printf(-2 单表替换-n);printf(-3 多字母替换-n);printf(-4 置换算法-nnn);printf(nn提示:选择对应算法的前的数字,按下Enter键进入操作n);scanf(%d,&way);while(way!=1&way!=2&way!=3&way!=4)printf(请输入合法命令(算法前的数字),并按下Enter确定n);scanf(%d,&way);printf(nn 选择操作模式:nnn-1 加密n-2 解密n);scanf(%d,&mode);while(mode!=1&mode!=2)printf(请输入合法命令(操作模式前的数字),并按下Enter确定n);scanf(%d,&mode);fflush(stdin);switch (way)case 1: kaiser(mode);break;case 2: single(mode);break;case 3: words(mode);break;case 4: replace(mode);break;fflush(stdin);getchar();-实验报告评语及成绩(请按优,良,中,及格,不及格五级评定) 成绩: 教师签字:实验项目名称进程管理实验实验成绩实 验 者专业班级组 别同 组 者实验日期2012年03月7日第一部分:实验预习报告1、 实验目的、意义用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。2、 实验基本原理与方法进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。 每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。 每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。 进程的运行时间以时间片为单位进行计算。如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。3、 主要仪器设备及耗材实验室提供计算机和上网条件,C语言上机环境。4、 实验方案与技术路线(综合性、设计性实验)第二部分:实验过程记录实验原始记录(包括实验数据记录,实验现象记录,实验过程发现的问题等)第一部分:最高优先数优先的调度算法(1) 选择执行后,将进入主界面:(2)按任意键后进入:(3)输入1后:(4)分别输入5个进程的进程名、进程优先数、进程运行时间如下:(5) 此后,每按一次回车键,相当于队列首进程运行了一个cpu的时间,运行完毕后,如果要求运行时间不等于已运行时间,则再将它加入就绪队列;否则将其状态置为“结束”,且退出就绪队列。第一次运行程序时的正在运行的进程以及等待队列中的进程的各信息如下:(6) 继续按任意键,将出现:(7) 重复(6)操作直至运行完毕,将回到初始界面:第二部分:采用先来先服务算法(1) 进入主界面后,输入进程的个数:(2) 进入主界面后,输入进程的个数5,并分布输入5个进程的进程名、运行时间: (3) 运行之后将出现:(4) 可以再此时添加进程,也可以选择按任意键继续运行,在这里选择继续运行:(5) 重复第4部,直至运行结束。第三部分 结果与讨论(可加页)实验结果分析(包括数据处理、实验现象分析、影响因素讨论、综合分析和结论等)程序设计类实验:包括源程序、输入数据、运行结果、实验过程发现的问题及解决方法等;分析与设计、软件工程类实验:编制分析与设计报告,要求用标准的绘图工具绘制文档中的图表。系统实施部分要求记录核心处理的方法、技巧或程序段;其它实验:记录实验输入数据、处理模型、输出数据及结果分析一:实验结果与讨论 实验结果与预期一致,通过实验我深刻理解了最高优先数优先调度算法和先来先服务调度算法的调度过程,实验过程中可能有点缺陷的是由于时间问题,没有把两者很好地整合成一个程序,但这样分两个来弄的话还是比较清晰明了的。二:源程序(一) 最高优先数优先的调度算法#include stdio.h#include #include #define getpch(type) (type*)malloc(sizeof(type) #define NULL 0 struct pcb /* 定义进程控制块PCB */ char name10; /进程名char state; /进程状态int super; /进程优先级int ntime; /进程需要运行时间int rtime; /进程已经运行的时间struct pcb* link; *ready=NULL,*p; typedef struct pcb PCB; void inunization() /初始化界面 printf(nntt*ttn); printf(tttt实验二 进程调度n); printf(tt*ttn); printf(tttt请输入任意键进入演示过程n); printf(tttt请按任意键进入演示过程n); getch(); void sort() /* 建立对进程进行优先级排列函数*/ PCB *first, *second; int insert=0; if(ready=NULL)|(p-super)(ready-super) /*优先级最大者,插入队首*/ p-link=ready; ready=p; else /* 进程比较优先级,插入适当的位置中*/ first=ready; second=first-link; while(second!=NULL) if(p-super)(second-super) /*若插入进程比当前进程优先数大,*/ /*插入到当前进程前面*/ p-link=second; first-link=p; second=NULL; insert=1; else /* 插入进程优先数最低,则插入到队尾*/ first=first-link; second=second-link; if(insert=0) first-link=p; void input() /* 建立进程控制块函数*/ int i;system(cls); /*清屏*/printf(n 请输入五个进程信息:n);for(i=0;iname);printf(n 输入进程优先数:);scanf(%d,&p-super);printf(n 输入进程运行时间:);scanf(%d,&p-ntime);printf(n);p-rtime=0;p-state=w; p-link=NULL; sort(); /* 调用sort函数*/ int space() /计算进程控制块的个数 int l=0; PCB* pr=ready; while(pr!=NULL) l+; pr=pr-link; return(l); void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ printf(n qname t state t super t ndtime t runtime n); printf(|%st,pr-name); printf(|%ct,pr-state); printf(|%dt,pr-super); printf(|%dt,pr-ntime); printf(|%dt,pr-rtime); printf(n); void check() /* 建立进程查看函数 */ PCB* pr; printf(n * 当前正在运行的进程是:%s,p-name); /*显示当前运行进程*/ disp(p); pr=ready; printf(n *当前就绪队列状态为:n); /*显示就绪队列状态*/ while(pr!=NULL) disp(pr); pr=pr-link; void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ printf(n 进程 %s 已完成.n,p-name); free(p); void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ (p-rtime)+; if(p-rtime=p-ntime) destroy(); /* 调用destroy函数*/ else (p-super)-; p-state=w;sort(); /*调用sort函数*/ void youxian() / 高优先级优先算法的程序入口int len,h=0;char ch; system(cls);input(); len=space(); while(len!=0)&(ready!=NULL) ch=getchar(); h+; printf(n The execute number:%d n,h); p=ready; ready=p-link; p-link=NULL; p-state=R; check(); running(); printf(n 按任一键继续.); printf(nn 进程已经完成.n); ch=getchar(); void menu() /菜单int m;system(cls);printf(nntt*ttn);printf(tttt进程调度演示n);printf(tt*ttn);printf(nnnttt1.演示最高优先数优先算法.);printf(nttt0.退出程序.);printf(nntttt选择进程调度方法:);scanf(%d,&m);switch(m)case 1: youxian(); /高优先级优先算法的程序入口 system(cls); menu(); break;case 0: system(cls); break;default: system(cls); menu();main() /*主函数*/ inunization();menu();(二)先来先服务算法#include#include#include#define getpch(type) (type*)malloc(sizeof(type)#define NULL 0#define TIME 2/时间片长度typedef struct pcb/进程管理块char name10;/进程名字char state;/进程状态int queue;/进程所在的队列int ntime;/进程需要运行的时间int rtime;/进程已经运行的时间int etime;/进程在本队列可运行的时间片struct pcb *link;PCB;PCB*ready = NULL, *pinsert = NULL, *pfend = NULL,*p =NULL;/就绪队列,进程插入位置的变量int geti()/使用户仅能输入整数char ch;int i = 0;fflush(stdin);ch = getchar();while(ch = n)printf(tf输入不能为空.请重新输入n);fflush(stdin);ch = getchar();while(ch != n)if(ch 9 | ch link | (ps- link-queue - ps-queue) 1) pinsert = ps;elsewhile (ps-link & ps -link-queue != (pfend -queue +2)ps = ps-link;pinsert = ps;void insert()/插入进程if(!ready )ready = p;pfend = p;pinsert = p;else if(ready -queue = 1)/第一队列存在p-link = pfend-link;pfend-link = p;pfend = p;findpos();elsep-link = ready;ready = p;findpos();void input()/*建立进程控制块函数*/int i,num;printf(n请输入进程的个数?);num = geti();for(i=0; i name);printf(n输入进程运行时间:);p -ntime = geti();printf(n);p-rtime=0;p-state=w;p-queue =1;p-etime = TIME;p-link=NULL;insert();/*调用insert函数*/void disp(PCB *pr)/*建立进程现实函数,用于显示当前进程*/printf(nnamet statet queuet ntimet rtimet在队列可停留时间t n);printf(|%st,pr-name);printf( |%ct,pr-state);printf( |%dt,pr-queue);printf( |%dt,pr-ntime);printf( |%dt,pr-rtime);printf( |%dt,pr-etime);printf(n);void check()/*建立进程查看函数*/PCB *pr;printf(n *当前正在运行的进程是:%s,ready-name);/*显示当前运行的进程*/disp(ready);pr= ready -link;printf(n*当前就绪队列状态为:n);/*显示就绪队列状态*/while(pr!=NULL)disp(pr);pr=pr-link;void sort()/调整进程队列if(!ready-link |ready-queue link-queue) return;p = ready -link;ready -link = pinsert -link;pi
展开阅读全文