APP下载

SM 3算法及在Linux内核IPSEC协议栈的实现

2015-01-01四川职业技术学院计算机科学系四川遂宁629000

宜宾学院学报 2015年6期
关键词:内核密钥比特

吴 瑕(四川职业技术学院计算机科学系,四川遂宁629000)

SM 3算法及在Linux内核IPSEC协议栈的实现

吴瑕
(四川职业技术学院计算机科学系,四川遂宁629000)

基于国家密码管理局发布的SM3密码杂凑算法,实现一种嵌入Linux内核的符合Linux内核算法框架的HAMC算法,用于IPSEC协议栈对数据报文的验证算法,使得SM3算法能够在网络层对通信双方的加密数据进行完整性校验.

SM3;IPSEC;杂凑值;HMAC

Wu X.The SM3 Algorithm and the Realization of IPSECProtocol Stack in Linux Kernel[J].Journal of Yibin University, 2015,15(6):89-92.

密码杂凑算法在电子签名和数据完整性机制中被广泛应用,是一种非线性迭代函数,可将任意长度的消息压缩成一定长度的数字摘要,使之满足抗可逆性分析与抗碰撞性分析等密码学特性[1].

杂凑函数是现代密码学中一种重要的基础算法,杂凑算法在构建信息安全系统的过程中,提供了对数据完整性认证和对消息源认证的支撑功能.常用的杂凑函数有很多,其中以SHA-1算法和MD5算法为代表,该类算法具有压缩函数非线性度高、消息填充和分组强等优点.但随着技术的发展,差分碰撞分析针对杂凑算法的攻击技术不断出现,这些算法在抵制安全性威胁方面的缺点也日益突出.法国和日本等多国的密码学家都对此进行了持续研究,寻找杂凑算法的碰撞实例,美国NIST5报告中提出由于MD5等的破解,美国联邦机构决定将在2010年逐步撤出SHA-1的使用[2].我国的密码攻击技术在差分漏洞分析、差分路径设计和碰撞攻击算法设计方面已经处于国际领先水平,并且一直致力于开发新的杂凑函数.基于此,国家密码管理局发布了适用于商用密码应用的SM3密码杂凑算法.

1 SM 3密码杂凑算法

SM3密码杂凑算法是一种基于分组迭代结构的杂凑算法,该算法采用消息双字结合的消息字处理方式,使用来自不同群运算的混合,实现了消息在局部范围内快速扩散和混乱,有效防止了比特追踪及其他已知分析方法对算法造成的安全性威胁.下面详细描述算法的实现过程.

1.1算法描述

对长度为l(l<264)比特的消息m,SM3杂凑算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为256比特[3].

1.2消息填充

假设消息m的长度为l比特,首先将比特“1”添加到消息的末尾,再添加 k个“0”,k是满足l+1+k≡448mod512的最小的非负整数.然后再添加一个64位比特串,该比特串是长度l的二进制表示.填充后的消息m′的比特长度为512的倍数.

1.3迭代压缩过程

将填充后的消息m′按512比特进行分组:m′=B(0)B(1)…B(n-1),其中n=(l+k+65)512.对m′按下列形式化方式迭代:

for i=0 to n-1

V(i+1)=CF(V(i),B(i))

endfor

其中CF是压缩函数,V0为256比特初始值IV,B(i)为填充后的消息分组,迭代压缩的结果为V(n).

1.4消息扩展

为了减小杂凑碰撞的几率,还需要对填充后的消息进行“信息膨胀”,即消息扩展,将消息分组B(i)按以下方法扩展生成 132个字 w0,w1,...,w67,用于压缩函数CF,扩展方法如下:

1)将消息分组B(i)划分为16个字w0,w1,...,w15.

2)利用置换函数 P1[P1(X)=X⊕(X⋘15)⊕(X⋘23)],按照如下形式化语言通过轮数迭代扩展中间52个字:

for j=16 to 67

wj←P1(wj-16⊕wj-9⊕(wj-3⋘15))⊕wj-6

endfor

3)最后64个字的按照如下方式做32比特异或运算后得到,算法实现的形式化语言描述如下:

for j=0 to 63

wj=wj⊕wj+4

endfor

通过以上三步的消息扩展运算.

1.5压缩函数

令A、B、C、D、E、F、G、H为字寄存器,SS1、SS2、TT1、TT2为中间变量,压缩函数Vi+1=CF(V(i),B(i)),0≤i≤n-1.计算过程描述如下:

ABCDEFGH←Vi

for j=0 to 63

SS1←(A<<<12)+E+(Tj<<<j))<<<7

SS2←SS1⊕(A<<<12)

TT1←FFj(A,B,C)+D+SS2+

TT2←GGj(E,F,G)+H+SS1+Wj

D←C

C←B<<<9

B←A

A←TT1

H←G

G←F<<<19

F←E

E←P0(TT2)

endfor

V(i+1)←ABCDEFGH⊕V(i)

