張求文,王景成,隆笑,趙廣磊,胡霆,張震瑋,何軍,于長健
近年來,隨著物聯網和第三代甚至第四代移動通信技術的不斷發展,以及人們需求的日益增長,移動平臺正以其獨特的優勢受到了前所未有的關注,基于移動平臺的應用也層出不窮。然而,移動平臺的無線環境和傳感器的無人環境極大地方便了惡意攻擊者,數據與隱私保護是物聯網應用過程中巨大的挑戰之一[1],密鑰管理機制、安全路由協議、認證與訪問控制、入侵檢測與容侵容錯技術以及決策與安全控制等是今后研究的重點[2]。
現有的移動終端的運算能力愈發強大,比對稱加密更加安全的非對稱加密的運算強度已經不會成為其在移動終端上應用的瓶頸,然而,隨著安全需求的增加,RSA算法所需要的密鑰位數一直在增加,導致其加解密速度大為降低,存儲空間顯著增加,應用越來越受到限制[3]。因此人們迫切需要尋求一種運算量更小安全度更高的非對稱加密算法,于是橢圓曲線密碼體制孕育而生。
橢圓曲線密碼體制(Elliptic Curves Cryptosystems,ECC)是近年來興起的基于橢圓曲線離散對數問題(ECDLP)的性能優良的公鑰密碼體制。相比較其它的公鑰加密算法,ECC有許多優點,例如由于ECDLP比DLP困難得多,橢圓曲線系統中每個密鑰位的強度在本質上要比傳統的離散對數系統大得多[4],而且在計算負載、密鑰大小、帶寬等方面ECC均比RSA優越[5],因此ECC非常適合計算能力和帶寬傳輸有限卻又要求高速實現加密和認證的終端場合。
對于無線終端網絡的部署來說,在計算機平臺上進行網絡軟件仿真是一個檢驗可行性的好辦法,OMNeT++(Objective Modular Network Testbed in C++)是近年來流行在科學和工業領域的一款優秀的網絡仿真平臺。強大完善的圖形界面接口以及編程調試等功能使得 OMNeT++迅速成長為通信網絡和分布式系統的仿真主力。
ECDSA(Elliptic Curve Digital Signature Algorithm)是一種基于橢圓曲線密碼體制的數字簽名算法。所謂數字簽名,即是用來確認數據的來源并保護數據不被偽造的一種技術。數字簽名分為簽名和認證兩部分,一般過程是,請求方利用自身的私鑰對某特定消息進行加密處理,稱為簽名;認證方則利用請求方放出的公鑰對簽名信息進行解讀,并以此驗證請求方的合法性。具體算法,如表1所示[6]:

表1 ECDSA簽名的生成與驗證表
在表1中,參數q表示域的階;FR為域的表示;S表示種子;a,b為橢圓曲線參數;P為基點;n為P的階;h是余因子,具體參數如何參與運算參考文獻。
ECDH(Elliptic Curve Diffie-Hellman)是一種基于橢圓曲線密碼體制的密鑰交換算法,它可以使擁有各自橢圓曲線公私鑰對的交換的雙方在一個不安全的信道上協商出一個密鑰。具體算法如表2所示[7]:

