HMAC认证协议的单片机实现

发布者:风轻迟最新更新时间:2007-03-09 手机看文章 扫描二维码
随时随地手机看文章
摘要: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代表任意长度文本。 密钥≥L字节。当大于B时,先经Hash计算形成L字节的秘钥(B是Hash算法中一次迭代运算的数据块字节数;L是Hash算法形成报文摘要的字节数)。 HMAC协议定义了迭代两次的Hash加密算法,最终形成报文摘要(DIGEST)值就是认证码。基于算法的可靠性、安全性和易于计算机实现特性,先用Hash中的MD5算法实现HMAC,其B=64,L=16。 1.2 MD5算法定义 MD5算法以对任意长度消息多次循环迭代的散列运算,最终形成16 Byte报文摘要。这个摘要对文本具有唯一性,可作为认证码。在目标计算机的计算速度下,这个摘要是难于破解的。 (1)报文填充 MD5算法要求对任意长度报文进行填充,构成N%26;#215;64 Byte消息分组,N为整数。其中每一分组又划分为16个4字节子分组。 填充数据分2步。首先,填充使得数据位长度恰好为(N%26;#215;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)<< 最终:ABCD<=ABCD+abcd 其中:Mi为16个信息子包,每个4字节;Ti为4字节常数;Si为左移位数;abcd为32位变量;初始值为ABCD。 函数:F(X,Y,Z)=X%26;amp;Y|NOT(X)%26;amp;Z G(X,Y,Z)=X%26;amp;Z|Y%26;amp;not(Z) H(X,Y,Z)=XxorYxorZ I(X,Y,Z)=Yxor(X|not(Z)) 2 HMAC在IP电话计费上的应用 利用HMAC的认证功能,可对用户的IP储值卡中的金额进行保护。在试验系统中,智能终端相当于认证系统的客户端,如图3所示。 当用户使用时,用户只须直接拨入所叫的电话号码即可。智能终端则自动拨向IP服务商,待响应后,反终端序列号、主叫电话号码、认证码一同发给服务商。智能终端序列号相当于公钥,用户的密码就是密钥。智能终端对密钥进行HMAC协议的加密运算自动生成认证码。 服务曾几何时接收数据码流,根据终端序列号确定用户的基本信息,再通过数据库中存储的认证码与接收到认证码的比较,确认用户的合法身份。如身份无误,则接通话路,计时收费。 其中第3步认证码的格式如表1所列。 表1 认证码格式 引导符 终端序列号 电话号码*随机数 HMAC认证码 校验码 * 10Byte 21Byte 16Byte 0.5Byte 32Byte,高位为0,可直接发送DTMF 不可直接发送,要转化   16Byte认证码,是经由HMAC加密得到的,其中的KEY值、TEXT值都可以作为用户密码。由于认证码高4bit为为0,所以不可以直接发送DTMF,要把4bit校验码排在认证码之后,共组成132bit数据,一起经过串行左移转化,每3bit构成1组,最后形成44个DTMF。 智能终端由单片机、DTMF拨号电话机、液晶显示等芯片构成。MCU不但要承担主控任务,还要实现HMAC的运算。 3 HMAC的单片机实现 (1)ZQ032SA单片机简介 ZQ032SA 是北京中庆公司具有独立知识产权的Flash型MCU,与Motorola 6805系列单片机功能相似,指令兼容。其采用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种节电模式。 引脚排列和内部模块可参见本刊网络补充版。(http://www.dpj.com.cn)。 (2)HMAC算法的实现 基于单片机内部可用RAM的大小及实际使用时可能的密码长度,在认证系统中规定了消息长度,key≤64B,text≤58B。这样在本例中,MD5运算的消息分组N=2。在单片机4MHz主频时,经过程序优化,完成HMAC的运算所需时间小于3ms。详细程序网络补充版(http://www.dpj.com.cn)。 下面列出主要流程图。 其中:MD5_MAIN是MD5运算主程序; MD5_ONE子程序是MD5的一个分组运算; SUB-FF、FBCD、GBCD、HBCD、IBCD分别是MD5运算中相应函数的子程序; SHIFT子程序完成< HMAC作为一种认证的协议,可以用于那么需要数字签名、身份认证或报文完整性检验等领域。在家用电子市场、安防、电子商务方面,都有广泛的用途。 在单片机可实现HMAC认证的基础上,可以进一步把ZQ032SA的IP核与其它外围逻辑构成ASIC,用于智能卡,将有应用前景。 在HMAC协议的基础上,加入其它成熟的加密算法,如DES,可以进一步提高认证的安全性。
引用地址:HMAC认证协议的单片机实现

上一篇:单片机虚拟实验室的建立
下一篇:基于LPC2214和μC/OS-II的iButton接口

小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved