欢迎来到千学网!
您现在的位置:首页 > 实用文 > 合同

HMAC认证协议的单片机实现

时间:2023-10-01 07:37:16 合同 收藏本文 下载本文

下面是小编为大家整理的HMAC认证协议的单片机实现,本文共5篇,欢迎大家借鉴与参考,希望对大家有所帮助。

HMAC认证协议的单片机实现

篇1:HMAC认证协议的单片机实现

摘要:HMAC是一种基于密钥的Hash算法的认证协议,可以应用于电子商务领域。我们通过国有自主知识产权的单片机ZQ032SA,实现了以MD5算法为核心的HMAC协议,并把它调用于IP电话计费认证系统。

关键词:HMACZQ032SA(6805)MD5IP电话

引言

在开放的通信和计算机系统中,建立安全可靠的电子商务平台是十分重要的。通常需要通过加密的方法对客户的有关信息,如密码、合同等加以保护,使之不被盗取或篡改。当客户提出服务申请时,必须对客户身份的合法性、报文的完整性进行确认。

HMAC(Keyed-HashingforMessageAuthentication)是一个公开的协议。它是一种基于密钥的报文完整性的验证方法,其安全性是建立在Hash算法基础上的。它要求通信双方共享密钥、约定算法、对报文进行Hash运算,如MD5、SHA、RIPEMD等,形成固定长度的认证码。通信双方通过认证码的校验来确定报文的合法性。这个协议可以用来作加密、数字签名、报文验证等。

利用HMAC协议可以建立一个身份认证的电子商务平台,客户和服务端双方需要预先约定唯一的公钥和加密算法;客户单方面保留自己密码作为密钥,服务端只保留公钥和认证码。这个认证码是密钥经HMAC协议加密得到定长码字。当客户提出服务申请时,应提交钥和密钥的认证码。服务端通过公钥确认客户的基本身份,再检验认证码确定客户的合法性。这样,客户的私密信息在服务端、传输媒介中都是加密隐藏的。

我们利用服务器建立了服务端的模拟用户数据库,单片机实现客户端的加密算法,电话线作为传输介质,实现了HMAC协议在IP电话计费系统中的应用。

1HMAC的算法原理

1.1HMAC算法定义

用公式表示如下:

HMAC=H(keyxoropad,H(keyxoripad,text))

H(X,Y)代表对X+Y的消息进行一种Hash运算;

ipad代表重复B次的单字节十六进制常数0x36;

opad代表重复B次的单字节十六进行常数0x5c;

key代表64字节的字符串,由密钥组成,不足的补0;

text代表任意长度文本。

密钥≥L字节。当大于B时,先经Hash计算形成L字节的秘钥(B是Hash算法中一次迭代运算的数据块字节数;L是Hash算法形成报文摘要的字节数)。

HMAC协议定义了迭代两次的Hash加密算法,最终形成报文摘要(DIGEST)值就是认证码。基于算法的可靠性、安全性和易于计算机实现特性,先用Hash中的MD5算法实现HMAC,其B=64,L=16.

1.2MD5算法定义

MD5算法以对任意长度消息多次循环迭代的散列运算,最终形成16Byte报文摘要。这个摘要对文本具有唯一性,可作为认证码。在目标计算机的计算速度下,这个摘要是难于破解的。

(1)报文填充

MD5算法要求对任意长度报文进行填充,构成N×64Byte消息分组,N为整数。其中每一分组又划分为16个4字节子分组。

填充数据分2步。首先,填充使得数据位长度恰好为(N×64-8)Byte的数,即在报文有效数据后补1个0x1,其它补0x0至满足上述要求。然后,再后补上8字节(64位)的报文数据长度(填充前字节数)。这样,数据就被填充为64Byte(512bit)的整数倍。

(2)初始化MD5参数

4个4字节位变量(A、B、C、D)用来作为报文摘要的初始值:

A=0x01234567

B=0x89abcdef

C=0xfedcba98

D=0x76543210

(3)算法

MD5算法是对消息分组依次迭代算法。第1次运算的初始值为ABCD,以后每一次迭代运算的结果都替换ABCD作为下一次的初始值,共经过N次的迭代运算,就得到该消息的报文摘要,如图1所示。