表2 ECDH密鑰協商
在 OMNeT++中,首先需要做的便是定義網絡拓撲結構。在工程項目中新建一個網絡描述文件(.ned文件),用simple、network、submodules、connections等關鍵字來定義結點、當前網絡、當前網絡中的節點和節點間連接方式等。隨后,便是為每個定義過的節點新建.cc文件來設置節點的一系列活動。節點一般都繼承OMNeT++提供的基本節點類cSimpleModule。
(1)、void initialize();
此函數描述了節點在初始化時候的一系列動作,例如設置節點內部自身參數等。Initialize()函數將在節點創建時被自動調用。
(2)、void handleMessage(cMessage* msg);
此函數描述了節點在接收到一條消息時的一系列動作,例如提取消息內信息和轉發消息等。handleMessage()函數將在節點接收到消息時被自動調用。
為節點類定義實現以上兩個函數后,節點的基本功能就算是完成了。下面給出OMNeT++中比較常用的命令接口:
(1)、Define_Module(string moduleName);
此全局命令將名字為 moduleName的節點類注冊到OMNeT++中,每一個節點都必須通過將自身注冊到OMNeT++中才能被識別并正確運行,所以每個節點類都必須對應一個Define_Module命令。
(2)、send(cMessage *msg,const char *gatename,int gateindex=-1);
此函數用來將消息 msg從某個門中發送出去,其中gatename為門的名字,gateindex則是名字為gatename的門的編號,所謂的門即是兩個節點相連的通道。
(3)、scheduleAt(simtime_t t,cMessage *msg);
此函數用來在時間t發送一條自消息,即在時間t向節點自身發送消息 msg,一般被用來定時地主動觸發節點的handleMessage()函數。其中時間t可以用simTime()函數來返回當前仿真時間,而節點在handleMessage()函數中可以使用msg->isSelfMessage()函數來判斷收到的消息是否為自消息。
一些情況下,OMNeT++自帶的cMessage消息不能滿足項目的需求,此時可以通過新建.msg文件并通過 message關鍵字來創建自定義的消息類,在其中可以為自定義消息類添加各種變量,以滿足項目的需求。當然,在創建了.msg文件后還需在OMNeT++的命令行窗口使用opp_msgc命令來創建.msg對應的.cc和.h文件,并在需要使用的地方將.h文件包含進來,便可以正常使用。
為了在OMNeT++中實現ECDSA等算法,還需要一個密碼學領域的函數庫,而OpenSSL便是一個很好的選擇。OpenSSL囊括了主要的密碼學算法、常用的密鑰和證書封裝管理功能以及 SSL協議,同時以 C語言為開發語言的OpenSSL也提供了優秀的跨平臺性能。
(1)、EC_KEY EC_KEY_new_by_curve_name(int nid);此函數根據參數 nid來返回一條內置的 SEC(Standard for Efficient Cryptography)推薦的橢圓曲線,OpenSSL提供了類似 NID_secp192k1的宏來方便使用者選擇安全的橢圓曲線。
(2)、int EC_KEY_generate_key(EC_KEY* key);此函數將會在橢圓曲線對象key內部隨機生成私鑰和公鑰。
(3)、int ECDSA_sign(int type,const unsigned char* dgst,int dgstlen,unsigned char* sig,unsigned int* siglen,EC_KEY*eckey);此函數用來對在橢圓曲線對象eckey上長度為dgstlen的字符串dgst進行數字簽名,并存放在字符串sig中。
(4)、int ECDSA_verify(int type,const unsigned char*dgst,int dgstlen,const unsigned char* sig,int siglen,EC_KEY* eckey);此函數用來對在橢圓曲線對象eckey上長度為siglen的字符串sig進行數字簽名認證,解簽名的結果放入字符串dgst中,并返回認證成功與否。
( 1)、 int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP* group,EC_POINT* p,const BIGNUM* x,const BIGNUM* y,BN_CTX* ctx);
此函數用來設定橢圓曲線group的G點坐標。
( 2)、 int EC_POINT_add(const EC_GROUP* group,EC_POINT* r,const EC_POINT* a,const EC_POINT* b,BN_CTX* ctx);
此函數用來完成對橢圓曲線group上的點加計算,計算結果放入點r,其中。
( 3)、 int EC_POINT_mul(const EC_GROUP* group,EC_POINT* r,const BIGNUM* n,const EC_POINT* q,const BIGNUM* m,BN_CTX* ctx);
此函數用來完成對橢圓曲線group上的點乘計算,計算結果放入點r,其中r=G×n+q×m ,G為橢圓曲線group的基點。



本文測試所使用的機器具體配置是CPU為Intel Core i3 380M,主頻為2.53GHz。算法耗時性能指標,如表3所示:

表3 耗時性能指標
算法耗時曲線圖,如圖1所示:

圖1 平臺處理時間與節點數量關系圖
從上面的表格數據以及曲線圖中可以看到,就ECDSA簽名算法來說,節點在100以后基本呈線性增長趨勢,而在100個節點以下的時候,平臺處理時間與節點數呈非線性關系,故而在整體網絡節點超過100的時候,具體平臺處理時間等即為可估計參數。
相比于 ECDSA一次簽名認證成功后即不再進行,ECDH在每次密鑰更新后都要重新進行,故而ECDH的時間與節點關系更值得考慮,但是從圖1可以看出,紅色曲線基本上呈線性增長趨勢,在節點數量少于100時的非線性特征也較為不明顯,故而可以較好的估計平臺整體時間消耗。
最后,由圖1中的數據可以看出,節點數量縱使達到200后,平臺的處理時間仍舊不到0.4s,而密鑰交換所用時間更是不到 0.15s。而文章仿真所用電腦的性能更是遠遠低于工程應用的服務器設備,故而橢圓曲線密碼體制在工程項目中的具體應用具有十分良好的發展前景。
本文介紹了包括ECDSA和ECDH協議的橢圓曲線密碼體系的具體算法及實現方法,并詳細描述了基于OPENSLL庫的 OMNET++的各方面基本接口和庫函數相關接口及其應用方法。介紹了ECDSA和ECDH實現的核心代碼內容,并仿真驗證了可行性。最后,通過平臺時間消耗和節點數量的關系圖,對橢圓曲線密碼體制的可應用性進行了說明。
[1]ITU.The Internet of Thing [EB/OL].(2005-12-17)[2010-07-03].http://www.itu.int/internetofthings
[2]楊庚,許建,陳偉,祁正華,王海勇.物聯網安全特征與關鍵技術[J].南京郵電大學科技處;南京郵電大學計算機學院,2010(04)
[3]徐學洲,何云升.橢圓曲線密碼體制應用研究.[M]西安電子科技大學出版社,2006
[4]Don B Johnson,Alfred J Menezes.Elliptic Curve Digital Signature Algorithm (ECDSA)[Z/OL].http://www.certicom.com/resources/download/ecdsa.ps.
[5]王德力.ECDSA在移動電子商務中的應用.[M]東北大學出版社,2005
[6]張偉.ECDSA算法實現及其安全性分析[J].信息與電子工程,2003(02)
[7]邵曉博.橢圓曲線密碼體制中密鑰協商方案改進的研究[J].計算機安全,2010(02)