实现文件简单的加密和解密_第1页
实现文件简单的加密和解密_第2页
实现文件简单的加密和解密_第3页
实现文件简单的加密和解密_第4页
实现文件简单的加密和解密_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

北京邮电大学毕业设计绪论1.1论文背景信息安全是一个综合性的交叉学科领域,广泛涉及数学、密码学、计算机、通信控制、人工智能、安全工程、人文科学等诸多学科,是近几年迅速发展的一个热点学科领域。信息对抗和网络安全是信息安全的核心热点,它的研究和发展又将刺激、推动和促进相关学科的研究与发展。网络技术的快速发展,给我们的生活带来了方便,提高了我们的工作效率,丰富了我们的生活,但同时,安全问题也时刻困扰着我们。连接在网络上的计算机随时都有被黑客攻击的可能,在网络上收发的文件也有可能被黑客截获,而这种不安全的因素是TCP/IP协议所固有的,所以为了保护重要的文件安全,我们必须给重要的文件加密。本论文讲述了加密技术的实现。通过数据加密,人们可以有效地保证个人数据的安全,以及在通信线路上的内容不被泄露,而且还可以检验传送信息的完整性。1.2主要工作实现文件简单的加密和解密,保护数据安全。实现文件校验功能,用于验证文件的完整性和正确性。通过覆盖技术使删除的文件不可恢复,实现文件粉碎功能。设计一套完整的加密体系,在核心代码运行前优先取得程序控制权做校验工作,保护软件的安全。1.3本文结构本文第一部分主要以绪论为主,说明了文章的研究背景、主要工作,概要说明了所做的工作。第二部分主要是文件加密解密的相关知识的介绍,介绍了AES算法的原理。第三部分叙述了设计的思路、重点。第四部分为设计结果及分析,将劳动成果展现给大家。第五部分为结论、致谢和参考文献,列出了文章的参考文献和引用文献,反映本文研究工作的背景和依据。2AES介绍2.1AES概述AES是一个迭代的、对称密钥分组的加密算法,即它的加密和解密过程都使用同一个密钥。AES分组密码接受一个128位的明文,并且在一个128、192、256位秘密密钥的控制下产生一个128位的密文。它是一个替代-置换网络的设计,并且带有一个称为轮的步骤的集合,其中轮数可以为9、11或者13(对应于128、192或者256位的密钥),这样可以将明文映射为密文。一轮AES由下面的4步组成:(1)字节替代(SubBytes):用一个S盒完成分组中的按字节的代换。(2)行移位(ShiftRows):一个简单的置换。(3)列混淆(MixColumns):一个利用在域GF()上的算术特性的代换。(4)轮密钥加(AddRoundKey):利用当前分组和扩展密钥的一部分进行按位XOR。每一轮分别使用它自己的128位轮密钥(roundkey),它是由秘密密钥通过一个称为密钥调度(keyschedule)的过程处理而产生的。不要低估一个设计合理的密钥调度方案的重要性。它把密钥的熵散发给每一个轮密钥。如果熵没有被很好地传播,就会产生各种麻烦,例如等价密钥、相关密钥以及其他类似的分别征服攻击(distinguishingattack)。AES把128位的输入看作是一个由16个字节组成的向量,并用一个4x4的列矩阵(big-endian)的形式来组织,叫做状态(state)。即第1个字节映射为,第3个字节映射为,第4个字节为,第16个字节映射为,如图2-1所示。A0.0A0.1A0.2A0.3A1.0A1.1A1.2A1.3A2.0A2.1A2.2A2.3A3.0A3.1A3.2A3.3图2-1AES的状态示意图整个AES分组密码由下面的步骤组成:(1)AddRoundKey(round=0)(2)forround=1到Nr-1(9、11或者13,这取决于密钥的大小)doSubBytesShiftRowsMixColumnsAddRoundKey(round)(3)SubBytes(4)ShiftRows(5)AddRoundKey(Nr)2.2轮密钥加(AddRoundKey)轮函数的这一步是把轮密钥加到状态中(在GF(2)中)。它执行了16个并行的把密钥加到状态中的运算。GF(2)的加法是通过异或运算来完成的,如图2-2所示。图2-2AESAddRoundKey函数其中的K炬阵是一个轮密钥并且对每一轮都有一个惟一的密钥。因为密钥的加法是一个简单的异或,所以它常实现为在32位软件中从列开始的一个32位的异或操作。2.3字节替代(SubBytes)轮函数的SubBtes步骤是用来执行SPN中的非线性混清步骤的。它把16个字节的每一个都并行地映射为一个新的字节,这是通过一个两步骤的替代操作来完成的,如图2-3所示。图2-3AESSubBytes函数该映射变化是一个简单的查表操作,AES定义了一个S盒,如表2.1所示,它是由16*16个字节组成的矩阵,包含了8位值所能表达的256种可能的变换。State中每个字节按照如下的方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,然后取出S盒中对应行列的元素作为输出。例如,十六进制值95所对应的S盒的行值是9,列值是5,S盒中在此位置的值是2A。相应地,95被映射为2A。表2.1AES的S盒y0123456789ABCDEFx0637C777BF26B6FC53001672BFED7AB761CA82C97DFA5947F0ADD4A2AF9CA472C02B7FD9326363FF7CC34A5E5F171D83115304C723C31896059A071280E2EB27B275409832C1A1B6E5AA0523BD6B329E32F84553D100ED20FCB15B6ACBBE394A4C58CF6D0EFAAFB434D338545F9027F503C9FA8续表2.1AES的S盒751A3408F929D38F5BCB6DA2110FFF3D28CD0C13EC5F974417C4A77E3D645D1973960814FDC222A908846EEB814DE5E0BDBAE0323A0A4906245CC2D3AC639195E479BE7C8376D8DD54EA96C56F4EA657AAE08CBA78252E1CA6B4C6E8DD741F4BBD8B8AD703EB5664803F60E613557B986C11D9EEE1F8981169D98E949B1E87E9CE5528DFF8CA1890DBFE6436841992D0FB054BB16S盒被设计成能防止已有的各种密码分析攻击。AES的开发者特别寻求在输入位和输出位之间几乎没有相关性的设计,且输出值不能通过利用一个简单的数学函数变换输入值所得到。当然,S盒必须是可逆的,即逆S盒[S盒(a)]=a。然而,因S盒(a)=逆S盒(a)不成立,在这个意义上S盒不是自逆的。例如,S盒(95)=2A,但逆S盒(95)=AD。2.4行移位(ShiftRows)ShiftRows这一步对状态中的每一行分别进行向左循环移动0、1、2和3个位置。它是完全线性的,如图2-4所示。图2-4AESShiftRows函数在实际应用中,我们将会看到这是通过重命名(renaming)来实现的而不是一个实际的移动。也就是说,通过对字节移动的替代,我们只是简单地在得到它们的地方对它们进行修改就可以。在32位的软件中,我们可以很容易地把ShiftRows和SubBytes以及MixColumns混合,而不用来回交换字节。2.5列混淆(MixColumns)MixColumns这一步对状态中的每一列乘上一个4*4的变换,这个变换就是所谓的极大距离可分码(MaximallyDistanceSeparable,MDS)。这一步的目的是扩大差别并且让输出线性依赖于其他输人。即如果一个单一的输入字节在两个明文中发生了改变(输入中所有其他的字节没变),这个改变将尽可能快地传播到状态中的其他字节中去,如图2-5所示。图2-5AESMixColumns列混淆变换和行移位变换使得在经过几轮变换后,所有的输出位均与所有的输入位相关。2.6密钥调度(KeySchedule)密钥调度是负责把输人的密钥转化成所需的Nr+1个128位轮密钥。图2-6中的算法将计算轮密钥。输入:Nk密钥中的32位字的个数(4、6或者8)w4×(Nr+1)个32位字的数组输出:w使用密钥来设显一个数组(1)以big-endian的格式把秘密密钥预加载到w的第一个Nk字中(2)i=Nk(3)while(i<4*(Nr+1))do(1)temp=w[i-1](2)if(imodNk=0)temp=SubWord(RotWord(temp))XORRcon[i/Nk](3)elseif(Nk>6andimodNk=4)temp=SubWord(temp)(4)w[i]=w[i-Nk]xortemp(5)i=i+1图2-6AES密钥调度密钥调度还需要两个额外的函数。SubWord()的输人为32位并且并行地把每个字节发送给AES的SubBytes替代表中。RotWord()把字向右循环移动8位。Rcon表是一个数组,它只存储了多项式g(x)=x的前10个幕模AES多项式的最高字节。3系统设计3.1设计概述此次毕业设计采用的开发工具是VisualStudio2010,所选用的开发语言是C++,软件名称为:文件管家。目前网络上,文件加密与解密的软件比较多,功能也比较强大,之所以会选择“实现文件简单的加密和解密”这个题目,并且去设计一款这方面的软件,主要有两方面原因:一是因为一直对信息安全比较感兴趣,也杂七杂八的看过一些这方面的资料,想通过这次毕业设计,学以致用;二是因为之前用过一些文件加解密的软件,但是感觉操作比较复杂,当然它们的功能都比较强大,但作为普通用户,我们可能并不需要那么强大而复杂的功能,所以这次毕业设计,想在用户体验上下一些功夫,设计一款能够满足我们日常需要的文件加解密软件。总体的设计思路是:既要保证文件的安全性,也要兼顾用户体验,避免繁琐的操作。本次毕业设计的核心内容分为两部分,一部分是文件加密,作为一款文件加密软件,最主要的内容就是文件加密的安全性,即采用这款软件加密后的文件,会不会被人轻易解密;另一部分是软件安全,我们知道,软件的开发流程是编辑、编译、调试,然后就是发布可执行文件。可执行文件对一般用户来说,就是一个小程序,但是对于一些别有用心的人,它不仅是一个小程序,它还是程序的源码,他能够把可执行文件还原为源文件,这样我们程序里的算法就被他一览无余,所以我们在发布之前还需要对可执行文件做一些工作,来保护软件的安全性,由其我们这是一款加密软件,在保护文件安全的同时,也要做好自身的防护工作。3.1.1界面设计界面主体采用选项卡设计,共有3个选项卡,分别是加密、解密和工具箱。加密选项卡用于完成文件加密,解密选项卡用于完成文件解密,工具箱选项卡包含文件校验和文件粉碎两个界面。3.1.2实现代码设计加解密程序,采用AES算法。文件校验,采用MD5算法。文件粉碎,删除文件之后,会用空数据或随机数据多次覆盖在原数据上,保证删除之后的文件不能被还原。软件安全:第一次使用,需要输入注册码(输入后保存到配置文件里)。每次运行软件前,根据注册码生成一个key(算法不可逆),用key解密核心代码(算法可逆),解密后根据核心代码生成一个校验码(算法不可逆),与存在程序里的校验码比较,不正确提示并退出程序,正确则进入程序。3.1.3操作流程第一次运行程序,需要以管理员身份运行程序,完成修改注册表和生成配置文件的功能。再次运行程序,需要输入注册码,正确则保存注册码到配置文件并进入程序,不正确则不保存注册码并提示退出程序。加密:鼠标右键单击需要加密的文件,资源管理器菜单会出现“文件管家”的选项,点击即会出现文件加密对话框,输入加密密码和确认密码,点击加密,即可完成加密操作。需要注意的是,执行加密操作默认删除源文件,可以在点击加密之前,去掉“加密后,删除源文件”前面的勾,则不会删除源文件。解密:加密完成后,文件后缀变为MYFM(MyFileManager的缩写),加密后的文件图标会被换成“文件管家”的LOGO。要解密的时候,直接双击该文件,默认用文件管家打开,输入密码即可完成解密操作。总体来看,程序操作简洁,用户体验比较好。3.2界面设计运行VS2010,创建一个MFC项目,命名为:文件管家。项目建好后,将默认对话框作为加密解密工具的主界面。在主界面添加一个TabControl,需要三个选项卡,分别是:加密、解密和工具箱,下面分别对这三个选项卡做详细的设计,设计时要用到vs2010里工具箱的工具。详细设计如下:3.2.1LOGO设计图3-1LOGO采用黑色主元素,黑色代表未知,即加密后文件比较安全,如图3-1所示。3.2.2加密选项卡的设计图3-2加密选项卡属性设置建立一个对话框资源,Style属性设为Child,Border属性设为None,如图3-2所示。解密选项卡和工具箱选项卡同加密选项卡。图3-3加密选项卡界面设计加密选项卡最上面是一个不可读的EditControl,用来显示需要加密文件的文件名,因为文件名不需要更改,所以这里设置EditControl的Disabled为True。在加密时需要输入加密密码,为了避免因用户按错键而导致密码不正确,这里需要输入确认密码。接着是一个Check-boxControl,用来选择加密后是否删除源文件,默认删除源文件。最后是两个ButtonControl,分别为:加密和取消。点击加密,则执行加密操作;点击取消,则放弃加密操作,并退出程序,如图3-3所示。3.2.3解密选项卡的设计图3-4解密选项卡界面设计解密选项卡最上面是一个不可读的EditControl,用来显示需要解密文件的文件名,因为文件名不需要更改,所以这里设置EditControl的Disabled为True。接着又是一个EditControl,用来输入解密密码。接着是一个Check-boxControl,用来选择解密后是否删除源文件,默认删除源文件。最后是两个ButtonControl,分别为:解密和取消。点击解密,则执行解密操作;点击取消,则放弃解密操作,并退出程序,如图3-4所示。3.2.4工具箱选项卡的设计图3-5工具箱选项卡界面设计工具箱选项卡包含两部分,文件校验和文件粉碎,工具箱选项卡最上面是一个EditControl,用来显示当前正在操作文件的文件名,如图3-5所示。文件校验:包含一个EditControl,用来显示当前文件的MD5值。文件粉碎:包含一个EditControl用来设置擦写次数,次数必须大于等于0。紧挨着EditControl的是一个SpinControl,用来增减EditControl里值。之后是两个Radio-button-Control,用来选择填充数据,默认选择空数据,用空数据来擦写源文件所在的磁盘位置。最后是两个ButtonControl,分别为:粉碎和取消。点击粉碎,则执行粉碎操作;点击取消,则放弃粉碎操作,并退出程序。3.3实现代码设计在界面设计的基础上,进行代码设计。第一次运行程序,需要输入注册码(若正确则保存到配置文件中),之后每次运行都要根据注册码生成key(不可逆算法),然后用key解密核心代码(可逆算法),解密后根据核心代码生成一个校验码(不可逆算法),与存在程序里的校验码比较,不正确提示并退出程序,正确则进入程序,这些代码放在主对话框的OnInitDialog()函数中,在程序初始化时运行。其余详细设计如下:3.3.1加密选项卡的设计图3-6加密选项卡添加处理类使用ClassWizard生成新的类,基类为CDialogEx,对话框ID为IDD_DIALOG1,类名为:CPage1,这样就为加密选项卡创建了一个类,所有对加密选项卡的操作,都可以写在CPage1类中,如图3-6所示。(解密选项卡、工具箱选项卡同)图3-7加密选项卡程序运行时,首先读取当前操作文件的文件名,显示在文件名编辑框中,如图3-7所示。点击加密按钮后,首先判断加密密码和确认密码是否为空,若为空则弹出MessageBox,并中断执行加密函数,重新回到输入界面,等待用户输入。若加密密码和确认密码都不为空,则判断加密密码和确认密码是否相同,若不相同,则弹出MessageBox,并中断执行加密函数,重新回到输入界面,等待用户输入。若加密密码和确认密码相同,则读取Check-boxControl的值,以确认是否删除源文件。最后调用AES算法,执行文件加密操作,加密成功后,弹出MessageBox,并退出程序。点击取消按钮,什么操作都不做,直接退出程序。3.3.2解密选项卡的设计图3-8解密选项卡程序运行时,首先读取当前操作文件的文件名,显示在文件名编辑框中,如图3-8所示。点击解密按钮后,首先判断解密密码是否为空,若为空则弹出MessageBox,并中断执行解密函数,重新回到输入界面,等待用户输入。若解密密码不为空,则读取Check-boxControl的值,以确认是否删除源文件。最后调用AES算法,执行文件解密操作,解密成功后,弹出MessageBox,并退出程序。点击取消按钮,什么操作都不做,直接退出程序。3.3.3工具箱选项卡的设计图3-9工具箱选项卡程序运行时,首先读取当前操作文件的文件名,显示在文件名编辑框中。调用MD5算法,根据当前文件的内容生成MD5信息值,显示在MD5编辑框中,来校验这个文件是否被“篡改”过,如图3-9所示。点击粉碎按钮后,首先读取擦写次数,然后读取Radio-button-Control,确定填充数据,用空数据或随机数据填充。最后调用粉碎函数,执行文件粉碎操作,即用填充数据填充当前文件,重复擦写次数次。粉碎成功后,弹出MessageBox,并退出程序。点击取消按钮,什么操作都不做,直接退出程序。3.3.4程序流程图(1)注册码模块流程图,如图3-10所示。图3-10注册验证流程图(2)加密模块流程图,如图3-11所示。图3-11加密流程图(3)解密模块流程图,如图3-12所示。图3-12解密流程图(4)粉碎模块流程图,如图3-13所示。图3-13文件粉碎流程图4设计结果及分析4.1设计结果展示4.1.1软件初始化(1)右键以管理员身份运行文件管家,如图4-1所示。图4-1以管理员身份运行程序(2)创建配置文件,如图4-2所示。图4-2创建配置文件(3)修改注册表-添加”文件管家“到资源管理器右键菜单,如图4-3所示。图4-3添加到资源管理器右键菜单(4)修改注册表-自定义资源管理器右键菜单中图标,如图4-4所示。图4-4设置资源管理器右键菜单图标(5)修改注册表-自定义文件类型,如图4-5所示。图4-5自定义文件类型(6)修改注册表-自定义文件类型图标,如图4-6所示。图4-6设置自定义文件类型图标(7)修改注册表-自定义文件类型默认打开程序,如图4-7所示。图4-7设置自定义文件类型默认打开程序4.1.2注册码验证(1)再次双击运行程序,弹出注册码输入框,如图4-8所示。图4-8双击运行程序(2)输入错误的注册码,弹出提醒对话框,并退出程序,如图4-9所示。图4-9注册码错误提示(3)输入正确的注册码,进入程序主界面,如图4-10所示。图4-10注册码正确,进入程序(4)正确的注册码保存到配置文件中,以后就不需要输入注册码了,如图4-11所示。图4-11注册码保存在配置文件到这里,软件的初始化工作全部完成,下面就可以使用文件管家来进行文件加密、文件解密、文件校验和文件粉碎功能了。4.1.3文件加密(1)右键单击需要加密的文件,在弹出的资源管理器右键菜单中选择“文件管家”,如图4-12所示。图4-12右键单击需要加密的文件(2)确认密码为空,如图4-13所示。图4-13密码为空提示(3)加密密码和确认密码不一致,如图4-14所示。图4-14密码不一致提示(4)加密密码和确认密码一致,如图4-15所示。图4-15加密成功提示(5)加密后的文件后缀为MYFM,图标为文件管家logo,如图4-16所示。图4-16加密后图标变化(6)打开文件,全部为乱码,加密成功,如图4-17所示。图4-17加密后内容为乱码4.1.4文件解密(1)双击需要解密的文件,如图4-18所示。图4-18双击需要解密的文件(2)解密密码为空,如图4-19所示。图4-19密码为空提示(3)备份一份加密后的文件,输入错误的解密密码,打开解密后的文件,依然为乱码,如图4-20所示。图4-20带解密文件为乱码(4)输入正确的解密密码,打开解密后的文件,解密成功,如图4-21所示。图4-21解密后文件恢复4.1.5文件校验(1)右键单击需要校验的文件,在弹出的资源管理器右键菜单中选择“文件管家”,在弹出的界面中,选择“工具箱”选项卡,如图4-22所示。图4-22MD5校验4.1.6文件粉碎(1)右键单击需要粉碎的文件,在弹出的资源管理器右键菜单中选择“文件管家”,在弹出的界面中,选择“工具箱”选项卡,修改擦写次数和填充数据,如图4-23所示。图4-23文件粉碎4.2设计结果分析及说明4.2.1软件初始化File:CFileManagerDlg.cppMethod:CFileManagerDlg::OnInitDialog()FILE*pf=fopen(exepath,"r");if(pf==NULL)//根据是否有配置文件,判断程序是否为第一次运行{ pf=fopen(exepath,"w+");//创建配置文件(配置文件用来存放注册码) HKEYhkey;//调用RegCreateKey时用到,得到一个key的句柄 /*将文件管家添加到资源管理器右键菜单*/ //获取HKEY_CLASSES_ROOT下"*\\shell\\文件管家\\command"键的句柄 RegCreateKey(HKEY_CLASSES_ROOT,"*\\shell\\文件管家\\command",&hkey); //得到文件管家的绝对路径 GetModuleFileName(NULL,exepath.GetBuffer(MAX_PATH),MAX_PATH); //用ReleaseBuffer去掉exepath没有用到的空间 //因为exepath.GetBuffer(MAX_PATH)得到了一个存放路径的最大空间 exepath.ReleaseBuffer(); exepath="\""+exepath+"\"\"%1\"";//拼接字符串,使其为cmd命令 //在hkey中注册一个名为exepath的值 //其值为(constBYTE*)exepath.GetBuffer(exepath.GetLength()) //长度为exepath.GetLength() RegSetValueEx(hkey,NULL,0,REG_SZ, (constBYTE*)exepath.GetBuffer(exepath.GetLength()), exepath.GetLength()); RegCloseKey(hkey);//释放指定注册键的句柄hkey /*设置文件管家资源管理器右键菜单的图片*/ //获取HKEY_CLASSES_ROOT下"*\\shell\\文件管家"键的句柄 RegCreateKey(HKEY_CLASSES_ROOT,"*\\shell\\文件管家",&hkey); //得到文件管家的绝对路径 GetModuleFileName(NULL,exepath.GetBuffer(MAX_PATH),MAX_PATH); exepath.ReleaseBuffer();//用ReleaseBuffer去掉exepath没有用到的空间 //拼接字符串,使其为图标路径 ch='\\'; n=exepath.ReverseFind(ch); exepath=exepath.Left(n); exepath=exepath+"\\src\\logo.ico"; //在hkey中注册一个名为exepath的值 //其值为(constBYTE*)exepath.GetBuffer(exepath.GetLength()), //长度为exepath.GetLength() RegSetValueEx(hkey,"icon",0,REG_SZ, (constBYTE*)exepath.GetBuffer(exepath.GetLength()), exepath.GetLength()); RegCloseKey(hkey);//释放指定注册键的句柄hkey /*自定义文件类型*/ //HKEY_CLASSES_ROOT\.myfm RegCreateKey(HKEY_CLASSES_ROOT,".myfm",&hkey); exepath="FileManager.File"; //在hkey中注册一个名为exepath的值 //其值为(constBYTE*)exepath.GetBuffer(exepath.GetLength()) //长度为exepath.GetLength() RegSetValueEx(hkey,NULL,0,REG_SZ, (constBYTE*)exepath.GetBuffer(exepath.GetLength()), exepath.GetLength()); RegCloseKey(hkey);//释放指定注册键的句柄hkey /*自定义文件类型,默认打开程序*/ //HKEY_CLASSES_ROOT\FileManager.File\shell\open\command RegCreateKey(HKEY_CLASSES_ROOT,"FileManager.File\\shell\\open\\command",&hkey); //得到文件管家的绝对路径 GetModuleFileName(NULL,exepath.GetBuffer(MAX_PATH),MAX_PATH); exepath.ReleaseBuffer();//用ReleaseBuffer去掉exepath没有用到的空间 exepath="\""+exepath+"\"\"%1\"2";//拼接字符串,使其为cmd命令 //在hkey中注册一个名为exepath的值 //其值为(constBYTE*)exepath.GetBuffer(exepath.GetLength()) //长度为exepath.GetLength() RegSetValueEx(hkey,NULL,0,REG_SZ, (constBYTE*)exepath.GetBuffer(exepath.GetLength()), exepath.GetLength()); RegCloseKey(hkey);//释放指定注册键的句柄hkey /*自定义文件类型图标*/ //HKEY_CLASSES_ROOT\FileManager.File\DefaultIcon RegCreateKey(HKEY_CLASSES_ROOT,"FileManager.File\\DefaultIcon",&hkey); //得到文件管家的绝对路径 GetModuleFileName(NULL,exepath.GetBuffer(MAX_PATH),MAX_PATH); exepath.ReleaseBuffer();//用ReleaseBuffer去掉exepath没有用到的空间 //拼接字符串,使其为图标路径 ch='\\'; n=exepath.ReverseFind(ch); exepath=exepath.Left(n); exepath=exepath+"\\src\\logo.ico"; //在hkey中注册一个名为exepath的值 //其值为(constBYTE*)exepath.GetBuffer(exepath.GetLength()) //长度为exepath.GetLength() RegSetValueEx(hkey,NULL,0,REG_SZ, (constBYTE*)exepath.GetBuffer(exepath.GetLength()), exepath.GetLength()); RegCloseKey(hkey);//释放指定注册键的句柄hkey //第一次运行,修改注册表、创建配置文件后,程序退出 CFileManagerDlg::OnCancel(); returnTRUE;}4.2.2注册码验证File:CFileManagerDlg.cppMethod:CFileManagerDlg::OnInitDialog()CStringstrRegKey;//存放注册码GetPrivateProfileString("REG","key","", strRegKey.GetBuffer(MAX_PATH),MAX_PATH, exepath);//读取配置文件中的注册码strRegKey.ReleaseBuffer();//释放没有用到的空间if(strRegKey.IsEmpty()){ //弹出输入注册码对话框 CRegregDlg; if(regDlg.DoModal()==IDOK) { strRegKey=regDlg.strRegKey;//点击确定按钮,读注册码IDC_EDIT_REG } else { //点击取消按钮,退出程序 CFileManagerDlg::OnCancel(); returnTRUE; }}//(1)根据注册码得到keyLPSTRpRegKey=(LPSTR)(LPCTSTR)strRegKey;charkey='\0';charchTmp='\0';while(chTmp=*pRegKey++){ /* 一个char8位,2^8=256种可能,若穷举攻击,需256种可能 本次毕业设计重点在于体系设计,故采用一字节。 */ key^=chTmp;}//(2)根据key解密核心代码/* 解密核心代码 正确key=0x52'R' 核心代码长度:63字节*/DecryptKernelCode(63,key);//(3)验证核心代码的正确性,若正确,写注册码到ini文件,若错误,提示并退出。/* 验证核心代码的正确性*/boolb=CFileManagerDlg::VerifyKernelCode(63);if(!b)//注册码错误{ //将配置文件置空 WritePrivateProfileString("REG","key","",exepath); MessageBox("注册码错误!"); CFileManagerDlg::OnCancel(); returnTRUE;}else//注册码正确{//将注册码写回配置文件 WritePrivateProfileString("REG","key",strRegKey,exepath);}File:CFileManagerDlg.cppMethod:CFileManagerDlg::DecryptKernelCode()voidCFileManagerDlg::DecryptKernelCode(intnLen,charkey)//解密核心代码{ //修改内存属性 //核心代码地址:0x0069EBA4 DWORDoldProtect; VirtualProtect((void*)0x0069EBA4,nLen, PAGE_EXECUTE_READWRITE,&oldProtect); unsignedcharary[1];//用来访问关键代码 for(inti=0;i<nLen;i++) { //还原关键数据,可逆算法 ary[0x0069EBA4-(int)ary+i]=ary[0x0069EBA4-(int)ary+i]^key; } VirtualProtect((void*)0x0069EBA4,nLen,oldProtect,&oldProtect);//还原内存属性}File:CFileManagerDlg.cppMethod:CFileManagerDlg::VerifyKernelCode()boolCFileManagerDlg::VerifyKernelCode(intnLen)//验证核心代码的正确性{ //修改内存属性 //核心代码地址:0x0069EBA4 DWORDoldProtect; VirtualProtect((void*)0x0069EBA4,nLen, PAGE_EXECUTE_READWRITE,&oldProtect); unsignedcharary[1];//用来访问关键代码 unsignedcharverify='\0'; for(inti=0;i<nLen;i++) { verify+=ary[0x0069EBA4-(int)ary+i]>>(i%9);//生成验证码,不可逆算法 } VirtualProtect((void*)0x0069EBA4,nLen,oldProtect,&oldProtect);//还原内存属性 //校验代码是否还原正确 //正确校验码:0x8f if(verify==0x8f) { returntrue; } else { returnfalse; }}4.2.3文件加密File:CPage1.cppMethod:CPage1::OnBnClickedOk()//密码转换,Cstring->char*unsignedcharkey[4][8];//256位密码inti=0,j=0,strlen=strPwd.GetLength();for(i=0;i<4;i++){for(j=0;j<8;j++){ if((i*8+j)<strlen){key[i][j]=(unsignedchar)strPwd[(i*8+j)];}else{key[i][j]=0x00; }}}AES.initial(8,key);//AES初始化EncryptFile();//文件加密File:CPage1.cppMethod:CPage1::EncryptFile()finput=fopen(strFileFullPath,"rb");//打开需要加密的文件fseek(finput,0,SEEK_END);longlFileLen=ftell(finput);//获得文件长度fseek(finput,0,SEEK_SET);longblocknum=lFileLen/16;longleftnum=lFileLen%16;strFileFullPath+=".MYFM";foutput=fopen(strFileFullPath,"wb");//打开加密后的文件unsignedcharinBuff[25],ouBuff[25];unsignedcharctming[4][4],ctme[4][4];for(longi=0;I<blocknum;i++){fread(inBuff,1,16,finput);//每次加密16个字节for(j=0;j<4;j++){for(k=0;k<4;k++){ctming[j][k]=inBuff[j*4+k];}}AES.Encrypt(ctming,ctme);//加密函数for(j=0;j<4;j++){for(k=0;k<4;k++){ouBuff[j*4+k]=ctme[j][k];}}fwrite(ouBuff,1,16,foutput);}if(leftnum)//加密分组后剩下的字节{for(j=0;j<16;j++){inBuff[j]=0;}fread(inBuff,1,leftnum,finput);for(j=0;j<4;j++){for(k=0;k<4;k++){ctming[j][k]=inBuff[j*4+k];}}AES.Encrypt(ctming,ctme);//加密函数for(j=0;j<4;j++){for(k=0;k<4;k++){ouBuff[j*4+k]=ctme[j][k];}}fwrite(ouBuff,1,16,foutput);}4.2.4文件解密File:CPage2.cppMethod:CPage2::OnBnClickedOk()//密码转换,Cstring->char*unsignedcharkey[4][8];//256位密码inti=0,j=0,strlen=strPwd.GetLength();for(i=0;i<4;i++){for(j=0;j<8;j++){ if((i*8+j)<strlen){key[i][j]=(unsignedchar)strPwd[(i*8+j)];}else{key[i][j]=0x00; }}}AES.initial(8,key);//AES初始化DecryptFile();//文件解密File:CPage2.cppMethod:CPage2::DecryptFile()Finput=fopen(strFileFullPath,"rb");//打开需要解密的文件fseek(finput,0,SEEK_END);longlFileLen=ftell(finput);//获取文件长度fseek(finput,0,SEEK_SET);longblocknum=lFileLen/16;longleftnum=lFileLen%16;strFileFullPath=strFileFullPath.Left(strFileFullPath.GetLength()-5);foutput=fopen(strFileFullPath,"wb");//打开解密后的文件unsignedcharinBuff[25],ouBuff[25];unsignedcharctming[4][4],ctme[4][4];for(longI=0;i<blocknum;i++){//解密16个字节fread(inBuff,1,16,finput);for(j=0;j<4;j++){for(k=0;k<4;k++){ctme[j][k]=inBuff[j*4+k];}}AES.Decrypt(ctming,ctme);//解密操作for(j=0;j<4;j++){for(k=0;k<4;k++){ouBuff[j*4+k]=ctming[j][k];}}fwrite(ouBuff,1,16,foutput);}4.2.5文件校验File:CPage3.cppMethod:CPage3::OnInitDialog()//读取右键点击的文件信息LPWSTR*szArglist=NULL;intnArgs=0;szArglist=CommandLineToArgvW(GetCommandLineW(),&nArgs);if(NULL!=szArglist){CStringpath;//获得文件路径path=szArglist[1];GetDlgItem(IDC_EDIT_FILENAME)->SetWindowText(path);//获得校验码,并显示CMD5md5;md5.update(ifstream(path));GetDlgItem(IDC_EDIT_MD5)->SetWindowText(md5.toString().c_str());}LocalFree(szArglist);//取得参数后,释放CommandLineToArgvW申请的空间4.2.6文件粉碎File:CPage3.cppMethod:CPage3::Shatter()//读取文件路径CStringpath;((CEdit*)GetDlgItem(IDC_EDIT_FILENAME))->GetWindowText(path);//读取擦写次数CStringstrNum=NULL;intnNum=0;((CEdit*)GetDlgItem(IDC_EDIT_NUM))->GetWindowText(strNum);nNum=_ttoi(strNum);//读取擦写内容intnContent=0;nContent=GetCheckedRadioButton(IDC_RADIO_NULL,IDC_RADIO_RANDOM);FILE*pf=NULL;pf=fopen(path,"r+");//获得文件大小intnSize=0;fseek(pf,0,SEEK_END);nSize=ftell(pf);fseek(pf,0,SEEK_SET);//擦写操作charch;inti=0;intj=0;for(i=0;i<nNum;i++){for(j=0;j<nSize;j++){if(nContent==IDC_RADIO_NULL){ch='\0';}else{srand((unsigned)time(NULL));ch=(char)(rand()/256);}fputc(ch,pf);}}结论本次毕业设计,设计了一款集文件加密、文件解密、文件校验和文件粉碎功能于一身的软件,文件管家。功能上满足一般用户的日常需要,能够很好的保护用户的个人数据;操作上简单,方便,大大提高了用户体验。并根据shellcode的编码原理,对软件进行了加密,降低了软件被逆向的风险,从而能够很好的保护软件的核心算法。通过本次毕业设计,使我深入的理解了AES算法的加密和解密过程,对shellcode的编码原理有了更深层次的认识。让我对软件的设计过程有了一个更好的熟悉,受益匪浅。参考文献[1]丁晨骊.文件加密解密算法研究与实现[D].上海交通大学,2009[2]何明星,林昊.AES算法原理及其实现[J].计算机应用研究,2002,(12)[3]蔡宇东,沈海斌,严晓浪.AES算法的高速实现[J].微电子学与计算机,2004,(1)[4]卜晓燕,张根耀,郭协潮.基于AES算法实现对数据的加密[J].电子设计工程,2009,(3)[5]林茂琼,李敏强,寇纪淞,熊凯.基于AES的数据加密方案[J].计算机工程[J],2002,(4)[6]陈尚义.透明文件加解密技术及其应用[J].信息安全与通信保密,2007,(11)[7]王全民,周清,刘宇明,朱二夫.文件透明加密技术研究[J].计算机技术与发展,2010,(3)[8]黄革新.Windows加密文件系统核心技术分析[J].电脑与信息技术,2005,(4)[9]JianWeng,RobertH.Deng,ShengliLiu,KefeiChen.Chosen-ciphertextsecurebidirectionalproxy re-encryptionschemeswithoutpairingsOriginalResearchArticleInformationSciences,Volume 180,Issue24,15December2010,Pages5077-5089[10]ThomasW.Shinder,DebraLittlejohnShinder,MartinGrasdal.Chapter9-DefendingYourData withtheEncryptingFileSystem.ISAServerandBeyond,2002,Pages533-576[11]AntonioIzquierdoManzanares,JoseM.SierraCamara,JoaquinTorresMarquez.Onthe implementationofsecuritypolicieswithadaptativeencryptionOriginalResearchArticleComputer Communications,Volume29,Issue15,5September2006,Pages2750-2758致谢岁月如歌,光阴似箭,四年的大学生活即将结束。经历了找工作的喧嚣与坎坷,我深深体会到了写作论文时的那份宁静与思考。回首四年的求学历程,对那些引导我、帮助我、激励我的人,我心中充满了感激。首先要感谢指导老师李丽珍副教授,论文定题到写作定稿,倾注了李老师大量的心血。在我毕业设计期间,深深受益于李老师的关心、爱护和谆谆教导。她作为老师,点拨迷津,让人如沐春风;作为长辈,关怀备至,让人感念至深。在此谨向李老师表示我最诚挚的敬意和感谢!还要感谢朱凯老师。朱老师在论文的写作中给予了许多指导与建议,谨在此表示衷心的感谢。同时,我要感谢一直关心与支持我的同学和朋友们!四年来,我们朝夕相处,共同进步,感谢你们给予我的所有关心和帮助。同窗之谊,我将终生难忘!在此要感谢我生活学习了四年的母校——太原理工大学,母校给了我一个宽阔的学习平台,让我不断吸取新知,充实自己。需要特别感谢的是我的父母。父母的养育之恩无以为报,他们是我十多年求学路上的坚强后盾,在我面临人生选择的迷茫之际,为我排忧解难,他们对我无私的爱与照顾是我不断前进的动力。外文原文1IntroductionThisstandardspecifiestheRijndaelalgorithm,asymmetricblockcipherthatcanprocessdatablocksof128bits,usingcipherkeyswithlengthsof128,192,and256bits.Rijndaelwasdesignedtohandleadditionalblocksizesandkeylengths,howevertheyarenotadoptedinthisstandard.Throughouttheremainderofthisstandard,thealgorithmspecifiedhereinwillbereferredtoas“theAESalgorithm.”Thealgorithmmaybeusedwiththethreedifferentkeylengthsindicatedabove,andthereforethesedifferent“flavors”maybereferredtoas“AES-128”,“AES-192”,and“AES-256”.Thisspecificationincludesthefollowingsections:2Definitionsofterms,acronyms,andalgorithmparameters,symbols,andfunctions;3Notationandconventionsusedinthealgorithmspecification,includingtheorderingandnumberingofbits,bytes,andwords;4Mathematicalpropertiesthatareusefulinunderstandingthealgorithm;Thestandardconcludeswithseveralappendicesthatincludestep-by-stepexamplesforKeyExpansionandtheCipher,examplevectorsfortheCipherandInverseCipher,andalistofreferences.2Definitions2.1GlossaryofTermsandAcronymsThefollowingdefinitionsareusedthroughoutthisstandard:AESAdvancedEncryptionStandardAffineAtransformationconsistingofmultiplicationbyamatrixfollowedbyransformationtheadditionofavector.ArrayAnenumeratedcollectionofidenticalentities(e.g.,anarrayofbytes).BitAbinarydigithavingavalueof0or1.BlockSequenceofbinarybitsthatcomprisetheinput,output,State,andRoundKey.Thelengthofasequenceisthenumberofbitsitcontains.Blocksarealsointerpretedasarraysofbytes.ByteAgroupofeightbitsthatistreatedeitherasasingleentityorasanarrayof8individualbits.CipherSeriesoftransformationsthatconvertsplaintexttociphertextusingtheCipherKey.CipherKeySecret,cryptographickeythatisusedbytheKeyExpansionroutinetogenerateasetofRoundKeys;canbepicturedasarectangulararrayofbytes,havingfourrowsandNkcolumns.CiphertextDataoutputfromtheCipherorinputtotheInverseCipher.InverseCipherSeriesoftransformationsthatconvertsciphertexttoplaintextusingtheCipherKey.KeyExpansionRoutineusedtogenerateaseriesofRoundKeysfromtheCipherKey.PlaintextDatainputtotheCipheroroutputfromtheInverseCipher.RijndaelCryptographicalgorithmspecifiedinthisAdvancedEncryptionStandard(AES).RoundKeyRoundkeysarevaluesderivedfromtheCipherKeyusingtheKeyExpansionroutine;theyareappliedtotheStateintheCipherandInverseCipher.StateIntermediateCipherresultthatcanbepicturedasarectangulararrayofbytes,havingfourrowsandNbcolumns.S-boxNon-linearsubstitutiontableusedinseveralbytesubstitutiontransformationsandintheKeyExpansionroutinetoperformaone-for-onesubstitutionofabytevalue.WordAgroupof32bitsthatistreatedeitherasasingleentityorasanarrayof4bytes.2.2AlgorithmParameters,Symbols,andFunctionsThefollowingalgorithmparameters,symbols,andfunctionsareusedthroughoutthisstandard:AddRoundKey() TransformationintheCipherandInverseCipherinwhichaRoundKeyisaddedtotheStateusinganXORoperation.ThelengthofaRoundKeyequalsthesizeoftheState(i.e.,forNb=4,theRoundKeylengthequals128bits/16bytes).InvMixColumns()TransformationintheInverseCipherthatistheinverseofMixColumns().InvShiftRows()TransformationintheInverseCipherthatistheinverseofShiftRows().InvSubBytes()TransformationintheInverseCipherthatistheinverseofSubBytes().KCipherKey.MixColumns()TransformationintheCipherthattakesallofthecolumnsoftheStateandmixestheirdata(independentlyofoneanother)toproducenewcolumns.NbNumberofcolumns(32-bitwords)comprisingtheState.Forthisstandard,Nb=4.Nk Numberof32-bitwordscomprisingtheCipherKey.Forthisstandard,Nk=4,6,or8.NrNumberofrounds,whichisafunctionofNkandNb(whichisfixed).Forthisstandard,Nr=10,12,or14.Rcon[] Theroundconstantwordarray.RotWord() FunctionusedintheKeyExpansionroutinethattakesafour-bytewordandperformsacyclicpermutation.ShiftRows() TransformationintheCipherthatprocessestheStatebycyclicallyshiftingthelastthreerowsoftheStatebydifferentoffsets.SubBytes()TransformationintheCipherthatprocessestheStateusinganon­linearbytesubstitutiontable(S-box)thatoperatesoneachoftheStatebytesindependently.SubWord() FunctionusedintheKeyExpansionroutinethattakesafour-byteinputwordandappliesanS-boxtoeachofthefourbytestoproduceanoutputword.XORExclusive-ORoperation.3NotationandConventions3.1InputsandOutputsTheinputandoutputfortheAESalgorithmeachconsistofsequencesof128bits(digitswithvaluesof0or1).Thesesequenceswillsometimesbereferredtoasblocksandthenumberofbitstheycontainwillbereferredtoastheirlength.TheCipherKeyfortheAESalgorithmisasequenceof128,192or256bits.Otherinput,outputandCipherKeylengthsarenotpermittedbythisstandard.Thebitswithinsuchsequenceswillbenumberedstartingatzeroandendingatonelessthanthesequencelength(blocklengthorkeylength).Thenumberiattachedtoabitisknownasitsindexandwillbeinoneoftheranges0<i<128,0<i<192or0<i<256dependingontheblocklengthandkeylength(specifiedabove).3.2BytesThebasicunitforprocessingintheAESalgorithmisabyte,asequenceofeightbitstreatedasasingleentity.Theinput,outputandCipherKeybitsequencesdescribedinSec.3.1areprocessedasarraysofbytesthatareformedbydividingthesesequencesintogroupsofeightcontiguousbitstoformarraysofbytes(seeSec.3.3).Foraninput,outputorCipherKeydenotedbya,thebytesintheresultingarraywillbereferencedusingoneofthetwoforms,anora[n],wherenwillbeinoneofthefollowingranges:Keylength=128bits,0n<16.Keylength=192bits,0n<24.Keylength=256bits,0n<32.Blocklength=128bits,0n<16.AllbytevaluesintheAESalgorithmwillbepresentedastheconcatenationofitsindividualbitvalues(0or1)betweenbracesintheorder{b7,b6,b5,b4,b3,b2,b1,b0}.Thesebytesareinterpretedasfinitefieldelementsusingapolynomialrepresentation:Forexample,{01100011}identifiesthespecificfinitefieldelementItisalsoconvenienttodenotebytevaluesusinghexadecimalnotationwitheachoftwogroupsoffourbitsbeingdenotedbyasinglecharacterasinFig.1.Hencetheelement{01100011}canberepresentedas{63},w

温馨提示

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

评论

0/150

提交评论