其中,字的存储为大端(big-endian)格式.

1.6杂凑值

通过1.5中压缩函数的运算最终得到V(n),把V(n)的值赋给ABCDEFGH即是最终的杂凑值,其输出的形式化描述如下:

ABCDEFGH←V(n)

输出256比特的杂凑值:

y=ABCDEFGH

2 HMAC算法

HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个摘要作为输出[4].

HMAC用于保护消息的完整性,它采用指定的摘要算法通过密钥对消息进行混合运算[5]得到一个固定的摘要值作为HMAC的输出,用于数据完整性校验.消息传输时,用户不仅传送消息本身,还传送消息校验产生的HMAC值.接收方接收数据后对消息本身进行HMAC运算,再把运算结果与原始消息中附带的HMAC值对比是否一致.由于密钥只有发送方和接收方才有,其他人不可能伪造假的HMAC值,从而能够知道消息是否被篡改.

HMAC算法的算法描述如下[6]:

如果用H、K、opad、ipad、B分别表述算法中用到的参数信息,其中:

(1)H表示采用的hash算法;

(2)K代表认证密码;

(3)opad是一个外部的填充常数,用0x5a来填充为一个长度为B字节的常数;

(4)ipad是一个内部的填充常数,用0x36来填充为一个长度为B字节的常数;

(5)B表示hash算法H所处理的数据块的大小.

则算法可以如下描述:

HMAC(K,M)=H(K⊕opad|H(K⊕ipad|M))

即为以下步骤:

(1)扩展认证密码K(在K后面添加0)得到字长为B的扩展密钥K1.

(2)将K1与ipad做异或运算.

(3)将消息M填充至第二步的结果字符串中.

(4)用hash算法H作用于M,生成消息M 2.

(5)将K1与opad做异或运算.

(6)再将(4)的结果填充进(5)的结果中.

(7)用H作用于(6)生成消息M 3,输出最终结果.

HMAC算法引入了密钥的概念,因此其算法的安全性已经不完全依赖于所采用的hash算法,在IP⁃SECVPN的组网应用中通信双方使用的HMAC密钥是通过协商得到的,因此即使知道了通信双方采用的hash算法,如果不知道通信双方公共的密钥,即使是基于散列函数的冲突攻击也是无法破解的.此外HMAC身份认证中也有很多是“挑战/响应”(chal⁃lenge/response)等具体的应用.

3 HMAC-SM 3算法在Linux内核ISPEC协议栈的应用

IPSec不是一个单独的协议,它给出了应用于IP层的一整套网络数据安全的体系结构.该体系结构包括认证头协议(Authentication Header,AH)、封装安全负载协议(EncapsulatingSecurity Payload,ESP)、密钥管理协议(Internet Key Exchange,IKE)和用于网络认证及加密的一些算法等[7-8].协议中数据的完整性校验是通过HASH算法来实现的.

本算法实现基于Linux-2.6.33.4内核完成,采用IPSec VPN隧道模式组建VPN网络,隧道封装采用ESP模式,通信算法密钥长度为256比特,密钥通过应用层静态加入到Linux内核SAD数据库中,基于SM3算法对长度为ain_len的数据进行HAMC运算,输出长度为32字节的数据.

根据国家密码管理局发布的GM/T0022-2014 《IPSec VPN技术规范》,SM3算法的算法id为20.算法ID定义如下:

#define SADB_AALG_SM3HMAC20

由于Linux内核数据报文的长度是根据不同的网络MTU和设备主存储器的设置而定,所以是不固定的,为了保证通信双方能够对同样的数据得到相同的hash结果,就需要对数据进行分段处理,通常hash算法都是基于三段式实现的,即:

XXX_INIT();

XXX_UPDATE();

XXX_FINAL();

调用的流程如图1所示.

三段式调用方法通常会把一段数据分成若干组,首先对第一个分组数据作运算,把运算的结果作为下一个分组的种子参数,直到最后一组数据运算结束得到运算结果.分段运算输出结果的数据结构定义如下:

struct sm3_state

{

U64count;

U32state[8];

U8buf fer[64]

}

图1 流程图

Linux内核SM3算法网络数据处理流程见图2.

网络数据通过网卡接收到本地设备上以后,网络数据通常不是存储在一个线性缓冲区中,而是通过数据指针把各个分散的缓冲区数据连接起来,构成一整段报文.数据进入ipsec协议栈以后首先验证数据的完整性,分散的数据就会被一段一段地送入到杂凑算法接口中去[9].

杂凑算法首先通过init设置数据处理状态,为SM3算法添加各个阶段的ID,然后在update中把收集到的数据(长度为LEN)进行处理,算法定义块长度为BLOCKLEN.如果长度LEN和BLOCKLEN长度相等,则调用hash算法得到一个输出;如果小于BLOCKLEN,则拷贝到算法私有的存储空间中等待下一部分数据到来;如果数据长度大于BLOCKLEN,则把数据分割成若干个BLOCKLEN块和一个剩余块,即:LEN=N×BLOCKLEN+X(X<BLOCKLEN).这个剩余块称之为尾数,最后在Final中调用SM3完成对尾数的处理.

通过这种方法,不管通信双方对数据做如何分割,双方最终都是把数据分割成N×BLOCKLEN+X来完成杂凑算法的计算.这样通信双方得到的结果都是对同一数据做了N+1次相同运算,从而保证了算法在网络通信中的正确性.

图2 网络数据的处理流程

4 实验

为了验证算法的正确性,在两台设备之间建立IPSECVPN隧道,隧道通信采用ESP/封装,加密算法采用AES,认证算法采用HMAC-SM3,测试平台的配置如为:CPU:Intel(R)Xeon(R)E5620@2.40GHz 16核;内存:12GB;网卡:Intel Corporation 82574L GigabitEthernetcontroller.

两个平台之间建立site-to-site环境,测试仪器采用Smartbits-600.

测试结果性能如表1所示.

表1 采用SM3算法的密通速率测试结果

相同的测试环境下加密算法采用AES,认证算法采用HMAC-SHA1得到的测试结果如表2所示.

表2 采用SHA1算法的密通速率测试结果

试验结果表明采用Smartbits-600网络测试仪开启网口协商出来的链路速率是1 000Mbps,在1 000 Mbps的链路上丢包率为0的情况下,采用AES+SM3算法套件,64 Byte的小包单边达到了106.1Mbps,1 420 Byte的大包单边达到了578.8Mbps.从算法性能上看,AES+SM3算法套件和AES+SHA1算法套件的结果相比有一定差距,但是不影响设备的正常工作,算法的稳定性和安全性符合要求.

5 结论

通过实验数据可以看出,把SM3算法高效地集成在操作系统内核,作为一种HMAC算法,能够支持对网络数据进行完整性校验,同时也可以看出算法在底层的小包执行效率相对其他算法来说相对较低,如何优化算法提高算法的执行效率需要做进一步的研究.

[1]Davis CR.IPSec_VPN的安全实施[M].周永彬,等译.北京:清华大学出版社,2002.

[2]李师谦.基于杂凑函数的数据完整性研究[J].山东理工大学学报(自然科学版),2003(3):27-31.

[3] 王晓燕,杨先文.基于FPGA的SM3算法优化设计与实现[J].计算机工程,2012(6):244-246.

[4]国家密码管理局.GM/T 0004-2012.SM3密码杂凑算法[S].北京:中国标准出版社,2012.

[5]Stinson DR.密码学原理与实践[M].第三版.北京:电子工业出版社,2009.

[6]Krawczyk H,Bellare M,Canetti R.HMAC:Keyed-Hashing for Message Authentication[EB/OL].(1997-02)[2013-09-18].http://www.faqs.org/rfcs/rfc2104.htm l.

[7]Forouzan B A.密码学与网络安全[M].北京:清华大学出版社, 2009.

[8]Kent S,Atkinson R.IP encapsulating security payload(ESP)[EB/OL].(1988-11)[2013-09-22].http://www.faqs.org/rfcs/rfc2406.ht⁃ml.

[9]Glenn R,Kent S.The NULL encryption algorithm and its usewith ipsec[EB/OL].(1988-11)[2013-10-13].http://www.faqs.org/rfcs/rfc2410.htm l.

(编校:许洁)

The SM 3 Algorithm and the Realization of IPSEC Protocol Stack in Linux Kernel

WUXia
(DepartmentofComputerScience,Sichuan Vocationaland TechnicalCollege,Suining,Sichuan 629000,China)

Based on the SM3 password hash algorithm issued by National Cipher Management Bureau,an HAMC algo⁃rithm which is in consistentwith the Linux kernel algorithm framework was proposed.The implementation of an embed⁃ded Linux kernel based on IPSEC protocol stack is used to validate the algorithm of data packet,so that SM3 algorithm could realize the integrity check ofencryption data from both sidesof the communication on thenetwork layer.

SM3;IPSEC;hash value;HMAC

TP39

A

1671-5365(2015)06-0089-04

2014-12-17修回:2015-01-20

吴瑕(1983-),女,讲师,硕士,研究方向为计算机应用

网络出版时间:2015-01-20 17:17网络出版地址:http://www.cnki.net/kcms/detail/51.1630.Z.20150120.1717.001.html

引用格式:吴瑕.SM3算法及在Linux内核IPSEC协议栈的实现[J].宜宾学院学报,2015,15(6):89-92.

猜你喜欢

内核密钥比特
多内核操作系统综述①
幻中邂逅之金色密钥
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
密码系统中密钥的状态与保护*
微软发布新Edge浏览器预览版下载换装Chrome内核
TPM 2.0密钥迁移协议研究
一种对称密钥的密钥管理方法及系统
比特币还能投资吗
比特币分裂