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