对每一消息分组的运算方法是相同的。首先把初始值ABCD放入变量abcd,然后进行4轮相似的运算变换,每轮包含16次操作。每次操作对其中的3个变量(4字节)bcd做1次非线性运算,将其结果加上变量a,一个消息子分组Mi,一个常数Ti;将所得结果向环移一个不定的数Si,再加变量b,然后用该结果取代变量a,变换abcd<=dabc,进入下一次运算,共16次,如图2所示。4轮运算结束后,把变量abcd与初始ABCD进行“异或”运算,结果作为下一分组的初始值。

计算公式如下:

第1轮:SUB_FF(a,b,c,d,Mi,Si,Ti):a<=b+((a+F(b,c,d)+Mi+Ti)<<

第2轮:SUB_GG(a,b,c,d,Mi,Si,Ti):a<=b+((a+G(b,c,d)+Mi+Ti)<<

第3轮:SUB_HH(a,b,c,d,Mi,Si,Ti):a<=b+((a+H(b,c,d)+Mi+Ti)<<

第4轮:SUB_II(a,b,c,d,Mi,Si,Ti):a<=b+((a+I(b,c,d)+Mi+Ti)<<

数据交换规则:a,b,c,d→d,a,b,c→c,d,a,b,→b,c,d,a

最终:ABCD<=ABCD+abcd

其中:Mi为16个信息子包,每个4字节;Ti为4字节常数;Si为左移位数;abcd为32位变量;初始值为ABCD.

函数:F(X,Y,Z)=X&Y|NOT(X)&Z

G(X,Y,Z)=X&Z|Y?(Z)

H(X,Y,Z)=XxorYxorZ

I(X,Y,Z)=Yxor(X|not(Z))

2HMAC在IP电话计费上的应用

利用HMAC的认证功能,可对用户的IP储值卡中的金额进行保护。在试验系统中,智能终端相当于认证系统的客户端,如图3所示。

当用户使用时,用户只须直接拨入所叫的`电话号码即可。智能终端则自动拨向IP服务商,待响应后,反终端序列号、主叫电话号码、认证码一同发给服务商。智能终端序列号相当于公钥,用户的密码就是密钥。智能终端对密钥进行HMAC协议的加密运算自动生成认证码。

服务曾几何时接收数据码流,根据终端序列号确定用户的基本信息,再通过数据库中存储的认证码与接收到认证码的比较,确认用户的合法身份。如身份无误,则接通话路,计时收费。

其中第3步认证码的格式如表1所列。

表1认证码格式

引导符终端序列号电话号码*随机数HMAC认证码校验码*10Byte21Byte16Byte0.5Byte32Byte,高位为0,可直接发送DTMF不可直接发送,要转化

16Byte认证码,是经由HMAC加密得到的,其中的KEY值、TEXT值都可以作为用户密码。由于认证码高4bit为为0,所以不可以直接发送DTMF,要把4bit校验码排在认证码之后,共组成132bit数据,一起经过串行左移转化,每3bit构成1组,最后形成44个DTMF.

智能终端由单片机、DTMF拨号电话机、液晶显示等芯片构成。MCU不但要承担主控任务,还要实现HMAC的运算。

篇2:HMAC认证协议的单片机实现

(1)ZQ032SA单片机简介

ZQ032SA是北京中庆公司具有独立知识产权的Flash型MCU,与Motorola6805系列单片机功能相似,指令兼容。其采用CMOS工艺,工作稳定、功耗低、采用小型表贴封装(SOP28),适合民用设备使用。

主要特性有:

*8位MCU,兼容增强型6502指令集;

*4MHz主频,典型取指周期0.5μs.

*16Kbyte片内Flash存储器。

*352Byte片内用户RAM,其中包括64Byte的堆栈区;

*1个13位的多功能计数器和1个看门狗WDT

*20个通用I/O接口;

*1个载波调制发生器CMT;

*Flash保护机制;

*Flash在线程序下载;

*2种节电模式。

引脚排列和内部模块可参见本刊网络补充版。

(2)HMAC算法的实现

基于单片机内部可用RAM的大小及实际使用时可能的密码长度,在认证系统中规定了消息长度,key≤64B,text≤58B.这样在本例中,MD5运算的消息分组N=2.在单片机4MHz主频时,经过程序优化,完成HMAC的运算所需时间小于3ms.详细程序网络补充版。

下面列出主要流程图。

其中:MD5_MAIN是MD5运算主程序;

MD5_ONE子程序是MD5的一个分组运算;

SUB-FF、FBCD、GBCD、HBCD、IBCD分别是MD5运算中相应函数的子程序;

SHIFT子程序完成《Si的功能;

EXCH子程序完成地址4组数据的交换;

常数Ti列表于MEM_C,移位Si列表于TABLE_S;

消息子分组顺序列表于TABLE_M;

KEY键盘程序读入存于MEM_M,TEXT存于MEM_MB.

标号MEM1-4的RAM用于中间计算。

HMAC流程如图4所示。

MD5算法中的一个消息分组的计算程序流程如图6所示。

HMAC作为一种认证的协议,可以用于那么需要数字签名、身份认证或报文完整性检验等领域。在家用电子市场、安防、电子商务方面,都有广泛的用途。

在单片机可实现HMAC认证的基础上,可以进一步把ZQ032SA的IP核与其它外围逻辑构成ASIC,用于智能卡,将有应用前景。

在HMAC协议的基础上,加入其它成熟的加密算法,如DES,可以进一步提高认证的安全性。

篇3:HMAC认证协议的单片机实现

HMAC认证协议的单片机实现

摘要:HMAC是一种基于密钥的Hash算法的认证协议,可以应用于电子商务领域。我们通过国有自主知识产权的单片机ZQ032SA,实现了以MD5算法为核心的HMAC协议,并把它调用于IP电话计费认证系统。

关键词:HMAC ZQ032SA(6805) MD5 IP电话

引言

在开放的通信和计算机系统中,建立安全可靠的电子商务平台是十分重要的。通常需要通过加密的方法对客户的有关信息,如密码、合同等加以保护,使之不被盗取或篡改。当客户提出服务申请时,必须对客户身份的合法性、报文的完整性进行确认。

HMAC(Keyed-Hashing for Message Authentication)是一个公开的协议。它是一种基于密钥的报文完整性的验证方法,其安全性是建立在Hash算法基础上的。它要求通信双方共享密钥、约定算法、对报文进行Hash运算,如MD5、SHA、RIPEMD等,形成固定长度的认证码。通信双方通过认证码的校验来确定报文的合法性。这个协议可以用来作加密、数字签名、报文验证等。

利用HMAC协议可以建立一个身份认证的电子商务平台,客户和服务端双方需要预先约定唯一的公钥和加密算法;客户单方面保留自己密码作为密钥,服务端只保留公钥和认证码。这个认证码是密钥经HMAC协议加密得到定长码字。当客户提出服务申请时,应提交钥和密钥的认证码。服务端通过公钥确认客户的基本身份,再检验认证码确定客户的合法性。这样,客户的私密信息在服务端、传输媒介中都是加密隐藏的。

我们利用服务器建立了服务端的模拟用户数据库,单片机实现客户端的'加密算法,电话线作为传输介质,实现了HMAC协议在IP电话计费系统中的应用。

1 HMAC的算法原理

1.1 HMAC算法定义

用公式表示如下:

HMAC=H(key xor opad,H(key xor ipad,text))

H(X,Y)代表对X+Y的消息进行一种Hash运算;

ipad代表重复B次的单字节十六进制常数0x36;

opad代表重复B次的单字节十六进行常数0x5c;

key代表64字节的字符串,由密钥组成,不足的补0;

text代表任意长度文本。

[1] [2] [3] [4] [5]

篇4:基于80C166单片机PEC服务的PROFIBUS-FDL从站协议实现

基于80C166单片机PEC服务的PROFIBUS-FDL从站协议实现

摘要:在详细分析西门子80C166单片机PEC服务工作机制和PROFIBUS-FDL帧格式的基础上,提出了基于该种单片机PEC服务机制的PROFIBUS-FDL从站协议的实现方法,并在实际工作中得到成功应用。

关键词:80C166 PEC服务 PROFIBUS-FDL

当前工业设备制造技术正向高性能、专用化、分布式、网络化方向发展。以前,大量使用PLC实现的控制系统,实践证明虽然安全可靠,但由于PLC本身的技术原因,很难达到更快速的实时控制要求?它们正被高性能的嵌入式专用控制器替代。这种专用控制器的设计,可以进一步提高设备的控制性能;引入现场总线技术,保证专用控制器的系统可集成性,以适应当前分布式、网络化的应用趋势。

本文是在研制棒材生产线飞剪的专用控制器时涉及的一个子课题。为保证该控制器能与现有PLC网连接以及与远程操作站通信,在几乎不增加硬件的基础上,利用核心CPU――西门子80C166所具有的一个类似DMA的功能高效率地实现PROFIBUS-FDL从站协议。

1 西门子80C166单片机

80C166单片机是西门子C166系列16位嵌入式微控制器的第一代产品。其体系结构如图1所示。它结合RISC处理器的优点,克服了CISC处理器在嵌入式应用中的瓶颈;在25MHz时钟频率下,可达到12.5MIPS,几乎所有的指令执行时间小于80ns;在指令处理上,采用四级指令流水线管道结构;在存储管理上,统一线性地址空间可达256KB,具有段?代码?、页?数据?式管理机制;采用寄存器池,上下文切换时间只要80ns;16位乘法400ns,32位除法800ns,中断响应时间最慢400ns;外部事件控制器PEC服务具有类似DMA的功能,可实现存储器与外设之间的高速数据传输;丰富的在片外设:1KB RAM、10路A/D、76路I/O、7个定时器/计数器、16个比较/捕获单元、2个串行通信接口、在片的WATCHDOG等。

图1 西门子80C166体系结构

2 80C166的PEC服务

2.1 80C166的PEC服务机制

PEC是外部事件控制器的英文缩写。PEC服务是80C166提供的一种特殊数据传输机制。其目的是在原有的中断控制器基础上,用较小的硬件代价、尽可能少占用处理机周期实现内存与外部设备的快速数据交换?类似DMA,但无需专用的DMA控制器?。80C166有8路PEC服务通道。用PEC服务进行一次数据传输,仅占用处理机一个机器周期?20MHz时100ns,且不影响当前程序的执行。

2.2 PEC服务的工作过程

通常,当普通中断事件发生时,系统将保存当前CPU状态PSW和程序的地址;然后,根据不同的中断源,进行上下文切换,装载相应的中断矢量,执行相应的中断服务程序;执行完后,恢复被中断程序的上下文,继续执行被中断程序。

对于某一PEC服务,它总是与一具体中断源、中断矢量或中断服务相联系。在80C166中,当一个中断的'中断优先级为最高级14或15且定义了与之相关联的PEC服务通道时,该中断就具有PEC服务功能。这时,当该中断请求发生时,将不触发中断服务程序的执行,而是触发PEC服务。当PEC服务经过设定的若干次的外部事件触发后,再触发执行相应的中断服务程序(一个普通中断过程)。

(本网网收集整理)

如图2所示。一次PEC服务的工作过程是由PEC控制寄存器定义的,其中计数位域(8位传送计数器)COUNT定义了PEC服务的数据传输次数;源指针、目的指针指明具体的数据传输来源和目的;PEC服务的数据传输过程完全由硬件执行:当中断请求发生时,由硬件将源指针所指单元的内容传给目的指针所指的单元,然后由PEC控制寄存器相应定义位控制是源指针还是目的指针增加1或2,同时COUNT值减1;当多次中断请求使COUNT减为0时,PEC服务完成,触发与之关联的中断服务程序。

2.3 PEC服务应用优势

以串口接收一帧16字节的数据为例。若采用传统的串口接收方式,每接收到一字节,产生一个中断;在中断服务程序中,要将它从串口接收缓冲器中取出,顺序放到帧接收缓冲区相应单元中;当接收满16字节后,进行帧处理。

如果采用PEC服务的方式,只要事先定义好PEC通道就可以了。首先,定义串口接收中断优先级为14或15以及与之相关联的PEC通道。即定义相应PEC通道控制寄存器为:COUNT为16字节传输,源指针为串口接收缓冲器,目的指针为帧接收缓冲区首址且每次传输完成后,目的指针加1。这样,串口每接收到一字节,将触发一次PEC服务,由硬件将数据从串口接收缓冲器中取出,顺序放到帧接收缓冲区相应单元中,但当前执行的程序并不被中断;当16字节完全接收完成后,触发串口接收中断服务程序,进行帧的处理。

与传统的串口接收方式相比较,PEC服务方式在进行数据传输时不中断当前程序的执行,因此节省了大量的上下文切换时间,处理机效率得到大大提高。

面讨论采用80C166的PEC服务实现PROFIBUS-FDL从站协议的方法。

3 PROFIBUS-FDL帧结构分析

3.1 PROFIBUS-FDL帧结构

PROFIBUS帧的格式有多种形式,但对于从站来说,只要处理三种帧即可。

.无数据且长度固定的帧:

.带数据域且长度固定的帧:

. 带数据域且长度可变的帧:

其中,各字段说明如下:

SD1:无数据帧的开始定界符,#10H;

SD2:可变长度帧的开始定界符,#68H;

SD3:固定长度帧的开始定界符,#A2H;

ED:结束定界符,#16H;

LE与LEr:LE与LEr相同,都表示长度占一个字节,它是DA+SA+FC+?DATA-UNIT?的字节数总和;

DA与SA:DA?目的站地址?与SA?源站地址?各占一个字节;

FCS:校验段,占一个字节,它采用不计进位的求和运算得到校验码。校验域为DA+SA+FC+?DATA-UNIT?;

FC:帧控制字字段,占一个字节;

SYN:同步字段,至少33空闲位(逻辑电平1),但仅在请求帧及令牌帧前出现,不允许在字符之间出现。

3.2 PROFIBUS帧结构的特点

从上面的帧格式可以看出帧的长度不固定。发送时,帧的长度是已知的;但接收时,帧的长度是未知的。因此,要提高接收效率,只能采用分段方式接收,随时解析和保存关键信息,并确定随后接收的字节数。

4 PROFIBUS-FDL从站协议的PEC服务实现

PROFIBUS-FDL从站的数据接收及应答过程分三个阶段完成:第一阶段,帧的完整接收;第二阶段,根据接收到的FC帧控制字字段,判断主站正在进行怎样的数据请求;第三阶段,从站组织应答帧,启动帧的发送过程。

第二阶段的帧控制字处理请参考PROFIBUS标准的相关内容。对于第三阶段的组织和发送应答帧,由于数据长度和内容已知,只要定义好串口发送中断/服务,定义好相应的PEC通道:源地址为发送数据缓冲区首址+1、目的地址为串口发送缓冲器、COUNT域为发送字节数-1,将所要发送数据的第一个字节写入串口发送缓冲器,即可触发串口发送相关的PEC服务;当COUNT减为0时,触发串口发送中断服务子程序,完成串口数据发送过程。由于该过程实现简单,不作详细讨论。这里主要讨论第一阶段的帧完整接收实现过程。

从上面的帧结构分析可见,帧的长度是不固定的。因此,为提高接收效率,应用PEC服务分三步进行数据的批量接收。

4.1 第一步:帧头接收

首先,初始化时,定义串口接收PEC服务为连续接收三字节,用于接收帧的前三字节。

由第一个字符SDx(x=1,2,3)判断帧类型;对于不带数据固定长度帧和带数据固定长度帧接下来的两个字符是DA、SA,判断DA是否为本机地址;而对于带数据长度可变帧,接下来的两个字符是LE、LEr,判断其是否相等。

若以上判断都成立,则需定义下一次PEC服务的接收字符数:对于固定长度帧,定义PEC批量接收三字节数据,并保存DA、SA;对于可变长度帧,定义PEC服务接收四字节数据,转第二步;

若LE≠LEr或DA目的地址非本站地址,则重回到初始状态,进行帧头接收。

4.2 第二步:帧控制字接收

由于主站帧的连续发送,会再次触发PEC服务。由串口接收PEC服务连续接收三或四字节后,处理如下:

.不带数据固定长度帧,接收三字节,分别为FC、FCS、ED。对FCS和ED分别完成累加和校验与帧结束判断后,将帧控制字FC保存,转去执行帧控制字处理。

.带数据固定长度帧? 接收三字节?分别为FC和数据单元的前两个字节,保存FC,定义PEC服务接收后八个数据字节,转第三步。

.带数据可变长度帧,接收了四字节,分别为SD、DA、SA、FC。对SD再进行一次判断,之后判断DA是否为本机地址,保存DA、SA、FC,定义PEC服务接收余下的数据字节?长度由LE确定?,转第三步。

4.3 第三步:帧数据接收

当串口接收PEC服务连续接收八或更多的字节后,处理如下:

.带数据固定长度帧,接收八个字节,分别为余下的六字节数据和FCS、ED。在累加和校验与帧结束判断完毕后,转去执行帧控制字处理。

.带数据长度可变帧,接收了DATA-UNIT+2个字节,分别DATA-UNIT个数据字节和FCS、ED。在累加和校验与帧结束判断完毕后,进行协议要求的目的地址和原地址的地址扩展判断和保存,转去执行帧控制字处理。

4.4 串口接收中断服务子程序

以上三步都由串口接收中断服务子程序负责完成。每一步对应不同的处理状态。为提高程序的执行效率,用有限状态机实现。以1、2、3分别表示上述帧接收三个步骤,4表示帧控制字处理状态,其状态转换如图3。

采用这种协议实现方法,在最近研制的棒材生产线的飞剪控制器中运行效果良好。

篇5:基于80C166单片机PEC服务的PROFIBUS-FDL从站协议实现

基于80C166单片机PEC服务的PROFIBUS-FDL从站协议实现

摘要:在详细分析西门子80C166单片机PEC服务工作机制和PROFIBUS-FDL帧格式的基础上,提出了基于该种单片机PEC服务机制的PROFIBUS-FDL从站协议的实现方法,并在实际工作中得到成功应用。

关键词:80C166 PEC服务 PROFIBUS-FDL

当前工业设备制造技术正向高性能、专用化、分布式、网络化方向发展。以前,大量使用PLC实现的控制系统,实践证明虽然安全可靠,但由于PLC本身的技术原因,很难达到更快速的实时控制要求?它们正被高性能的嵌入式专用控制器替代。这种专用控制器的设计,可以进一步提高设备的控制性能;引入现场总线技术,保证专用控制器的系统可集成性,以适应当前分布式、网络化的应用趋势。

本文是在研制棒材生产线飞剪的专用控制器时涉及的一个子课题。为保证该控制器能与现有PLC网连接以及与远程操作站通信,在几乎不增加硬件的基础上,利用核心CPU――西门子80C166所具有的一个类似DMA的功能高效率地实现PROFIBUS-FDL从站协议。

1 西门子80C166单片机

80C166单片机是西门子C166系列16位嵌入式微控制器的第一代产品。其体系结构如图1所示。它结合RISC处理器的优点,克服了CISC处理器在嵌入式应用中的瓶颈;在25MHz时钟频率下,可达到12.5MIPS,几乎所有的指令执行时间小于80ns;在指令处理上,采用四级指令流水线管道结构;在存储管理上,统一线性地址空间可达256KB,具有段?代码?、页?数据?式管理机制;采用寄存器池,上下文切换时间只要80ns;16位乘法400ns,32位除法800ns,中断响应时间最慢400ns;外部事件控制器PEC服务具有类似DMA的功能,可实现存储器与外设之间的高速数据传输;丰富的在片外设:1KB RAM、10路A/D、76路I/O、7个定时器/计数器、16个比较/捕获单元、2个串行通信接口、在片的WATCHDOG等。

图1 西门子80C166体系结构

2 80C166的PEC服务

2.1 80C166的PEC服务机制

PEC是外部事件控制器的英文缩写。PEC服务是80C166提供的'一种特殊数据传输机制。其目的是在原有的中断控制器基础上,用较小的硬件代价、尽可能少占用处理机周期实现内存与外部设备的快速数据交换?类似DMA,但无需专用的DMA控制器?。80C166有8路PEC服务通道。用PEC服务进行一次数据传输,仅占用处理机一个机器周期?20MHz时100ns,且不影响当前程序的执行。

2.2 PEC服务的工作过程

通常,当普通中断事件发生时,系统将保存当前CPU状态PSW和程序的地址;然后,根据不同的中断源,进行上下文切换,装载相应的中断矢量,执行相应的中断服务程序;执行完后,恢复被中断程序的上下文,继续执行被中断程序。

对于某一PEC服务

[1] [2] [3] [4]

单片机串口通讯协议

H3C路由器实现VRRP协议

单片机课程设计心得体会

单片机工作经历总结

单片机学习心得体会

单片机实习报告

单片机实习总结

实验室认证工作方案

华为认证考试指南

学历认证报告

《HMAC认证协议的单片机实现(精选5篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

点击下载本文文档