易傳佳 左黎明 陳藝琳
(華東交通大學理學院 江西 南昌 330013) (華東交通大學系統工程與密碼學研究所 江西 南昌 330013)
隨著現代物流業迅猛發展,鐵路物流憑借運量大、輻射廣、安全可靠等特點成為了現代物流業中的主要方式之一[1]。近年來,鐵路交通事故頻發,僅2020年,我國已經發生了三起鐵路交通事故[2],造成了重大的人員和財產損失。“6·13”溫嶺槽罐車爆炸事故造成20人死亡,172人受傷[3]。鐵路物流要防范上述事故的發生,必須建立有效的智能監控平臺,實時保證鐵路運輸的安全性。依托新興的大數據、云計算、人工智能等互聯網技術,鐵路物流實時監控系統的設計已經成為當前的研究熱點[4-6]。在復雜的互聯網環境下,物流實時監控系統的數據交互過程存在信息泄露和信息篡改的網絡安全隱患,這會嚴重威脅到整個監控系統的穩定運行。物流監控系統存在風險的根本主要在于數據來源缺乏安全性認證,數據傳輸缺乏完整性保護。針對鐵路物流實時監控系統存在的信息安全問題,需要一種高效安全的簽名方案來解決。在網絡傳輸帶寬受限環境中,具有短的消息簽名長度的簽名方案很適用。目前縮短簽名長度有兩種方式:(1) 設計短簽名方案,短簽名的概念由Boneh等[7]首次提出,在同等安全條件下,其簽名長度與DSA簽名相比縮短一半;(2) 直接壓縮傳輸的消息,該方法源于Nyberg等[8]首次提出的具有消息恢復功能的簽名方案,該方案不需要將消息同簽名一起傳送給驗證者,而是將原始消息嵌入到簽名,驗證者可以自行從簽名中恢復原始消息。本文主要研究第二種具有消息恢復功能的簽名方案并應用到鐵路物流實時監控系統中。
Shamir[9]在1984年提出了基于身份的密碼體制,用戶私鑰通過一個可信的私鑰生成器(Private Key Generator,PKG)利用系統主密鑰和用戶身份信息生成。Ma[10]構造了一種高效的基于身份的群簽名方案。Li[11]提出了一種具有消息恢復的基于身份的強指定驗證者簽名方案。Rao等[12]針對表達型線性秘密共享方案的可實現訪問結構,設計了兩個基于密鑰策略及屬性的具有消息恢復的密鑰隔離簽名方案。Chande等[13]應用自認證密鑰和消息恢復的概念提出了一個有效的多代理簽名方案,該方案可以同時執行公鑰驗證、多代理簽名驗證和消息恢復。Verma等[14]給出了一種可證明安全的、高效的基于身份的消息恢復盲簽名方案。James等[15]利用盲簽名和消息恢復特性,提出了一種基于身份的具有消息恢復的無配對盲簽名方案。闞元平[16]在格密碼基礎上提出了一種具有消息恢復功能的身份簽名方案,該方案能夠抵抗偽造攻擊。針對鐵路物流實時監控系統存在的信息安全問題,本文提出一種高效的基于身份的帶消息恢復功能的簽名方案,并以該簽名方案為核心設計一種身份認證方案,整個方案交互過程計算量小、數據傳輸少,可以有效保障物流監控系統數據來源的可靠性和安全性。
物流實時監控系統整體架構如圖1所示,主要由電子標簽、數據采集裝置和云服務平臺三部分組成。

圖1 整體架構
電子標簽內嵌有密碼芯片,數據采集裝置以樹莓派為控制中心,通過傳感器實時采集當前的數據,并通過網絡通信模塊實現與云服務平臺的通信。數據采集裝置中傳感器包括定位模塊、溫度傳感器、濕度傳感器、振動傳感器、壓力傳感器。
在該物流實時監控系統中,貨物封箱完畢后,電子標簽粘貼于貨物的啟封處,當電子標簽激活后,如果沒有收到云服務平臺的授權,電子標簽的損壞將會導致數據采集裝置向云服務平臺發送警告信息。在物流過程中,數據采集裝置通過傳感器實時采集貨物當前的狀態數據并傳輸到電子標簽中,然后電子標簽對狀態數據進行數字簽名,再由數據采集裝置將簽名信息發送給云服務平臺,云服務平臺接收簽名信息并驗證簽名,簽證成功后恢復數據信息,然后將數據保存在云服務器中。
基于身份的具有消息恢復功能的簽名方案[17]由系統初始化、私鑰解析、簽名和驗證簽名四個算法組成,具體描述如下:
1) 系統初始化:給定安全參數,輸出系統參數和主密鑰,PKG秘密保存主密鑰,公開系統參數。
2) 私鑰解析:輸入用戶身份ID,計算用戶私鑰,并通過一個安全的通道發送給用戶。
3) 簽名:輸入系統參數、身份ID和用戶私鑰,輸出簽名,并發給驗證者。
4) 驗證簽名:輸入系統參數、簽名,輸出驗證結果:“TRUE”或者“FALSE”,輸出恢復的完整消息。
在物流實時監控系統中,云服務平臺中有私鑰生成器(PKG),每個電子標簽有唯一的ID,PKG通過電子標簽ID生成簽名私鑰,在電子標簽初始化時,向電子標簽內注入系統參數以及PKG生成的私鑰。當云服務器對簽名信息進行驗證時,驗證成功則輸出恢復的完整消息,驗證失敗則發出警告信息。
基于橢圓曲線上離散對數問題的難解性,提出一種基于身份的具有消息恢復功能的簽名方案。


