计算机毕业论文,毕业论文,毕业设计 毕业论文免费检测 知网论文检测
当前位置: 骆驼论文网 > 信息安全 >

基于DES加密算法的WORD加密插件

时间:2011-04-11 12:41来源: 骆驼毕业论文网 作者:admin
基于DES加密算法的WORD加密插件的实现 摘 要 随着社会发展,社会进入信息时代。信息技术和信息产业正在改变传统的生产﹑经营和生活方式,信息已成为社会发展的重要战略资源。如今,Office办公文档已是日常办公生活中不可缺少的一部分,与此同时伴随而来的信

QQ交谈计算机毕业设计,毕业设计,毕业论文,计算机毕业论文

基于DES加密算法的WORD加密插件的实现
摘  要
随着社会发展,社会进入信息时代。信息技术和信息产业正在改变传统的生产﹑经营和生活方式,信息已成为社会发展的重要战略资源。如今,Office办公文档已是日常办公生活中不可缺少的一部分,与此同时伴随而来的信息安全问题也日益突出。如何确保Word文档中的内容不被未授权的第三方所知,防止重要信息被随意改动,成为当务之急。如果在Word工具栏中添加一个加密插件,可以对文档全部内容或部分内容加密,便能有效防止信息泄漏。
本论文采用VB编写Word插件,通过采用Windows下的动态链接库技术(DLL),在VC中把DES算法封装起来做成DLL模块供VB调用,实现了开发加密插件时对加密函数的调用,提高了加密算法的效率。通过使用该插件在Word中添加的工具按键,便能简单有效地对文档内容加解密,使用户在操作WORD文档时更加方便安全。

关键词:加密插件;信息安全;COM组件;动态链接库
目  录
论文总页数:20页
1 引言 1
1.1选题背景 1
1.2选题意义 1
2理论基础 2
2.1 DES算法描述 2
2.1.1  DES算法框图 2
2.1.2  DES解密 3
2.1.3  DES算法原理 3
2.2  COM组件简介 5
2.2.1 组件 5
2.2.2 接口 6
2.2.3 创建 7
2.2.4 复用 8
2.3  插件简介 8
3 需求分析和方案设计 8
3.1 需求分析 8
3.1.1功能需求 8
3.1.2 开发环境 9
3.2 方案设计 10
4 程序的实现 10
4.1  VC建立DES算法模块 10
4.1.1 加密导出函数的定义 11
4.1.2解密导出函数的定义 11
4.1.3加解密相关函数的声名 11
4.2  VB编写WORD插件 12
4.2.1建立Word插件工程 12
4.2.2 Word代码的编写 14
5 测试 16
结    论 17
参考文献 18
致    谢 19
声    明 20
 
2理论基础
2.1 DES算法描述
2.1.1  DES算法框图
DES对64(bit)位的明文分组M进行操作,M经过一个初始置换IP置换成m0,将m0明文分成左半部分和右半部分m0=(L0,R0),各32位长。然后进行16轮完全相同的运算,这些运算被称为函数f,在运算过程中数据与密匙结合。经过16轮后,左,右半部分合在一起经过一个末置换。
    在每一轮中,密匙位移位,然后再从密匙的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位,并通过一个异或操作替代成新的32位数据,在将其置换换一次。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,其结果成为新的右半部分,原来的右半部分成为新的左半部分。将该操作重复16次,就实现了。具体如图1所示:

 
图1 DES算法框图
2.1.2  DES解密
    加密和解密使用相同的算法。
    DES加密和解密唯一的不同是密匙的次序相反。如果各轮加密密匙分别是K1,K2,K3….K16那么解密密匙就是K16,K15,K14…K1。
