您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 电子商务 > 8086对文件加密解密实验
微机原理实验一、实验要求选择相应加解密算法,编写程序,要求对指定文件进行加密解密操作,结果输出到文件。二、实验整体思路1.分支结构:选择加密、解密、退出2.打开键入地址的文件3.读出文件内容,调用加密(解密)子程序,对内容进行加密(解密)4.写入后保存5.返回2三、结构框图与程序步骤开始打开文件(3DH)读取文件(3FH)加密(调用加密子程序)加密/解密解密(调用解密子程序)打开文件(3DH)读取文件(3FH)关闭文件(3EH)1--加密2--解密结束其他–退出四、实验程序及分析1宏定义(1)暂停的宏PAUSEMACRO;暂停的宏MOVAH,07HINT21HENDM(2)返回DOS的宏QUITMACRO;返回DOS的宏MOVAX,4C00HINT21HENDM2加密子程序加密过程:先将从文件读取的数据逐个读入缓冲区,然后调用加密程序进行加密,再把加密后的内容写入缓冲区,最后把缓冲区的内容写入文件。其中,在写入文件前要确保文件读写指针改变到正确位置,我们编写了一个改变文件指针的宏。ENCRYEXPROCNEARENCRYEX_START:MOVDX,OFFSETTEXT1;显示TEXT1内容CALLFINPUT;提示输入文件名LEADX,FNAMEMOVAH,0AHINT21H;从键入文件名MOVAX,FNAME+1MOVAH,0MOVBX,AXMOV[BX+FNAME+2],0;形成ASCIZ串LEADX,FNAME+2MOVAX,3D02HINT21H;打开文件MOVHANDLE,AX;保存文件代号MOVBX,AXMOVCX,2000LEADX,BUFMOVAH,3FHINT21HMOVLEN,AX;保存读入字节数MOVCX,AX;传送读入字节数DECCXLEABX,BUFCALLENCRYPT;调用加密算法ENCRYEX_END:;加密结束MOVDX,OFFSETTEXT_ENMOVAH,09HINT21HRETENCRYEXENDP3解密子程序解密模块是加密模块的逆过程,将已加密数据读入缓冲区,调用解密子程序,解密后的结果返回缓冲区,在写入文件,同样,写文件前得关键步骤是正确改变文件读写指针。DECRYEXPROCNEARDECRYEX_START:MOVDX,OFFSETTEXT1;显示TEXT1内容CALLFINPUT;提示输入文件名LEADX,FNAMEMOVAH,0AHINT21H;从键入文件名MOVAL,FNAME+1MOVAH,0MOVBX,AXMOV[BX+FNAME+2],0;形成ASCIZ串LEADX,FNAME+2MOVAX,3D02HINT21H;打开文件MOVHANDLE,AX;保存文件代号MOVBX,AXMOVCX,2000LEADX,BUFMOVAH,3FHINT21HMOVLEN,AX;保存读入字节数MOVCX,AX;传送读入字节数DECCXLEABX,BUFCALLDECRYPT;调用加密算法DECRYEX_END:;加密结束MOVDX,OFFSETTEXT_DEMOVAH,09HINT21HRETDECRYEXENDP4加密和解密算法子程序;---------------------------解密子程序-----------------------------------------DECRYEXPROCNEARDECRYEX_START:MOVDX,OFFSETTEXT1CALLFINPUT;提示输入文件名LEADX,FNAMEMOVAH,0AHINT21H;从键入文件名MOVAX,FNAME+1MOVAH,0MOVBX,AXMOV[BX+FNAME+2],0;形成ASCIZ串LEADX,FNAME+2MOVAX,3D02HINT21H;打开文件MOVHANDLE,AX;保存文件代号MOVBX,AXMOVCX,2000LEADX,BUFMOVAH,3FHINT21HMOVLEN,AX;保存读入字节数MOVCX,AX;传送读入字节数DECCXLEABX,BUF;修改偏移指针CALLDECRYPT;调用解密算法DECRYEX_END:;解密结束MOVDX,OFFSETTEXT_DEMOVAH,09HINT21HRETDECRYEXENDP;-------------------------加密算法子程序---------------------------------ENCRYPTPROCNEARMOVLEN,AX;保存读入字节数MOVCX,AX;传送读入字节数DECCXLEASI,BUFENCODING:XORBYTEPTR[SI],0FFH;异或,第一步加密PUSHBXMOVBX,4ROLBYTEPTR[SI],CL;循环左移四位,第二步加密POPBXINCSI;下一个字符地址LOOPENCODING;处理下一个字符MOVAX,4200H;移动文件指针到文件头MOVBX,HANDLEMOVCX,0MOVDX,0INT21HMOVBX,HANDLEMOVCX,LENMOVAH,40H;写文件LEADX,BUFINT21HRETENCRYPTENDP;-----------------------------解密算法子程序-------------------------------DECRYPTPROCNEARMOVLEN,AX;保存读入字节数MOVCX,AX;传送读入字节数DECCXLEASI,BUFUNCODING:PUSHBXMOVBX,4RORBYTEPTR[SI],CLPOPBXXORBYTEPTR[SI],0FFHINCSILOOPUNCODINGMOVAX,4200H;移动文件指针到文件头MOVBX,HANDLEMOVCX,0MOVDX,0INT21HMOVBX,HANDLEMOVCX,LENMOVAH,40H;写文件LEADX,BUFINT21HRETDECRYPTENDP五、出现的问题问题一:编写初起,在程序最开头对文件缓冲数据等重要变量定义如下:BUFDB200DPU(0)FNAMEDB200DBDB200DPU(0)LENDW?HANDLEDW?当程序可以成功编译并且执行,会出现以下情况:1.只能成功对存有两个或两个一下字txt的文件进行加密和解密。2.对四个字节的txt文件,可以成功加密解密前两个字节,后两个字节则会出现乱码,此时运行界面也会相应出现少量乱码,并且不能完整显示“XXXXXXXXXX”的内容。3.对于存有4个字节以上的txt文件则不会执行加密解密,即程序运行后文件内容不变化。根据以上内容分析后,对变量定义改动如下:BUFDW200DPU(0)FNAMEDW200DWDW200DPU(0)LENDW?HANDLEDW?多次尝试后发现,上述第2问题被解决,但仍然存在类似第3项的问题,只是字节上限大于4,具体数值未统计。最后,经与同学讨论并借和相关资料查询,最变量定义方式最终开动如下:BUFDD200DPU(0)FNAMEDD200DDDD200DPU(0)LENDD?HANDLEDD?经反复尝试,最终解决上述所有问题,并且无论连续执行多少次,都可成功现实“XXXXXXXXXXXXX”等提示内容。经过这一过程,我对于在加密解密程序中,对文件内容数据缓冲区的理解更加深刻。对缓冲区数据的定义,直接影响到对文件加密解密的字节限制,最后的DD定义,即解决了对字节数量的限制,也对数据类型是汉字、字母或数字的限制得到突破。运行结果如下:问题二:目前阶段所完成的代码,只能对txt类文件成功运行,当对象文件为doc或者其他时,程序在运行到“打开文件”阶段:MOVAX,3D02HINT21H;打开文件MOVHANDLE,AX;保存文件代号则会进入死循环。由于作业提交时间限制,该问题尚未解决,但目前推断是存在某一变量对文件类型有所影响。问题三:在程序开头处定义提示信息处:TEXT0DB'',0DH,0AHDB'',0DH,0AHDB'XXXXXXXXXX',0DH,0AHDB'PRESS1FORENCRY,2FORDECRY,OTHERFORQUIT',0DH,0AHDB'YOURCHOICE:',0DH,0AH,'$'TEXT1DB'',0DH,0AHDB'INPUTTHEFILENAME:',0DH,0AH,'$'TEXT_ENDB'',0DH,0AHDB'SUCCESSFULLYENCRY',0DH,0AH,'$'TEXT_DEDB'',0DH,0AHDB'SUCCESSFULLYDECRY',0DH,0AH,'$'FQUITDB'PRESSANYKEYTOQUIT',0DH,0AH,'$'经反复尝试,发现不能成功显示汉字类内容。对于这个问题仍存在较大疑惑,因为我个人理解,不论是汉字、字母还是数字,在寄存器中都是以统一种方式存储的。具体原因还会继续探究。此外,调试过程中还发现,若想成功在屏幕上显示所定义的提示信息,需要将emu8086自带的org100h改成org0h。问题四:对于被选定加密或解密的文件,路径必须是在emu8086系统下的“MyBuild”文件中才能成功寻址并打开(我调试过程中,文件路径一律为D:\ProgramFiles\emu8086\MyBuild\1.txt)。因此,对于如何能对任意路径下文件执行程序,仍需进一步探究。六、实验体会学汇编语言之前,大一学习的是C语言,因此,面对格式之类的感觉很不适应。C语言用的是一个又一个变量,而汇编语言则是利用一个又一个寄存器来实现。而写代码的时候,经常会因为一些符号,或者字长的失误,完全是无心之失而导致程序无法执行。而回过来找错误的时候,又往往忽略了这些细节而找不到错误的根源。学习汇编是个艰辛的过程,从C语言到汇编的不适,到牢记大量的指令,并熟练应用,都要花费很多时间适应。对有些指令的源操作数和目的操作数,以及操作结果的存放位置都要熟记于心。否则,将很难应用这些指令,学习汇编的一个重要能力就是能够熟练调试所写程序,当某个程序不能执行时,而又发现不了错误,这就要用debug对程序进行逐步调试了。这样更容易发现错误点并牢记。在本程序中,所用的加密算法比较简单,也就是说,密码很容易被攻破,所以要想得到安全可靠的密码,必须选择复杂或难以想到的算法,只有经过这样的算法,才能得到安全的密码。这有待我们进一步的学习和探讨。实验中也遇到了一些错误,比如在给doc文件加密和解密过程中出现打开错误,通过不断寻找以及调试,虽然问题仍未解决,但在不断探索的过程中我对各类代码、语句的含义和功能有了更深的理解。由于本学期时间有限,我们不能很好的更深入的学习微机原理这门课。若想把它学好,自己要私下里多花点功夫,研究探索,并多多请教老师或一些编程高手。这有这样多问,多看书,多动手编程,自己的汇编语言才能有所真正的提高,并能游刃有余。程序源代码:org0h;*************************主程序中用到的所有宏定义***************************PAUSEMACRO;暂停的宏MOVAH,07HINT21HENDMQUITMACRO;返回DOS的宏MOVAX,4C00HINT21HENDMENDM;*****************************主程序**********************************DATASEGMENTBUFDD200DPU(0);为文件内容数据准备的缓冲区FNAMEDD200;输入文件名缓冲区前两个字节DDDD200DPU(0)LENDD?HANDLEDD?TEXT0DB'',0DH,0AHDB'',0DH,0AHDB'xxxxxxxxxxx',0DH,0AHDB'PRESS1FORENCRY,2FORDECRY,OTHERFORQUIT',0DH,0AHDB'YOURCHOICE:',0DH,0AH,'$'TEXT1DB'',0DH,0AHDB'INPUTTHEFILENAME:',0DH,0AH,'$'TEXT_ENDB'',0DH,
本文标题:8086对文件加密解密实验
链接地址:https://www.777doc.com/doc-7249178 .html