H3:{0,1}*×G×G→{0,1}l1+l2,
F1:{0,1}l1→{0,1}l2,
F2:{0,1}l2→{0,1}l1。
最后PKG掌握并保密系統主密鑰s,公開系統參數params={q,P,e,Ppub,H1,H2,H3,F1,F2,l1,l2}。

3) 簽名:對任意給定的消息m∈{0,1}l1進行簽名,過程如下:
T=tP
(1)
h2=H2(ID,R,T)
(2)
u=t+xIDh2
(3)
(2) 計算:
h3=H3(ID,R,uP)∈{0,1}l1+l2
(4)
h4=F1(m)‖(F2(F1(m))⊕m)∈{0,1}l1+l2
(5)
h=h3⊕h4
(6)
則σ=(h,T)為電子標簽對消息m的簽名。
4) 簽名驗證:對給定消息m的簽名σ=(h,T),云服務端可以驗證簽名合法性并恢復出原始消息,驗證過程如下:
(1) 依次計算:
h1=H1(ID)
(7)
h2=H2(ID,R,T)
(8)
h3=H3(ID,R,T+h2R+h1h2Ppub)
(9)
(2) 計算h4=h3⊕h,從h4的二進制串表示中分離出長度為l2的串f1和長度為l1的串f2,恢復消息m′=F2(f1)⊕f2。
(3) 驗證等式f1=F1(m′)是否成立,若成立則接受簽名σ=(h,T)為合法簽名,并輸出1,否則輸出0。正確情況下f1=F1(m)和f2=(F2(F1(m))⊕m),因此我們不難看出消息恢復過程的正確性。
整個簽名驗證和消息恢復過程正確性證明如下:
h3=H3(ID,R,uP)=
H3(ID,R,(t+(r+sh1)h2)P)=
H3(ID,R,(t+xIDh2)P)=
H3(ID,R,T+h2R+h1h2Ppub)
(10)
h4=h3⊕h
(11)
由于:
h4=F1(m)‖(F2(F1(m))⊕m)
(12)
f1=F1(m)
(13)
f2=(F2(F1(m))⊕m)
(14)
可得:
m′=F2(f1)⊕f2=
(F2(F1(m)))⊕(F2(F1(m))⊕m=m
(15)
圖2為具有消息恢復的身份認證方案數據交互原理圖,其中:Sign表示簽名;Verify表示驗證簽名。方案具體的交互流程如下:
(1) 數據采集端采集數據。數據采集端通過傳感器采集實時數據data,然后將實時數據data傳輸到電子標簽。
(2) 電子標簽生成簽名。電子標簽接收數據采集端傳輸的數據data后,然后調用簽名算法對data進行簽名處理,最后電子標簽將簽名結果和電子標簽ID以ID#Sig的封包格式傳輸到數據采集端。
(3) 數據采集端將簽名結果傳輸到服務端。數據采集端將ID與簽名結果以ID#Sig的封包格式通過網絡通信模塊傳輸到服務端。
(4) 服務端身份驗證。服務端接收數據采集端傳輸的消息封包后,對消息封包解析,得到ID和Sig,通過ID檢索對應的主公鑰Ppub對簽名進行驗證,如果驗證成功,恢復出消息得到data并保存到云服務器中,如果驗證失敗則提示異常警告。

圖2 數據交互
在Windows 7 64位操作系統Microsoft Visual Studio 2012微軟平臺下,采用C#輕量級密碼術包(bouncy castle)實現了本文方案,實驗結果顯示本方案簽名所消耗時間為0.057 s,驗證所消耗時間為0.054 s,表明該簽名方案效率較高。實現結果如圖3所示,核心代碼如下:
//簽名算法
BigInteger t=new BigInteger("8");
//計算T=tP
ECPoint T=myecc.ecc_point_g.Multiply(t);
string RR=R.X.ToBigInteger().ToString()+
R.Y.ToBigInteger().ToString();
string TT=T.X.ToBigInteger().ToString()+
T.Y.ToBigInteger().ToString();
string IDRT=ID+RR+TT;
BigInteger uu=new BigInteger(
myhash.TanGetDigestByteArray(IDRT));
//計算u=H2(ID,R,T)
BigInteger u=uu.Mod(myecc.ecc_n);
//計算U=t+xID*u
BigInteger U=
t.Add(xID.Multiply(u)).Mod(myecc.ecc_n);
ECPoint UP=myecc.ecc_point_g.Multiply(U);
string strUP=UP.X.ToBigInteger().ToString()+
UP.Y.ToBigInteger().ToString();
string IDRUP=ID+RR+strUP;
//計算h1=H3(ID,R,UP)
byte[]h_1=
myhash.TanGetDigestByteArray(IDRUP);
byte[]h1=new byte[64];
Array.Copy(h_1,0,h1,0,32);
Array.Copy(h_1,0,h1,32,32);
//計算h2
byte[]F1=myhash.TanGetDigestByteArray(m);
byte[]F2=myhash.TanGetDigestByteArray(F1);
byte[]F2Xorm=HexXorByte(F2,m);
byte[]h2=new byte[64];
Array.Copy(F1,0,h2,0,32);
Array.Copy(F2Xorm,0,h2,32,32);
//計算h等于h1與h2的“異或”
byte[]h=HexXorByte(h1,h2);
//(4)簽名驗證
//計算R+l*Pub
ECPoint TRu=T.Add(xID_rignt.Multiply(u));
string TRu_xy=TRu.X.ToBigInteger().ToString()+
TRu.Y.ToBigInteger().ToString();
string IDRTRu=ID+RR+TRu_xy;
//計算h1=H3(ID,R,T+(R+l*Pub)u)
byte[]h1_1=
myhash.TanGetDigestByteArray(IDRTRu);
byte[]h11=new byte[64];
Array.Copy(h1_1,0,h11,0,32);
Array.Copy(h1_1,0,h11,32,32);
//計算h2=h與h1的“異或”
byte[]h21=HexXorByte(h,h11);
byte[]h21l2=new byte[32];
byte[]h21l1=new byte[32];
//截取h2的前l1長度的字節
Array.Copy(h21,0,h21l2,0,32);
//截取h2的后l2長度的字節
Array.Copy(h21,32,h21l1,0,32);
byte[]F21=myhash.TanGetDigestByteArray(h21l2);
//恢復消息m
byte[]m1=HexXorByte(h21l1,F21);
//消息恢復比較
byte[]left=myhash.TanGetDigestByteArray(m1);
byte[]right=h21l2;
if (ByteEquals(left,right)){
Console.WriteLine("消息恢復成功,簽名驗證通過!");
}
else{
Console.WriteLine("消息恢復失敗,簽名驗證失敗!");
}
Console.WriteLine("原消息:{0}",msg);
Console.WriteLine("恢復的消息:{0}",
Encoding.UTF8.GetString(m1));

圖3 方案實現結果
表1為本文方案與其他基于身份的簽名方案的性能比較,其中:M表示標量乘運算;P表示雙線性對運算;E表示指數運算;|G1|是G1中的元素長度;|q|是Zq中元素的長度;n是一個常數;“√”表示具有可恢復消息功能;“×”表示不具有可恢復消息功能。

表1 本文方案與現有方案性能比較
由表1可得,與其他方案相比,本文方案簽名長度是最短的,與文獻[14]方案接近。在計算量方面,文獻[14]使用了3次雙線性運算,文獻[18]使用了2次雙線性運算,文獻[19]使用了3次雙線性運算,文獻[20]使用了1次雙線性運算,本文方案沒有使用雙線性運算,由于雙線性對的計算消耗是最大的,因此本文方案相比其他簽名方案計算量較小,所需的傳輸帶寬更低、性能更優、運算效率更高。
針對鐵路物流實時監控系統存在的信息安全問題,本文結合基于身份密碼體制和消息恢復功能,提出基于身份具有消息恢復功能的簽名方案。并以此方案為基礎,設計一種鐵路物流實時監控系統中具有消息恢復的身份認證方案。使用C#語言版輕量級密碼包對方案進行實驗仿真,與幾種基于身份的簽名方案進行了效率比較。該方案可以減少通信量、降低通信代價,能很好地用于鐵路物流實時監控系統中。