现代密码学课程作业题目现在密码学文件加密姓名学号指导老师指导教师职称年级专业班级所在学院目录摘要 (3)前言 (4)1基础介绍 (5)1.1背景介绍 (5)1.2需求分析 (5)1.3意义 (6)1.4文献综述 (6)2实现步骤 (7)2.1基本实现技术 (7)2.2操作步骤 (7)3应用基本功能测试 (19)3.1单表加密测试。
(19)3.2单表解密测试 (19)3.3多表加密测试 (20)3.4多表解密测试 (21)3.5文件生成模块测试 (21)4总结 (22)摘要本实验设计是在matla软件的GUI程序平台下设计的一个关于文件加密解密的小的应用,文章根据实验项目的完成过程比较详细的介绍了项目的设计思想,设计方法和完成步骤,并给出了遇到的问题的解决方法,最后给出了应用的测试情况。
关键词:GUI程序设计,单表加密(解密),多表加密(解密)前言本文较为详细的介绍了GUI多表单表加密应用的开发过程,全文分为三章。
第一章主要介绍GUI多表单表加密应用的相关知识,以及它所要实现的基本功能。
并做了简要的需求分析,确定了该程序应实现了一些基本功能。
另外还简要的说明了查阅的相关资料。
第二章主要介绍了开发的具体过程,以程序的具体开发步骤为主线介绍了相关的操作和具体函数的书写。
第三章主要是对程序的设计进行总结。
1基础介绍1.1背景介绍在现代密码学的学习过程中我们接触了许多实际的问题,主要学习了在密码学的发展简史,古典密码学,分组密码,公钥密码,序列密码,数字签名以及密码协议。
本设计是针对学习过的现代密码学中的古典密码学的理论来实现该课程中的一些相关的加密应用。
在本文中我们对古典密码学中的两个基本的加密方法——单表加密解密和多表加密解密进行GUI 平台下的应用编程,实现相关的功能,以达到基本应用的目的。
1.2需求分析在GUI单表多表加解密的应用中,给出如下的具体应用要求:实现对简单字符的单表多表加密解密;实现对文件的单表多表加密解密;能够在应用中自主创建加密或者是解密文件;对文件的加密和解密过程实施监测,让使用者能够了解加密和解密的进程;提供基本的应用使用帮助手册,给初次使用应用者提供参考。
1.3功能模块图加密系统图1.系统功能模块图1.4意义简单应用程序的设计与开发,是信息与计算科学专业学生必须掌握的一项技术。
了解基本应用的各个模块之间的关系和功能,通过编程实现具体的应用是本专业学生的基本素质。
通过具体的小的项目的实现,了解各功能模块的设计与实现方法,以及各功能模块之间的相互联接方法,对于今后从事软件设计与开发,有重要的指导作用。
1.5文献综述文献【1】《现代密码学》陈鲁生沈世镒北京:科学出版社文献【2】《matlab与数学实验》江世宏武汉工程大学文献【3】网络文献此处不予列出2实现步骤2.1基本实现技术在matlab的gui编程中有两种方式来进行程序设计:①直接用M文件来编写;②通过gui向导来进行编写。
方式①的好处在于可以以最大的灵活度来实现应用的设计和编写,但是缺点就在于必须对于各种控件的属性有比较好的了解。
方式②的优点在于编写者能够将更多的精力集中于程序控件的响应函数的编写,而不是将更多的精力放在实现的界面的美化和排版之上,缺点在于响应函数的控制范围没有前一种方式来的灵活。
在本应用中主要是用gui的向导编程来实现应用的绝大部分功能,在应用的帮助手册的编辑界面实现方式上则主要是采用方式①来实现。
2.2操作步骤2.2.1 首先打开gui编程向导的界面,建立空白的gui界面对话框,gui 向导界面如下:图2.空白gui界面建立图2.2.2 建立空白的gui界面对话框之后,在该空白界面上添加一系列的程序控件,程序控件的添加主要分为5个大的模块:[1]加密模块控件;[2]解密模块控件;[3]自主生成文件模块;[4]加密形式模块;[5]明文密文显示框。
各项控件添加完毕之后的效果截图如下:图3.系统界面控件添加效果图2.2.3 对空白的对话框界面进行基本菜单的添加。
在gui的向导编程中如果选择空白的对话框来建立应用程序的基本框架时,在对话框中是没有给出基本菜单栏的,这里对本应用中添加的菜单栏进行简要的说明。
在控件添加界面的工具栏中有标注为Menu Edito的工具(截图如下红圈内)图4.界面编辑工具栏(红色标记为gui菜单编辑按钮)点击此按钮出现对基本菜单栏的编辑对话框(截图如下):图5.菜单编辑对话框上图左侧的红圈表示一级菜单,蓝圈表示二级菜单,右侧的五角星标注为为各级菜单的命名区,红色圈表示其快捷键设置,蓝圈内的View键是用于设置菜单的响应函数的按钮,红色斜线部分标注的为菜单栏的其他属性设置界面的开启按钮。
2.2.4 代码编写,代码的编写主要分为单表加密代码,多表加密代码,单表解密代码和多表解密代码,以上是解密加密的代码概述。
另外还包括加解密文件生成代码,以及一些其他的辅助按键的响应代码。
这里就单表加密代码和解密代码做简单的说明:单表的主要做法师对英文的二十六个字母和一些常用的标点符号进行编码,然后根据编码通过模运算来对明文实现移位,这里假设m 为明文的编码,n 为密文的编码,密钥的编码为k ,加密的模运算公式就为S k m n mod )(+=,其中S 表示所有明文空间的长度,这样就顺利的实现加密的过程,其基本代码如下: k=get(handles.radiobutton2,'value')if(k==1)[filename,pathname]=uigetfile({ ...'*.*','All Files(*.*)';},...'');if isequal([filename,pathname],[0,0])returnelsepic = fullfile(pathname,filename);fid=fopen(pic);[A,COUNT]=fscanf(fid,'%c',inf);fclose(fid);ends=get(handles.edit2,'string');if isempty(s)msgbox('The edit is empty,please enter again!','error');return;endstr='D:\MATLAB7\work\moderncryptography\encryption\wordtable1.xls';[CODE,TXT,RAW]=xlsread(str);s=double(s);B=double(A);[m,n]=size(B);j=0;C=ones(1,n);hwait=waitbar(0,'Please Wait(1)>>>>>>>>'); for i=1:nif(B(i)>=13 & B(i)<=126)j=j+1;C(j)=B(i);endWaitBar1(i,n,hwait);endclose(hwait);[m,n]=size(CODE);hwait=waitbar(0,'Please Wait(2)>>>>>>>>'); for h=1:nif(s==CODE(2,h))s=CODE(1,h);endWaitBar1(h,n,hwait);endclose(hwait);for h=1:jfor k=1:nif(C(h)==CODE(2,k))C(h)=CODE(1,k);endendend% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%hwait=waitbar(0,'Please Wait(3)>>>>>>>>');for h=1:jC(h)=mod(C(h)+s,29);WaitBar1(h,j,hwait);endclose(hwait);% close(hwait);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%hwait=waitbar(0,'Please Wait(4)>>>>>>>>');for h=1:jfor k=1:nif(C(h)==CODE(1,k))C(h)=CODE(2,k);endendWaitBar1(h,j,hwait);endclose(hwait)% close(hwait);C=char(C);set(handles.edit3,'string',C);str='D:\MATLAB7\work\moderncryptography\encryption\singlesecretword.txt';fid=fopen(str,'wt');fprintf(fid,'%s',C)fclose(fid)elseA=get(handles.edit1,'string');if isempty(A)msgbox('The edit is empty,please enter again!','error');return;ends=get(handles.edit2,'string');if isempty(s)msgbox('The edit is empty,please enter again!','error');return;endstr='D:\MATLAB7\work\moderncryptography\encryption\wordtable1.xls';[CODE,TXT,RAW]=xlsread(str);s=double(s);B=double(A);[m,n]=size(B);j=0;C=ones(1,n);hwait=waitbar(0,'Please Wait(1)>>>>>>>>');for i=1:nif(B(i)>=13 & B(i)<=126)j=j+1;C(j)=B(i);endWaitBar1(i,n,hwait);endclose(hwait);[m,n]=size(CODE);hwait=waitbar(0,'Please Wait(2)>>>>>>>>');for h=1:nif(s==CODE(2,h))s=CODE(1,h);endWaitBar1(h,n,hwait);endclose(hwait);for h=1:jfor k=1:nif(C(h)==CODE(2,k))C(h)=CODE(1,k);endendend% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%hwait=waitbar(0,'Please Wait(3)>>>>>>>>');for h=1:jC(h)=mod(C(h)+s,29);WaitBar1(h,j,hwait);endclose(hwait)% close(hwait);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%hwait=waitbar(0,'Please Wait(4)>>>>>>>>');for h=1:jfor k=1:nif(C(h)==CODE(1,k))C(h)=CODE(2,k);endendWaitBar1(h,j,hwait);endclose(hwait)% close(hwait);C=char(C);set(handles.edit3,'string',C);str='D:\MATLAB7\work\moderncryptography\encryption\singlesecretword.txt';fid=fopen(str,'wt');fprintf(fid,'%s',C)fclose(fid)end解密过程就是上述过程的逆过程,这里就不在赘述,单表解密基本代码如下:k=get(handles.radiobutton2,'value');%提取加密形式指标值if(k==1)[filename,pathname]=uigetfile({ ...'*.*','All Files(*.*)';},...'');if isequal([filename,pathname],[0,0])returnelsepic = fullfile(pathname,filename);fid=fopen(pic);[A,COUNT]=fscanf(fid,'%c',inf);fclose(fid);end%文件形式解密时打开解密文件[CODE,TXT,RAW]=xlsread('D:\MATLAB7\work\modern cryptography\encryption\wordtable1.xls');%读取解密对照表set(handles.edit3,'string',A);%将密文显示在密文编辑框中s=get(handles.edit6,'string');%提取解密密钥if isempty(s)%解密密钥测空msgbox('The edit is empty,please enter again!','error');return;ends=double(s);n=length(CODE);hwait=waitbar(0,'Please Wait(1)>>>>>>>>');for h=1:nif(s==CODE(2,h))s=CODE(1,h);endWaitBar1(h,n,hwait);endclose(hwait);B=double(A);[m,n]=size(B);hwait=waitbar(0,'Please Wait(2)>>>>>>>');for h=1:nfor k=1:29if(B(h)==CODE(2,k))B(h)=CODE(1,k);endendWaitBar1(h,n,hwait);endclose(hwait);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% B=mod(B-s,29);hwait=waitbar(0,'Please Wait(3)>>>>>>>')for h=1:nfor k=1:29if(B(h)==CODE(1,k))B(h)=CODE(2,k);endendWaitBar1(h,n,hwait);endclose(hwait);B=char(B);fid=fopen('D:\MATLAB7\work\moderncryptography\encryption\singleproclaimedword.txt','wt');fprintf(fid,'%s',B)fclose(fid)set(handles.edit1,'string',B);else[CODE,TXT,RAW]=xlsread('D:\MATLAB7\work\modern cryptography\encryption\wordtable1.xls');A=get(handles.edit3,'string');s=get(handles.edit6,'string');if isempty(s)msgbox('The edit is empty,please enter again!','error');return;ends=double(s);n=length(CODE);hwait=waitbar(0,'Please Wait(1)>>>>>>>>');for h=1:nif(s==CODE(2,h))s=CODE(1,h);endWaitBar1(h,n,hwait);endclose(hwait);B=double(A);[m,n]=size(B);hwait=waitbar(0,'Please Wait(2)>>>>>>>');for h=1:nfor k=1:29if(B(h)==CODE(2,k))B(h)=CODE(1,k);endendWaitBar1(h,n,hwait);endclose(hwait); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% B=mod(B-s,29);hwait=waitbar(0,'Please Wait(3)>>>>>>>')for h=1:nfor k=1:29if(B(h)==CODE(1,k))B(h)=CODE(2,k);endendWaitBar1(h,n,hwait);endclose(hwait);B=char(B);fid=fopen('D:\MATLAB7\work\modern cryptography\encryption\singleproclaimedword.txt','wt');fprintf(fid,'%s',B)fclose(fid)set(handles.edit1,'string',B);end3应用基本功能测试3.1单表加密测试。