吳 瑕(四川職業(yè)技術(shù)學(xué)院計(jì)算機(jī)科學(xué)系,四川遂寧629000)
SM 3算法及在Linux內(nèi)核IPSEC協(xié)議棧的實(shí)現(xiàn)
吳瑕
(四川職業(yè)技術(shù)學(xué)院計(jì)算機(jī)科學(xué)系,四川遂寧629000)
基于國(guó)家密碼管理局發(fā)布的SM3密碼雜湊算法,實(shí)現(xiàn)一種嵌入Linux內(nèi)核的符合Linux內(nèi)核算法框架的HAMC算法,用于IPSEC協(xié)議棧對(duì)數(shù)據(jù)報(bào)文的驗(yàn)證算法,使得SM3算法能夠在網(wǎng)絡(luò)層對(duì)通信雙方的加密數(shù)據(jù)進(jìn)行完整性校驗(yàn).
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.
密碼雜湊算法在電子簽名和數(shù)據(jù)完整性機(jī)制中被廣泛應(yīng)用,是一種非線性迭代函數(shù),可將任意長(zhǎng)度的消息壓縮成一定長(zhǎng)度的數(shù)字摘要,使之滿足抗可逆性分析與抗碰撞性分析等密碼學(xué)特性[1].
雜湊函數(shù)是現(xiàn)代密碼學(xué)中一種重要的基礎(chǔ)算法,雜湊算法在構(gòu)建信息安全系統(tǒng)的過(guò)程中,提供了對(duì)數(shù)據(jù)完整性認(rèn)證和對(duì)消息源認(rèn)證的支撐功能.常用的雜湊函數(shù)有很多,其中以SHA-1算法和MD5算法為代表,該類算法具有壓縮函數(shù)非線性度高、消息填充和分組強(qiáng)等優(yōu)點(diǎn).但隨著技術(shù)的發(fā)展,差分碰撞分析針對(duì)雜湊算法的攻擊技術(shù)不斷出現(xiàn),這些算法在抵制安全性威脅方面的缺點(diǎn)也日益突出.法國(guó)和日本等多國(guó)的密碼學(xué)家都對(duì)此進(jìn)行了持續(xù)研究,尋找雜湊算法的碰撞實(shí)例,美國(guó)NIST5報(bào)告中提出由于MD5等的破解,美國(guó)聯(lián)邦機(jī)構(gòu)決定將在2010年逐步撤出SHA-1的使用[2].我國(guó)的密碼攻擊技術(shù)在差分漏洞分析、差分路徑設(shè)計(jì)和碰撞攻擊算法設(shè)計(jì)方面已經(jīng)處于國(guó)際領(lǐng)先水平,并且一直致力于開(kāi)發(fā)新的雜湊函數(shù).基于此,國(guó)家密碼管理局發(fā)布了適用于商用密碼應(yīng)用的SM3密碼雜湊算法.
SM3密碼雜湊算法是一種基于分組迭代結(jié)構(gòu)的雜湊算法,該算法采用消息雙字結(jié)合的消息字處理方式,使用來(lái)自不同群運(yùn)算的混合,實(shí)現(xiàn)了消息在局部范圍內(nèi)快速擴(kuò)散和混亂,有效防止了比特追蹤及其他已知分析方法對(duì)算法造成的安全性威脅.下面詳細(xì)描述算法的實(shí)現(xiàn)過(guò)程.
1.1算法描述
對(duì)長(zhǎng)度為l(l<264)比特的消息m,SM3雜湊算法經(jīng)過(guò)填充和迭代壓縮,生成雜湊值,雜湊值長(zhǎng)度為256比特[3].
1.2消息填充
假設(shè)消息m的長(zhǎng)度為l比特,首先將比特“1”添加到消息的末尾,再添加 k個(gè)“0”,k是滿足l+1+k≡448mod512的最小的非負(fù)整數(shù).然后再添加一個(gè)64位比特串,該比特串是長(zhǎng)度l的二進(jìn)制表示.填充后的消息m′的比特長(zhǎng)度為512的倍數(shù).
1.3迭代壓縮過(guò)程
將填充后的消息m′按512比特進(jìn)行分組:m′=B(0)B(1)…B(n-1),其中n=(l+k+65)512.對(duì)m′按下列形式化方式迭代:
for i=0 to n-1
V(i+1)=CF(V(i),B(i))
endfor
其中CF是壓縮函數(shù),V0為256比特初始值IV,B(i)為填充后的消息分組,迭代壓縮的結(jié)果為V(n).
1.4消息擴(kuò)展
為了減小雜湊碰撞的幾率,還需要對(duì)填充后的消息進(jìn)行“信息膨脹”,即消息擴(kuò)展,將消息分組B(i)按以下方法擴(kuò)展生成 132個(gè)字 w0,w1,...,w67,用于壓縮函數(shù)CF,擴(kuò)展方法如下:
1)將消息分組B(i)劃分為16個(gè)字w0,w1,...,w15.
2)利用置換函數(shù) P1[P1(X)=X⊕(X?15)⊕(X?23)],按照如下形式化語(yǔ)言通過(guò)輪數(shù)迭代擴(kuò)展中間52個(gè)字:
for j=16 to 67
wj←P1(wj-16⊕wj-9⊕(wj-3?15))⊕wj-6
endfor
3)最后64個(gè)字的按照如下方式做32比特異或運(yùn)算后得到,算法實(shí)現(xiàn)的形式化語(yǔ)言描述如下:
for j=0 to 63
wj=wj⊕wj+4
endfor
通過(guò)以上三步的消息擴(kuò)展運(yùn)算.
1.5壓縮函數(shù)
令A(yù)、B、C、D、E、F、G、H為字寄存器,SS1、SS2、TT1、TT2為中間變量,壓縮函數(shù)Vi+1=CF(V(i),B(i)),0≤i≤n-1.計(jì)算過(guò)程描述如下:
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)
其中,字的存儲(chǔ)為大端(big-endian)格式.
1.6雜湊值
通過(guò)1.5中壓縮函數(shù)的運(yùn)算最終得到V(n),把V(n)的值賦給ABCDEFGH即是最終的雜湊值,其輸出的形式化描述如下:
ABCDEFGH←V(n)
輸出256比特的雜湊值:
y=ABCDEFGH
HMAC是密鑰相關(guān)的哈希運(yùn)算消息認(rèn)證碼(Hash-based Message Authentication Code),HMAC運(yùn)算利用哈希算法,以一個(gè)密鑰和一個(gè)消息為輸入,生成一個(gè)摘要作為輸出[4].
HMAC用于保護(hù)消息的完整性,它采用指定的摘要算法通過(guò)密鑰對(duì)消息進(jìn)行混合運(yùn)算[5]得到一個(gè)固定的摘要值作為HMAC的輸出,用于數(shù)據(jù)完整性校驗(yàn).消息傳輸時(shí),用戶不僅傳送消息本身,還傳送消息校驗(yàn)產(chǎn)生的HMAC值.接收方接收數(shù)據(jù)后對(duì)消息本身進(jìn)行HMAC運(yùn)算,再把運(yùn)算結(jié)果與原始消息中附帶的HMAC值對(duì)比是否一致.由于密鑰只有發(fā)送方和接收方才有,其他人不可能偽造假的HMAC值,從而能夠知道消息是否被篡改.
HMAC算法的算法描述如下[6]:
如果用H、K、opad、ipad、B分別表述算法中用到的參數(shù)信息,其中:
(1)H表示采用的hash算法;
(2)K代表認(rèn)證密碼;
(3)opad是一個(gè)外部的填充常數(shù),用0x5a來(lái)填充為一個(gè)長(zhǎng)度為B字節(jié)的常數(shù);
(4)ipad是一個(gè)內(nèi)部的填充常數(shù),用0x36來(lái)填充為一個(gè)長(zhǎng)度為B字節(jié)的常數(shù);
(5)B表示hash算法H所處理的數(shù)據(jù)塊的大小.
則算法可以如下描述:
HMAC(K,M)=H(K⊕opad|H(K⊕ipad|M))
即為以下步驟:
(1)擴(kuò)展認(rèn)證密碼K(在K后面添加0)得到字長(zhǎng)為B的擴(kuò)展密鑰K1.
(2)將K1與ipad做異或運(yùn)算.
(3)將消息M填充至第二步的結(jié)果字符串中.
(4)用hash算法H作用于M,生成消息M 2.
(5)將K1與opad做異或運(yùn)算.
(6)再將(4)的結(jié)果填充進(jìn)(5)的結(jié)果中.
(7)用H作用于(6)生成消息M 3,輸出最終結(jié)果.
HMAC算法引入了密鑰的概念,因此其算法的安全性已經(jīng)不完全依賴于所采用的hash算法,在IP?SECVPN的組網(wǎng)應(yīng)用中通信雙方使用的HMAC密鑰是通過(guò)協(xié)商得到的,因此即使知道了通信雙方采用的hash算法,如果不知道通信雙方公共的密鑰,即使是基于散列函數(shù)的沖突攻擊也是無(wú)法破解的.此外HMAC身份認(rèn)證中也有很多是“挑戰(zhàn)/響應(yīng)”(chal?lenge/response)等具體的應(yīng)用.
IPSec不是一個(gè)單獨(dú)的協(xié)議,它給出了應(yīng)用于IP層的一整套網(wǎng)絡(luò)數(shù)據(jù)安全的體系結(jié)構(gòu).該體系結(jié)構(gòu)包括認(rèn)證頭協(xié)議(Authentication Header,AH)、封裝安全負(fù)載協(xié)議(EncapsulatingSecurity Payload,ESP)、密鑰管理協(xié)議(Internet Key Exchange,IKE)和用于網(wǎng)絡(luò)認(rèn)證及加密的一些算法等[7-8].協(xié)議中數(shù)據(jù)的完整性校驗(yàn)是通過(guò)HASH算法來(lái)實(shí)現(xiàn)的.
本算法實(shí)現(xiàn)基于Linux-2.6.33.4內(nèi)核完成,采用IPSec VPN隧道模式組建VPN網(wǎng)絡(luò),隧道封裝采用ESP模式,通信算法密鑰長(zhǎng)度為256比特,密鑰通過(guò)應(yīng)用層靜態(tài)加入到Linux內(nèi)核SAD數(shù)據(jù)庫(kù)中,基于SM3算法對(duì)長(zhǎng)度為ain_len的數(shù)據(jù)進(jìn)行HAMC運(yùn)算,輸出長(zhǎng)度為32字節(jié)的數(shù)據(jù).
根據(jù)國(guó)家密碼管理局發(fā)布的GM/T0022-2014 《IPSec VPN技術(shù)規(guī)范》,SM3算法的算法id為20.算法ID定義如下:
#define SADB_AALG_SM3HMAC20
由于Linux內(nèi)核數(shù)據(jù)報(bào)文的長(zhǎng)度是根據(jù)不同的網(wǎng)絡(luò)MTU和設(shè)備主存儲(chǔ)器的設(shè)置而定,所以是不固定的,為了保證通信雙方能夠?qū)ν瑯拥臄?shù)據(jù)得到相同的hash結(jié)果,就需要對(duì)數(shù)據(jù)進(jìn)行分段處理,通常hash算法都是基于三段式實(shí)現(xiàn)的,即:
XXX_INIT();
XXX_UPDATE();
XXX_FINAL();
調(diào)用的流程如圖1所示.
三段式調(diào)用方法通常會(huì)把一段數(shù)據(jù)分成若干組,首先對(duì)第一個(gè)分組數(shù)據(jù)作運(yùn)算,把運(yùn)算的結(jié)果作為下一個(gè)分組的種子參數(shù),直到最后一組數(shù)據(jù)運(yùn)算結(jié)束得到運(yùn)算結(jié)果.分段運(yùn)算輸出結(jié)果的數(shù)據(jù)結(jié)構(gòu)定義如下:
struct sm3_state
{
U64count;
U32state[8];
U8buf fer[64]
}
圖1 流程圖
Linux內(nèi)核SM3算法網(wǎng)絡(luò)數(shù)據(jù)處理流程見(jiàn)圖2.
網(wǎng)絡(luò)數(shù)據(jù)通過(guò)網(wǎng)卡接收到本地設(shè)備上以后,網(wǎng)絡(luò)數(shù)據(jù)通常不是存儲(chǔ)在一個(gè)線性緩沖區(qū)中,而是通過(guò)數(shù)據(jù)指針把各個(gè)分散的緩沖區(qū)數(shù)據(jù)連接起來(lái),構(gòu)成一整段報(bào)文.數(shù)據(jù)進(jìn)入ipsec協(xié)議棧以后首先驗(yàn)證數(shù)據(jù)的完整性,分散的數(shù)據(jù)就會(huì)被一段一段地送入到雜湊算法接口中去[9].
雜湊算法首先通過(guò)init設(shè)置數(shù)據(jù)處理狀態(tài),為SM3算法添加各個(gè)階段的ID,然后在update中把收集到的數(shù)據(jù)(長(zhǎng)度為L(zhǎng)EN)進(jìn)行處理,算法定義塊長(zhǎng)度為BLOCKLEN.如果長(zhǎng)度LEN和BLOCKLEN長(zhǎng)度相等,則調(diào)用hash算法得到一個(gè)輸出;如果小于BLOCKLEN,則拷貝到算法私有的存儲(chǔ)空間中等待下一部分?jǐn)?shù)據(jù)到來(lái);如果數(shù)據(jù)長(zhǎng)度大于BLOCKLEN,則把數(shù)據(jù)分割成若干個(gè)BLOCKLEN塊和一個(gè)剩余塊,即:LEN=N×BLOCKLEN+X(X<BLOCKLEN).這個(gè)剩余塊稱之為尾數(shù),最后在Final中調(diào)用SM3完成對(duì)尾數(shù)的處理.
通過(guò)這種方法,不管通信雙方對(duì)數(shù)據(jù)做如何分割,雙方最終都是把數(shù)據(jù)分割成N×BLOCKLEN+X來(lái)完成雜湊算法的計(jì)算.這樣通信雙方得到的結(jié)果都是對(duì)同一數(shù)據(jù)做了N+1次相同運(yùn)算,從而保證了算法在網(wǎng)絡(luò)通信中的正確性.
圖2 網(wǎng)絡(luò)數(shù)據(jù)的處理流程
為了驗(yàn)證算法的正確性,在兩臺(tái)設(shè)備之間建立IPSECVPN隧道,隧道通信采用ESP/封裝,加密算法采用AES,認(rèn)證算法采用HMAC-SM3,測(cè)試平臺(tái)的配置如為:CPU:Intel(R)Xeon(R)E5620@2.40GHz 16核;內(nèi)存:12GB;網(wǎng)卡:Intel Corporation 82574L GigabitEthernetcontroller.
兩個(gè)平臺(tái)之間建立site-to-site環(huán)境,測(cè)試儀器采用Smartbits-600.
測(cè)試結(jié)果性能如表1所示.
表1 采用SM3算法的密通速率測(cè)試結(jié)果
相同的測(cè)試環(huán)境下加密算法采用AES,認(rèn)證算法采用HMAC-SHA1得到的測(cè)試結(jié)果如表2所示.
表2 采用SHA1算法的密通速率測(cè)試結(jié)果
試驗(yàn)結(jié)果表明采用Smartbits-600網(wǎng)絡(luò)測(cè)試儀開(kāi)啟網(wǎng)口協(xié)商出來(lái)的鏈路速率是1 000Mbps,在1 000 Mbps的鏈路上丟包率為0的情況下,采用AES+SM3算法套件,64 Byte的小包單邊達(dá)到了106.1Mbps,1 420 Byte的大包單邊達(dá)到了578.8Mbps.從算法性能上看,AES+SM3算法套件和AES+SHA1算法套件的結(jié)果相比有一定差距,但是不影響設(shè)備的正常工作,算法的穩(wěn)定性和安全性符合要求.
通過(guò)實(shí)驗(yàn)數(shù)據(jù)可以看出,把SM3算法高效地集成在操作系統(tǒng)內(nèi)核,作為一種HMAC算法,能夠支持對(duì)網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行完整性校驗(yàn),同時(shí)也可以看出算法在底層的小包執(zhí)行效率相對(duì)其他算法來(lái)說(shuō)相對(duì)較低,如何優(yōu)化算法提高算法的執(zhí)行效率需要做進(jìn)一步的研究.
[1]Davis CR.IPSec_VPN的安全實(shí)施[M].周永彬,等譯.北京:清華大學(xué)出版社,2002.
[2]李師謙.基于雜湊函數(shù)的數(shù)據(jù)完整性研究[J].山東理工大學(xué)學(xué)報(bào)(自然科學(xué)版),2003(3):27-31.
[3] 王曉燕,楊先文.基于FPGA的SM3算法優(yōu)化設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2012(6):244-246.
[4]國(guó)家密碼管理局.GM/T 0004-2012.SM3密碼雜湊算法[S].北京:中國(guó)標(biāo)準(zhǔn)出版社,2012.
[5]Stinson DR.密碼學(xué)原理與實(shí)踐[M].第三版.北京:電子工業(yè)出版社,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.密碼學(xué)與網(wǎng)絡(luò)安全[M].北京:清華大學(xué)出版社, 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-),女,講師,碩士,研究方向?yàn)橛?jì)算機(jī)應(yīng)用
網(wǎng)絡(luò)出版時(shí)間:2015-01-20 17:17網(wǎng)絡(luò)出版地址:http://www.cnki.net/kcms/detail/51.1630.Z.20150120.1717.001.html
引用格式:吳瑕.SM3算法及在Linux內(nèi)核IPSEC協(xié)議棧的實(shí)現(xiàn)[J].宜賓學(xué)院學(xué)報(bào),2015,15(6):89-92.