2.1.3  DES算法原理
(1)处理密钥:
从用户处获得64位密钥.(每第8位为校验位,为使密钥有正确的奇偶校验,每个密钥要有奇数个"1"位.(本文如未特指,均指二进制位)
(2)具体过程:
对密钥实施变换,使得变换以后的密钥的各个位与原密钥位对应关系如下表所示:
57 49 41 33 25 17 9 1 58 50 42 34 26 18
10 2 59 51 43 35 27 19 11 3 60 52 44 36
63 55 47 39 31 23 15 7 62 54 49 38 30 22
14 6 61 53 45 37 29 21 13 5 28 20 12 4
把变换后的密钥等分成两部分,前28位记为C[0],后28位记为D[0].
计算子密钥(共16个), 从i=1开始。
分别对C[i-1],D[i-1]作循环左移来生成C[i],D[i].(共16次)。
每次循环左移位数如下表所示:
轮 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
位数 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1

串联C[i],D[i],得到一个56位数,然后对此数
作如下变换以产生48位子密钥K[i]。
变换过程如下:
14 17 11 24 1 5 3 28 15 6 21 10
23 19 12 4 26 8 16 7 27 20 13 2
41 52 31 37 47 55 30 40 51 45 33 48
44 49 39 56 34 53 46 42 50 36 29 32

按以上方法计算出16个子密钥。
对64位数据块的处理:
把数据分成64位的数据块,不够64位的以适当的方式填补。
对数据块作变换。
58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4
62 54 46 38 30 22 14 6 64 56 48 40 32 24 16 8
57 49 41 33 25 17 9 1 59 51 43 35 27 19 11 3
61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7

将变换后的数据块等分成前后两部分,前32位记为L[0],后32位记为R[0]。
用16个子密钥对数据加密。
根据下面的扩冲函数E,扩展32位的成48位
32 1 2 3 4 5 4 5 6 7 8 9
8 9 10 11 12 13 12 13 14 15 16 17
16 17 18 19 20 21 20 21 22 23 24 25
24 25 26 27 28 29 28 29 30 31 32 1
用E{R[i-1]}与K[i]作异或运算。
把所得的48位数分成8个6位数。1-6位为B[1],7-12位为B[2],... 43-48位为B[8]。
用S密箱里的值替换B[j]。从j=1开始。S密箱里的值为4位数,共8个S密箱.
取出B[j]的第1和第6位串联起来成一个2位数,记为m.m即是S密箱里用来替换B[j]的数所在的列数。
取出B[j]的第2至第5位串联起来成一个4位数,记为n。n即是S密箱里用来替换B[j]的数所在的行数。
用S密箱里的值S[j][ m][ n]替换B[j]。8个S密箱如下所示:
S-BOXE:S1
Binary d1d6 =>; 00 01 10 11
\/ d2..d5 \/ Dec 0 1 2 3
………..
1100 12 5 0 15 3
1101 13 0 14 3 5
1110 14 12 9 5 6
1111 15 7 2 8 11
返回第一步直至8个数据块都被替换。
把B[1]至B[8]顺序串联起来得到一个32位数。对这个数做如下变换:
bit goes to bit bit goes to bit
16 1 2 17
7 2 8 18
20 3 24 19
21 4 14 20
29 5 32 21
12 6 27 22
28 7 3 23
17 8 9 24
1 9 19 25
15 10 13 26
23 11 30 27
26 12 6 28
5 13 22 29
18 14 11 30
31 15 4 31
10 16 25 32
把得到的结果与L[i-1]作异或运算。把计算结果賦给R[i]。
把R[i-1]的值賦给L[i]。
从a循环执行,直到K[16]也被用到。
把R[16]和L[16] 顺序串联起来得到一个64位数。对这个数实施II变换的逆变换。
以上就是DES算法如何加密一段64位数据块。解密时用同样的过程,只需把16个子密钥的顺序颠倒过来,应用的顺序为K[16],K[15],K[14],...K[1]。

2.2.2 接口
对于COM来讲,接口是一个包含一个函数指针数组的内存结构。每一个数组元素包含的是一个由组件所实现的函数地址。对于COM而言,接口就是此内存结构,其他东西;均是COM不关心的实现细节。
在C++中,可以用抽象基类来实现COM接口。由于一个COM组件可以实现支持任意数目的接口,因此对于这样的组件,可以用抽象基类的多重继承来实现。用类来实现组件将比其他方法更为容易。
对于客户来说,一个组件就是一个接口集。客户只能通过接口才能和COM组件打交道。从整体上讲,客户对于一个组件可以说是知之甚少的。通常情况下,客户甚至不必知道一个组件所提供的所有接口。
客户同组件的交互是通过接口完成的。在客户查询组件其他的接口时,也是通过接口完成的。这个接口就是IUnknown。Iunknown接口的定义包含在Win32 SDK中的UNKNOWN.H的头文件中,引用如下:
interface IUnknown
{
virtual HRESULT-_ _stdcall QueryInterface(const IID& iid,void **ppv)=0;
virtual ULONG_ _stdcall AddRef()=0;
virtual ULONG_ _Release()=0;
};
所有的COM都要继承IUnknown。可以用Iunknown的接口指针来查询该组件的其他的接口,并且每个接口的vtbl中的前三个函数都是QueryInterface,AddRef和Release。这使得所有的COM接口都可以被当作成IUnknown接口来处理。由于所有的接口都支持QueryInterface,因此组件的任何一个接口都可以被客户用来获取它所支持的其他接口。
在用QueryInterface将组件抽象成由多个相互独立的接口构成的集合后,还需要管理组件的生命期。这一点是通过对接口的引用计数实现的。客户并不能直接控制组件的生命期。当使用完一个接口而要用组件的另一个接口时,是不能将改组件释放的。对组件的释放可以由组件在客户使用完所有的组件之后自己完成。IUnknown的另外两个成员函数AddRef和Release的作用就是给客户提供一种让它指示何时处理完一个接口的手段。
AddRef和Release实现的是一种名为引用技术的内存管理技术。当客户从组件获得一个接口时,此引用计数值将增1。当客户使用完某个接口时,组件的引用计数值将减1,当引用计数值为0时,组件可以将自己从内存中删除。AddRef和Release可以增加和减少这一计数值。
2.2.3 创建
将组件分成多个接口只是将单模应用分个成多个部分的第一步,组件需要被放入动态链接库(DLL)中。DLL是一个组件服务程序,或者说是发行组件的一种方式。组件实际上应看成是在DLL中实现的接口集。在客户获取某个组件接口指针之前,它必须先将相应的DLL装载到其进程空间中,并创建此组件。
由于客户组件所需要的所有函数都可以通过某个接口指针而访问到,因此,可以在DLL中引出CreatInstance函数就可以使用户调用它。之后,可以装载DLL并调用其中的函数。此功能可由COM库函数CoCreateInstance来实现。CoCreateInstance创建组件的过程是:传给它一个CLSID,然后它创建相应的组件,并返回指向所请求的接口的指针。但CoCreateInstance没有给客户提供一种能控制组件创建过程的方法,缺乏一定的灵活性。事实上,常用类厂来创建组件。类厂就是一个带有能够创建其他组件的接口的组件。客户先创建类厂本身,然后再用一个接口(如IClassFactory)来创建所需的组件。然后还要用DllRegisterSever在Windows中注册这个组件。

2.2.4 复用
COM组件可以被复用,它支持“接口继承”。这种继承指的是一个类继承其基类的类型或接口。抽象基类是一种最纯粹的接口继承,并且正好也被用来实现COM接口。在COM中,我们可以用包容和聚合来对组件进行改造。
包容是在接口级完成的。外部组件包含指向内部接口的指针。此时,外部组件仅仅是内部组件的一个客户而已,它将使用内部组件的接口来实现它自己的接口。外部组件也可以通过将调用转发给内部组件的方法来重新实现内部组件所支持的某个接口。并且外部组件还可以在内部组件代码的前后加上一些代码以对接口进行改造。
聚合是包含的一种变化形式。当外部组件聚合了某个内部组件的一个接口时,它并没有象包容那样重新实现此接口并显式的将调用请求转发给内部组件。相反,外部组件直接把内部组件的接口指针返回给客户。使用这种方法,外部组件将无需重新实现并转发接口中的所有函数了。
包容和聚合为实现组件的复用提供了一种极具鲁棒性的机制。在组件构架下,客户于组件的实现完全隔离开了。

参考文献
[1] 徐景周(译),Office2000下内部COM插件的编程实现 [M].北京:清华大学出版社,2002
[2] 曹天杰,张永平,苏成.计算机系统安全[M].2003
[3] 微软公司,VB部件工具 [M] .1997年
[4] 黄晓东,Visual C++6.0 Internet 开发指南. [M].北京:清华大学出版社,2000
[5] 赵德奎,Visual C++6.0 开发与实例. [M].北京:电子工业出版社,1999
[6] 冯延晖,刘晓铭,赵淦森,王泳. COM+编程[M].2002年11月
[7] 刘宗田等译.Bruce Eckel, Thinking in C++(C++ 编程思想)[M].机械工业出版社,2000
[8] 罗朝盛.Visual Basic 6.0程序设计实践指导[M]. 浙江科学技术出版社,2002

 

本文内容只是论文部分简介,如需了解更多详情请咨询本站客服! QQ交谈计算机毕业设计,毕业设计,工程硕士论文,计算机毕业论文
毕业论文搜集整理:毕业论文网 计算机毕业设计 计算机毕业论文 毕业设计


顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
计算机毕业设计
计算机毕业论文
论文发表