版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于des加密算法的word加密插件的实现摘 要随着社会发展,社会进入信息时代。信息技术和信息产业正在改变传统的生产经营和生活方式,信息已成为社会发展的重要战略资源。如今,office办公文档已是日常办公生活中不可缺少的一部分,与此同时伴随而来的信息安全问题也日益突出。如何确保word文档中的内容不被未授权的第三方所知,防止重要信息被随意改动,成为当务之急。如果在word工具栏中添加一个加密插件,可以对文档全部内容或部分内容加密,便能有效防止信息泄漏。本论文采用vb编写word插件,通过采用windows下的动态链接库技术(dll),在vc中把des算法封装起来做成dll模块供vb调用,实现了
2、开发加密插件时对加密函数的调用,提高了加密算法的效率。通过使用该插件在word中添加的工具按键,便能简单有效地对文档内容加解密,使用户在操作word文档时更加方便安全。关键词:加密插件;信息安全;com组件;动态链接库目 录论文总页数:20页 引言1.1选题背景 des是data encryption standard(数据加密标准)的缩写。它是由ibm公司研制的一种加密算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密标准,二十多年来,它一直活跃在国际保密通信的舞台上,扮演了十分重要的角色。 des是一个分组加密算法,他以64位为分组对数据加密。同时des也是一个对称算法:
3、加密和解密用的是同一个算法。它的密匙长度是56位(因为每个第8 位都用作奇偶校验),密匙可以是任意的56位的数,而且可以任意时候改变。其中有极少量的数被认为是弱密匙,但是很容易避开他们。所以保密性依赖于密钥。按照组件化的程序设计的思想,复杂的应用程序被设计成一些小的,功能单一的组件模块,这些组件模块可以运行在同一台机器上,也可以运行在不同的机器上。为了实现这样的应用软件,组件程序和组件程序之间需要一些极为细致的规范,只有组件程序遵守了这些共同的规范,然间系统才能正常运行。为此,omg和microsoft分别提出了corba(common object request breaker archi
4、tecture)和com(component object model)标准,目前corba模型主要应用于unix操作系统平台上,而com 则主要应用于microsoft windows操作系统平台上。 在com标准中,一个组件程序也被称为一个模块,它可以是一个动态连接库(dll), 被称为进程内组件(in-of-process component),也可以是一个可执行程序(exe),被称为进程外组件(out-of-process component)。com对象是建立在二进制可执行代码级的基础上,而c+等语言中的对象是建立在源代码级基础上的,因此com对象是语言无关的。这一特性使用不同编程语
5、言开发的组件对象进行交互成为可能。在microsoft windows系统平台上,com技术被应用于系统的各个层次,从底层的com对象管理到上层的应用程序交互都用到了com标准。1.2选题意义word是当今非常流行的一款字处理软件,是装机的必备程序。但随之而来的信息安全问题也收到普遍关注。为了防止信息财产被故意或偶然地非授权泄漏,保护用户的利益和隐私,有必要对文档进行加密。目前word文档可以通过设置密码来决定用户是否有打开文档的权限,从而保护文档信息安全。这样是对整个文件的操作,并且必须要有密码配合。我们可以通过一个插件对文档内容加解密,这样使用起来更加简单方便。2理论基础2.1 des算法
6、描述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的输出与左半部分结合,其结果成为新的右半部分,原来的右半部分成为新的左半部
7、分。将该操作重复16次,就实现了。具体如图1所示:商业源代码,全套计算机毕业设计免费下载 更多全套设计联系qq:1042897696最新设计大全 图1 des算法框图2.1.2 des解密 加密和解密使用相同的算法。 des加密和解密唯一的不同是密匙的次序相反。如果各轮加密密匙分别是k1,k2,k3.k16那么解密密匙就是k16,k15,k14k1。2.1.3 des算法原理(1)处理密钥:从用户处获得64位密钥.(每第8位为校验位,为使密钥有正确的奇偶校验,每个密钥要有奇数个1位.(本文如未特指,均指二进制位)(2)具体过程:对密钥实施变换,使得变换以后的密钥的各个位与原密钥位对应关系如下表
8、所示:57 49 41 33 25 17 9 1 58 50 42 34 26 1810 2 59 51 43 35 27 19 11 3 60 52 44 3663 55 47 39 31 23 15 7 62 54 49 38 30 2214 6 61 53 45 37 29 21 13 5 28 20 12 4把变换后的密钥等分成两部分,前28位记为c0,后28位记为d0.计算子密钥(共16个), 从i=1开始。分别对ci-1,di-1作循环左移来生成ci,di.(共16次)。每次循环左移位数如下表所示:轮 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16位数
9、 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1串联ci,di,得到一个56位数,然后对此数作如下变换以产生48位子密钥ki。变换过程如下:14 17 11 24 1 5 3 28 15 6 21 1023 19 12 4 26 8 16 7 27 20 13 241 52 31 37 47 55 30 40 51 45 33 4844 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
10、 44 36 28 20 12 462 54 46 38 30 22 14 6 64 56 48 40 32 24 16 857 49 41 33 25 17 9 1 59 51 43 35 27 19 11 361 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7将变换后的数据块等分成前后两部分,前32位记为l0,后32位记为r0。用16个子密钥对数据加密。根据下面的扩冲函数e,扩展32位的成48位32 1 2 3 4 5 4 5 6 7 8 98 9 10 11 12 13 12 13 14 15 16 1716 17 18 19 20 21 20 21
11、 22 23 24 2524 25 26 27 28 29 28 29 30 31 32 1用eri-1与ki作异或运算。把所得的48位数分成8个6位数。1-6位为b1,7-12位为b2,. 43-48位为b8。用s密箱里的值替换bj。从j=1开始。s密箱里的值为4位数,共8个s密箱.取出bj的第1和第6位串联起来成一个2位数,记为m.m即是s密箱里用来替换bj的数所在的列数。取出bj的第2至第5位串联起来成一个4位数,记为n。n即是s密箱里用来替换bj的数所在的行数。用s密箱里的值sj m n替换bj。8个s密箱如下所示:s-boxe:s1binary d1d6 =; 00 01 10 11
12、/ d2.d5 / dec 0 1 2 3.1100 12 5 0 15 31101 13 0 14 3 51110 14 12 9 5 61111 15 7 2 8 11返回第一步直至8个数据块都被替换。把b1至b8顺序串联起来得到一个32位数。对这个数做如下变换:bit goes to bit bit goes to bit16 1 2 177 2 8 1820 3 24 1921 4 14 2029 5 32 2112 6 27 2228 7 3 2317 8 9 241 9 19 2515 10 13 2623 11 30 2726 12 6 285 13 22 2918 14 11
13、3031 15 4 3110 16 25 32把得到的结果与li-1作异或运算。把计算结果賦给ri。把ri-1的值賦给li。从a循环执行,直到k16也被用到。把r16和l16 顺序串联起来得到一个64位数。对这个数实施ii变换的逆变换。以上就是des算法如何加密一段64位数据块。解密时用同样的过程,只需把16个子密钥的顺序颠倒过来,应用的顺序为k16,k15,k14,.k1。 2.2 com组件简介2.2.1 组件com,是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在com构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复
14、杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;com与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块;等等。 com是开发软件组件的一种方法。组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统以及其他组件提供服务。开发自定义的com组件就如同开发动态的,面向对象的api。多个com对象可以连接起来形成应用程序或组件系统。并且组件可以在运行时刻,在不被重新链接或编译应用程序的情况下被卸下或替换掉。microsoft的许多
15、技术,如activex, directx以及ole等都是基于com而建立起来的。并且microsoft的开发人员也大量使用com组件来定制他们的应用程序及操作系统。com所含的概念并不止是在microsoft windows操作系统下才有效。com并不是一个大的api,它实际上象结构化编程及面向对象编程方法那样,也是一种编程方法。在任何一种操作系统中,开发人员均可以遵循“com方法”。一个应用程序通常使由单个的二进制文件组成的。当编译器生成应用程序之后,在对下一个版本重新编译并发行新生成的版本之前,应用程序一般不会发生任何变化。操作系统,硬件及客户需求的改变都必须等到整个应用程序被重新生成。目
16、前这种状况已经发生变化。开发人员开始将单个的应用程序分隔成单独多个独立的部分,也既组件。这种做法的好处是可以随着技术的不断发展而用新的组件取代以有的组件。此时的应用程序可以随新组件不断取代旧的组件而渐趋完善。而且利用已有的组件,用户还可以快速的建立全新的应用。传统的做法是将应用程序分割成文件,模块或类,然后将它们编译并链接成一个单模应用程序。它与组件建立应用程序的过程(称为组件构架)有很大的不同。一个组件同一个微型应用程序类似,即都是已经编译链接好并可以使用的二进制代码,应用程序就是由多个这样的组件打包而得到的。单模应用程序只有一个二进制代码模块。自定义组件可以在运行时刻同其他的组件连接起来以
17、构成某个应用程序。在需要对应用程序进行修改或改进时,只需要将构成此应用程序的组件中的某个用新的版本替换掉即可。com,即组件对象模型,是关于如何建立组件以及如何通过组件建立应用程序的一个规范,说明了如何可动态交替更新组件。2.2.2 接口对于com来讲,接口是一个包含一个函数指针数组的内存结构。每一个数组元素包含的是一个由组件所实现的函数地址。对于com而言,接口就是此内存结构,其他东西;均是com不关心的实现细节。在c+中,可以用抽象基类来实现com接口。由于一个com组件可以实现支持任意数目的接口,因此对于这样的组件,可以用抽象基类的多重继承来实现。用类来实现组件将比其他方法更为容易。对于
18、客户来说,一个组件就是一个接口集。客户只能通过接口才能和com组件打交道。从整体上讲,客户对于一个组件可以说是知之甚少的。通常情况下,客户甚至不必知道一个组件所提供的所有接口。客户同组件的交互是通过接口完成的。在客户查询组件其他的接口时,也是通过接口完成的。这个接口就是iunknown。iunknown接口的定义包含在win32 sdk中的unknown.h的头文件中,引用如下:interface iunknownvirtual hresult-_ _stdcall queryinterface(const iid& iid,void *ppv)=0;virtual ulong_ _stdca
19、ll addref()=0;virtual ulong_ _release()=0;所有的com都要继承iunknown。可以用iunknown的接口指针来查询该组件的其他的接口,并且每个接口的vtbl中的前三个函数都是queryinterface,addref和release。这使得所有的com接口都可以被当作成iunknown接口来处理。由于所有的接口都支持queryinterface,因此组件的任何一个接口都可以被客户用来获取它所支持的其他接口。在用queryinterface将组件抽象成由多个相互独立的接口构成的集合后,还需要管理组件的生命期。这一点是通过对接口的引用计数实现的。客户并
20、不能直接控制组件的生命期。当使用完一个接口而要用组件的另一个接口时,是不能将改组件释放的。对组件的释放可以由组件在客户使用完所有的组件之后自己完成。iunknown的另外两个成员函数addref和release的作用就是给客户提供一种让它指示何时处理完一个接口的手段。addref和release实现的是一种名为引用技术的内存管理技术。当客户从组件获得一个接口时,此引用计数值将增1。当客户使用完某个接口时,组件的引用计数值将减1,当引用计数值为0时,组件可以将自己从内存中删除。addref和release可以增加和减少这一计数值。2.2.3 创建将组件分成多个接口只是将单模应用分个成多个部分的第
21、一步,组件需要被放入动态链接库(dll)中。dll是一个组件服务程序,或者说是发行组件的一种方式。组件实际上应看成是在dll中实现的接口集。在客户获取某个组件接口指针之前,它必须先将相应的dll装载到其进程空间中,并创建此组件。由于客户组件所需要的所有函数都可以通过某个接口指针而访问到,因此,可以在dll中引出creatinstance函数就可以使用户调用它。之后,可以装载dll并调用其中的函数。此功能可由com库函数cocreateinstance来实现。cocreateinstance创建组件的过程是:传给它一个clsid,然后它创建相应的组件,并返回指向所请求的接口的指针。但cocrea
22、teinstance没有给客户提供一种能控制组件创建过程的方法,缺乏一定的灵活性。事实上,常用类厂来创建组件。类厂就是一个带有能够创建其他组件的接口的组件。客户先创建类厂本身,然后再用一个接口(如iclassfactory)来创建所需的组件。然后还要用dllregistersever在windows中注册这个组件。2.2.4 复用com组件可以被复用,它支持“接口继承”。这种继承指的是一个类继承其基类的类型或接口。抽象基类是一种最纯粹的接口继承,并且正好也被用来实现com接口。在com中,我们可以用包容和聚合来对组件进行改造。包容是在接口级完成的。外部组件包含指向内部接口的指针。此时,外部组件
23、仅仅是内部组件的一个客户而已,它将使用内部组件的接口来实现它自己的接口。外部组件也可以通过将调用转发给内部组件的方法来重新实现内部组件所支持的某个接口。并且外部组件还可以在内部组件代码的前后加上一些代码以对接口进行改造。聚合是包含的一种变化形式。当外部组件聚合了某个内部组件的一个接口时,它并没有象包容那样重新实现此接口并显式的将调用请求转发给内部组件。相反,外部组件直接把内部组件的接口指针返回给客户。使用这种方法,外部组件将无需重新实现并转发接口中的所有函数了。包容和聚合为实现组件的复用提供了一种极具鲁棒性的机制。在组件构架下,客户于组件的实现完全隔离开了。2.3 插件简介插件是一类特殊的组件
24、。它的目的不是为一般应用程序使用,而是专为特定的应用程序使用。插件一般在宿主应用程序上添加控制项,如菜单、工具按键等。插件响应宿主程序中对这些项目的操作,并对宿主程序中的数据进行特定操作。3 需求分析和方案设计3.1 需求分析 3.1.1功能需求用户在编辑完文档后可以选择把文档全部内容或部分内容加密生成密文,同样点击插件中的解密按纽可以把密文还原为明文。 系统功能流程图见图2:y用户是否要求加密des加密word内容word是否被des加密des解密word内容保存word内容nyn图2 系统功能流程图3.1.2 开发环境本插件在word2003下开发,可以在windows2000/2003/
25、xp等操作系统下运行。开发环境配置表,如表1:表1系统配置表pc硬件处理器:intel pii 450 或更好内 存:256 m 或更大硬 盘:20 g 或更大软件microsoft windows nt server 4.0 或更高版本microsoft office 20033.2 方案设计此功能的实现包括了des算法的实现和插件的实现。可以用vb编写word插件, vb以其开发的易学好用和强大的用户界面设计能力倍受程序员的青睐,是微软公司推出的开发windows应用程序的主力平台之一。但其不能直接对寄存器进行操作,没有直接的输入输出端口操作语句,考虑到des算法的效率与实现等问题,必须借
26、助其他编程语言,而c/c+语言具备较高的运行效率,所以可以通过在vc环境下编写出高效的des算法代码的动态链接库(dll),然后在vb中调用。加密worddes算法模块运行加密插件word内容加密解密调用des加密模块调用des解密模块word内容解密图3 系统设计流程图4 程序的实现4.1 vc建立des算法模块新建win32动态库工程,如下图所示:图4 建立win32动态库工程4.1.1 加密导出函数的定义void _stdcall encode(char *sinput, char *soutput) /sinput输入字符串,soutput输出字符串char buf1024; /定义1
27、024字节的缓冲变量memset(buf, 0x00, sizeof(buf); /缓冲区清零des_go(buf, sinput, sizeof(sinput), key, sizeof(key), encrypt); /加密函数strcpy(soutput,buf);/将加密后的字符串输出4.1.2解密导出函数的定义void _stdcall decode(char *sinput, char *soutput) /sinput输入字符串,soutput输出字符串char buf1024; /定义1024字节的缓冲变量memset(buf, 0x00, sizeof(buf); /缓冲区清
28、零des_go(buf, sinput, sizeof(sinput), key, sizeof(key), decrypt); /解密函数strcpy(soutput,buf); /将加密后的字符串输出4.1.3加解密相关函数的声名typedef bool (*psubkey)1648;static void des(char out8, char in8, const psubkey psubkey, bool type);/标准des加/解密static void setkey(const char* key, int len);/ 设置密钥static void setsubkey(p
29、subkey psubkey, const char key8);/设置子密钥static void f_func(bool in32, const bool ki48);/ f 函数static void s_func(bool out32, const bool in48);/ s 盒代替static void transform(bool *out, bool *in, const char *table, int len);/ 变换static void xor(bool *ina, const bool *inb, int len);/ 异或static void rotatel(b
30、ool *in, int len, int loop);/ 循环左移static void bytetobit(bool *out, const char *in, int bits);/字节组转换成位组static void bittobyte(char *out, const bool *in, int bits);/位组转换成字节组static bool subkey21648;/ 16圈子密钥static bool is3des;/ 3次des标志static char tmp256, deskey16;4.2 vb编写word插件4.2.1建立word插件工程(1)创建“外接程序”工
31、程,如图5:图5 vb中新建工程图(2) 打开“设计器”中的connect设计器。双击该connect的图标,如图6:图6 工程项目图修改其中的工程名和应用程序。其中,“应用程序”选择该插件是针对哪个具体的应用程序的。这里选word。(3)添加对word类型库的引用,如图7图7 工程引用图系统缺省添加了对office类型库的引用。但由于开发的是word插件,因此需要存取word中的对象。所有必须添加对word的引用。(4)打开该设计器的代码窗口。设计器的代码就是插件接口方法的实现。1)删除系统缺省添加的代码。系统缺省添加的代码是针对vb插件的,而不是word或其它应用程序插件的。因此删除它们。
32、2)添加addininstance对象的onconnection方法。addininstance就代表了该插件本身。(5) 调试设置该工程的属性,将“调试”中的启动程序设置为系统中安装的winword.exe。图8 工程属性图此后,可以设置断点,运行。采用标准vb中的调试方法调试程序。(6) 安装1)生成dll后,自动在本机注册该插件。本机以后就可以使用了。2)在其它机器安装:将dll拷贝到system32目录(其它目录也可以)运行:regsvr32 dll文件全路径(system32目录不用路径)3)删除运行:regsvr32 -u dll文件全路径(system32目录不用路径)4.2.2
33、 word代码的编写(1) api函数声明使用api文本浏览器贴入的winapi函数声明private declare function openclipboard lib user32 (byval hwnd as long) as long 声明打开剪贴板函数private declare function closeclipboard lib user32 () as long 声明关闭剪贴板函数private declare function emptyclipboard lib user32 () as long 声明清除剪贴板函数private declare function s
34、etclipboarddata lib user32 (byval wformat as long, byval hmem as long) as long 声明剪贴板赋值函数private declare sub encode lib dll (byval sinput as string, byval soutput as string) 加密函数的声明private declare sub decode lib dll (byval sinput as string, byval soutput as string) 解密函数的声明private const cf_bitmap = 2p
35、rivate mappword as word.applicationprivate mbar as office.commandbar使用withevents声明,可以定义mbtn1,mbtn2的事件响应程序private withevents mbtn1 as office.commandbarbuttonprivate withevents mbtn2 as office.commandbarbutton(2)添加工具栏加密解密按钮private sub addininstance_onconnection(byval application as object, byval conne
36、ctmode as addindesignerobjects.ext_connectmode, byval addininst as object, custom() as variant) set mappword = application set mbar = mappword.commandbars.add(my toolbar for vb, , , true) set mbtn1 = mbar.controls.add(office.msocontroltype.msocontrolbutton)添加mbtn按钮的事件 set mbtn2 = mbar.controls.add(o
37、ffice.msocontroltype.msocontrolbutton)添加mbtn2按钮的事件 setbuttonstyle mbtn1, 203, 加密, encode, msobuttoniconandcaption 定义加密按钮 setbuttonstyle mbtn2, 203, 解密, decode, msobuttoniconandcaption 定义解密按钮end sub(3)定义按钮风格private sub setbuttonstyle(btn as office.commandbarbutton, idpic as long, scaption as string,
38、stooltip as string, btnstyle as msobuttonstyle) 设置按键图标 这里需要使用winapi函数,见最上面的函数声明(使用开始菜单中”microsoft visual basic api 文本浏览器”选择和粘贴 dim bmp as ipicturedisp set bmp = loadrespicture(203, vbresbitmap) vb加载资源的方法 if not bmp is nothing then openclipboard 0 emptyclipboard setclipboarddata cf_bitmap, bmp.handle
39、 closeclipboard btn.pasteface end if 设置按键文本 btn.caption = scaption 设置按键的tooltip帮助信息 btn.tooltiptext = stooltip 显示按键 btn.visible = true 设置按键风格 btn.style = btnstyle 设置按键为允许 btn.enabled = trueend sub(4)加密按钮事件private sub mbtn1_click(byval ctrl as office.commandbarbutton, canceldefault as boolean) 操作word对象dim doc as word.document 取word当前活动文档 set doc = mappword.activedocument dim para as word.range dim temp as string * 1024 分配1024个字节缓冲区 set para = doc.range encode para.text, temp 文档加密 para.text = temp 设置该段的颜色 para.font.co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年广东省深圳市33校联考中考英语三模试卷
- 上海市市辖区(2024年-2025年小学五年级语文)人教版质量测试(上学期)试卷及答案
- 一年级数学计算题专项练习集锦
- 江苏省南通市2024-2025学年七年级上学期期中英语试卷(含答案解析)
- 圆珠笔产业运行及前景预测报告
- 人工草坪产业深度调研及未来发展现状趋势
- 实验室用血液和血液成分过滤器产业运行及前景预测报告
- 化妆用防晒乳液产业深度调研及未来发展现状趋势
- 儿童帽产品供应链分析
- 干燥装置和设备市场发展预测和趋势分析
- 二年级群文阅读:读:童话中的不可思议-课件
- 《向世界最好的医院学管理》读书报告课件
- Citect软件培训教程课件
- 产品质量法-产品质量法课件
- 水资源管理知识竞赛参考题(100题)
- pressfit设计高级技巧课件
- 四年级上册道德与法治4《少让父母为我操心》教学反思三篇
- 能力陷阱分享模板课件
- 护理工作中的语言沟通课件
- 冲击钻施工工艺及步骤
- 小学二年级数学德育渗透教案范文
评论
0/150
提交评论