华中科技大学计算机专业11级汇编课程设计报告——文件加密与解密.doc_第1页
华中科技大学计算机专业11级汇编课程设计报告——文件加密与解密.doc_第2页
华中科技大学计算机专业11级汇编课程设计报告——文件加密与解密.doc_第3页
华中科技大学计算机专业11级汇编课程设计报告——文件加密与解密.doc_第4页
华中科技大学计算机专业11级汇编课程设计报告——文件加密与解密.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编课 程 设 计 报 告题目:文件的加密和解密(Win32) _ 课程名称: 汇编程序设计 专业班级: 学 号: 姓 名: 报告日期: 2013-9-12 计算机科学与技术学院目录1 设计概要11.1 模块划分11.2模块的层次结构11.3模块间的接口11.4人机界面12 详细设计22.1包含文件22.2宏定义22.2.1 字符串定义宏22.2.2 赋值宏22.3过程声明与原型22.3.1 过程声明22.3.2 过程原型22.4数据段32.5主程序32.5.1 流程图32.5.2 源代码42.6窗口主程序42.6.1 流程图42.6.2 源代码52.7消息处理程序62.7.1 流程图62.7.2 源代码103 程序界面图143.1 程序主界面143.2“选择文件”按钮143.3“加密文件”按钮153.4“解密文件”按钮154 设计总结164.1技术特点164.2设计不足164.3改进建议164.4问题与解决164.5设计体会164.6参考文献161 设计概要1.1 模块划分 包含文件、宏定义、过程声明、数据段 代码段a 主程序b 窗口主程序c 消息处理程序d. 加密/解密处理程序1.2模块的层次结构包含文件、宏定义、过程声明、数据段代码段主程序窗口主程序消息处理程序、加密/解密处理程序第1层第2层第3层第4层调用消息循环1.3模块间的接口主程序通过调用窗口主程序创建窗口;窗口主程序进入“消息循环”,通过“分发消息”(invoke DispatchMessage)进行消息处理;消息处理的过程就是消息处理程序的执行。1.4人机界面采用传统的windows界面:主程序调用窗口主程序,窗口主程序通过invoke RegisterClassEx 注册窗口,通过invoke CreateWindowEx建立窗口;消息处理程序中通过invoke PushButton、invoke EditS1生成按钮和文本框;按钮“选择文件”触发时,通过invoke GetOpenFileName 显示打开文件对话框。2 详细设计2.1包含文件windows.inc ;系统常量定义kernel32.inc user32.inckenel32.libuser32.libcomdlg32.inc ;文件操作有关comdlg32.lib2.2宏定义2.2.1 字符串定义宏szText MACRO Name,Text:VARARGLOCAL lbljmp lblName db Text,0lbl:ENDM方便定义字符串2.2.2 赋值宏m2m MACRO M1,M2push M2pop M1ENDM简化了变量的赋值操作2.3过程声明与原型2.3.1 过程声明WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORDWndProc PROTO :DWORD,:DWORD,:DWORD,:DWORDa. PushButtonPROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORDEditS1 PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD2.3.2 过程原型aWinMain proc hInst :DWORD, hPrevInst :DWORD,CmdLine :DWORD, CmdShow :DWORDbWndProc proc hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD cPushButton proc lpText:DWORD,hParent:DWORD,a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD jmp Button_Type btnClass db BUTTON,0 Button_Type: invoke CreateWindowEx,0,ADDR btnClass,lpText,WS_CHILD or WS_VISIBLE,a,b,wd,ht,hParent,ID,hInstance,NULLretPushButton endpdEditS1 proc szMsg:DWORD,a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,hParent:DWORD,ID:DWORD jmp _CreateEdit slEdit db EDIT,0 _CreateEdit: invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR slEdit,szMsg,WS_VISIBLE or WS_CHILDWINDOW or ES_AUTOHSCROLLor ES_NOHIDESEL,a,b,wd,ht,hParent,ID,hInstance,NULLretEditS1 endp2.4数据段.data szClassName db Template_Class,0 szDisplayName db 文件加密与解密,0 CommandLine dd 0 hWnd dd 0 hInstance dd 0 hButton1 dd 0 hButton2 dd 0 hButton3 dd 0 hEdit dd 0 MAXSIZE equ 260 ofn OPENFILENAME ;打开文件对话框用到的结构 szFileName db MAXSIZE dup(0) szFilterString db 所有文件,0,*.*,0,0 szMyTitle db 请打开一个文件.,02.5主程序2.5.1 流程图开始得到本应用程序句柄-hInstance(GetModuleHandle)获取命令行参数地址-CommandLine(GetCommandLine)调用窗口主程序(WinMain)结束(ExitProcess)图2.1 主程序流程图2.5.2 源代码.codestart: invoke GetModuleHandle, NULL mov hInstance, eax invoke GetCommandLine mov CommandLine, eax invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT invoke ExitProcess,eaxend start2.6窗口主程序2.6.1 流程图开始声明局部变量填充窗口类结构变量创建窗口消息循环,分发消息结束图2.2 窗口主程序流程图2.6.2 源代码WinMain proc hInst :DWORD, hPrevInst :DWORD, CmdLine :DWORD, CmdShow :DWORD;声明局部变量 LOCAL wc :WNDCLASSEX LOCAL msg :MSG LOCAL Wwd :DWORD LOCAL Wht :DWORD LOCAL Wtx :DWORD LOCAL Wty :DWORD;填充窗口类结构变量 mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW mov wc.lpfnWndProc, offset WndProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL mov eax,hInst mov wc.hInstance, eax ;hFile打开失败?是分配1000字节内存(invoke GlobalAlloc)分配失败?否是返回缓冲区首址-pMemory,文件指针filePointer置0希望读1000个字节到内存,返回读取的实际长度-ReadLen(invoke ReadFile)空文件?否ReadLen-ECX,pMeomory-EBX否循环修改缓冲区内容移动文件指针到上次读的位置(invoke SetFilePointer)缓冲区内容写入文件(invoke WriteFile)写入失败?是否ReadLen-EAX,filePointer+EAX-filePointer,设置下次读文件的位置,为下次写文件做准备ReadLen=1000?释放内存(invoke GlobalFree),结束关闭文件(invoke CloseHandle)否是提示“加密成功”图2.4 加密(解密)过程流程图2.7.2 源代码WndProc proc hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD;消息处理程序 LOCAL hFile:DWORD ;文件句柄 LOCAL dwFileSize:DWORD ;文件大小 LOCAL ReadLen:DWORD ;实际读文件大小 LOCAL pMemory:DWORD ;缓冲区指针 LOCAL pos:DWORD ;实际写文件大小 LOCAL filePointer:DWORD ;文件指针变量 .if uMsg = WM_DESTROY invoke PostQuitMessage,NULL .elseif uMsg = WM_CREATE szText ButnTxt1,选择文件,0 invoke PushButton,ADDR ButnTxt1,hWin,30,70,100,26,500 mov hButton1,eax szText ButnTxt2,加密文件,0 invoke PushButton,ADDR ButnTxt2,hWin,150,70,100,26,501 mov hButton2,eax szText ButnTxt3,解密文件,0 invoke PushButton,ADDR ButnTxt3,hWin,280,70,100,26,502 mov hButton2,eax invoke EditS1,NULL,20,30,400,20,hWin,701 mov hEdit,eax .elseif uMsg = WM_COMMAND .if wParam = 500 ;按钮“选择文件”的处理代码 ;打开文件对话框 mov ofn.lStructSize,sizeof ofn m2m ofn.hwndOwner,hWnd ;文件选择对话框所属窗口 m2m ofn.hInstance,hWnd mov ofn.lpstrFilter,offset szFilterString ;过滤文件字符串,本处为“*.*”即所有文件 mov ofn.lpstrFile,offset szFileName ;赋值选择文件名存放的缓冲区指针 mov ofn.nMaxFile,MAXSIZE ;缓冲区大小 mov ofn.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER ;初始化标志 mov ofn.lpstrTitle,offset szMyTitle ;设置文件打开对话框上的标题 invoke GetOpenFileName,addr ofn ;显示打开文件对话框 invoke SetWindowText,hEdit,ADDR szFileName ;将文件名送到文本框 .elseif wParam = 501 ;按钮“加密文件”的处理代码 invoke CreateFile, addr szFileName, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL ;以“可读可写”方式打开文件 mov hFile,eax .if hFile = INVALID_HANDLE_VALUE szText szErrOpen,文件打开错误 invoke MessageBox,hWnd,addr szErrOpen,addr szDisplayName,MB_OK jmp en_close1 .endif invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,1000 ;分配1000字节内存 .if eax = NULL szText MemoryErr,内存分配失败 invoke MessageBox,0,addr MemoryErr,NULL,MB_OK jmp en_close2 .endif mov pMemory,eax ;返回缓冲区首址 mov filePointer,0 en_repeat_read: invoke ReadFile,hFile,pMemory,1000,addr ReadLen,NULL .if ReadLen = 0 ;空文件 jmp en_close2 .endif mov ecx,ReadLen ;ECX作为计数寄存器 mov ebx,pMemory ;EBX作为间接寻址寄存器 en_again: XOR byte ptrebx,33H inc ebx loop en_again invoke SetFilePointer,hFile,filePointer,0,FILE_BEGIN ;移动文件指针到上次读的位置 invoke WriteFile,hFile,pMemory,ReadLen,addr pos,NULL ;写入文件,写入完毕时文件指针偏移开始位置长为filePointer_ReadLen .if eax = FALSE szText WriteErr,写入文件失败 invoke MessageBox,0,addr WriteErr,NULL,MB_OK jmp en_close1 .endif mov eax,ReadLen add filePointer,eax ;filePointer+ReadLen为下次读的文件指针位置 cmp ReadLen,1000 ;如果读到的不够1000字节,说明文件结束 je en_repeat_read szText en_successful,加密成功! szText Note,提示 invoke MessageBox,0,addr en_successful,addr Note,MB_OK en_close1: invoke GlobalFree,pMemory en_close2: invoke CloseHandle,hFile .elseif wParam = 502 ;按钮“解密文件”的处理代码 invoke CreateFile, addr szFileName, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL mov hFile,eax .if hFile = INVALID_HANDLE_VALUE invoke MessageBox,hWnd,addr szErrOpen,addr szDisplayName,MB_OK jmp de_close1 .endif invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,1000 .if eax = NULL invoke MessageBox,0,addr MemoryErr,NULL,MB_OK jmp de_close2 .endif mov pMemory,eax mov filePointer,0 de_repeat_read: invoke ReadFile,hFile,pMemory,1000,addr ReadLen,NULL .if ReadLen = 0 jmp de_close2 .endif mov ecx,ReadLen mov ebx,pMemory de_again: XOR byte ptrebx,33H inc ebx loop de_again invoke SetFilePointer,hFile,filePointer,0,FILE_BEGIN invoke WriteFile,hFile,pMemory,ReadLen,addr pos,NULL .if eax = FALSE invoke MessageBox,0,addr WriteErr,NULL,MB_OK jmp de_close1 .endif mov eax,ReadLen add filePointer,eax cmp ReadLen,1000 je de_repeat_read szText de_successful,解密成功! invoke MessageBox,0,addr de_successful,addr Note,MB_OK de_close1: invoke GlobalFree,pMemory de_close2: invoke CloseHandle,hFile .endif .endif invoke DefWindowProc,hWin,uMsg,wParam,lParam retWndProc endp3 程序界面图3.1 程序主界面图3.1 程序主界面3.2“选择文件”按钮图3.2 “选择文件”按钮呼出对话框图3.3“加密文件”按钮图3.3 “加密文件”按钮呼出消息图3.4“解密文件”按钮图3.4 “解密文件”按钮呼出消息图4 设计总结4.1技术特点界面简洁明了,程序简单易用;加密和解密算法简单有效,可修改性和可变性强。因为加密(解密)的核心代码都集中在一个地方,可以方便地修改;用户处理程序部分对各种情况包括出错处理都考虑在内

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论