陳紅英
(漳州城市職業(yè)學院電子信息工程系,福建 漳州 363000)
加密解密和數(shù)字簽名技術(shù)是密碼學中的重要原語。隨著信息安全技術(shù)在各領(lǐng)域應(yīng)用的日益廣泛,多種加密解密、數(shù)字簽名算法被學者提出。這些算法需要先在仿真環(huán)境下被驗證。但是,在現(xiàn)有的文獻中難以找到密碼學仿真實驗的設(shè)計與實現(xiàn)的內(nèi)容。
本文對密碼學仿真實驗的多種實驗環(huán)境進行分析,系統(tǒng)地提出了各種常用軟件(如Python、Java、C++等)在不同操作系統(tǒng)中的實驗環(huán)境搭建的方法及步驟,并在多種軟件中設(shè)計實現(xiàn)了相應(yīng)的仿真代碼。所設(shè)計和實現(xiàn)的代碼具有通用性,在各個算法的仿真實驗中可以被直接調(diào)用。
在密碼學中,一般需要對各種加解密算法和簽名算法進行性能對比和分析,分析其時間開銷和空間開銷,以比較算法的優(yōu)劣,從而真正地評判一個算法。
仿真實驗是實際實驗的前提,而實際的操作又是對仿真實驗的驗證,二者的關(guān)系是相輔相成的。當密碼學中的各種新的加密解密算法和簽名算法被提出但沒被實際應(yīng)用所驗證時,其性能只有通過仿真實驗的結(jié)果來進行分析。
密碼學中常用的加密解密算法有RSA、ECC、AES等,常用簽名算法有DSA、ECC-DSA等,還有求雙線性對運算、指數(shù)運算時間開銷算法,以及對這些算法的各種改進。在分析這些算法的優(yōu)劣時,都需要對其性能進行分析。對于密碼學中各種不同的加密解密算法和簽名算法,按照其所要求的復(fù)雜度不同而設(shè)計的仿真實驗應(yīng)使用的語言及庫都是不同的。因此,就必須根據(jù)需要來搭建不同的實驗環(huán)境,進行仿真算法的設(shè)計和實現(xiàn)。
目前,針對密碼學中仿真實驗的環(huán)境搭建、算法設(shè)計和實現(xiàn),很難找到相關(guān)的文獻,更不用說具有通用性的可操作的內(nèi)容了。
因此,密碼學中仿真實驗存在的主要問題涉及仿真實驗環(huán)境選擇、搭建以及包/庫的導(dǎo)入困難,各種加密解密的時間開銷仿真實驗算法設(shè)計困難,各種簽名算法的時間開銷仿真實驗算法設(shè)計困難,求雙線性對運算、指數(shù)運算時間開銷仿真實驗算法設(shè)計困難。
在密碼學的仿真實驗中,常用的軟件有Python、C++、Java、Solidity、Fabric。一般需要結(jié)合各個軟件中所開發(fā)的一些支撐庫來決定選擇使用哪個軟件。
下面分析各種常用軟件的實驗環(huán)境搭建的方法和步驟,從而總結(jié)出擴展到其他軟件的仿真實驗環(huán)境搭建的一般方法,所闡述的方法具有可操作性。
3.1.1 Python仿真實驗環(huán)境搭建
Python是現(xiàn)在常用的一種編程語言,比起C++,它能用較短的代碼實現(xiàn)同樣的功能。此外,它還能利用網(wǎng)絡(luò)爬蟲進行數(shù)據(jù)采集與數(shù)據(jù)挖掘。因此,學習和熟練掌握該語言的人越來越多。
在Windows 10系統(tǒng)中搭建Python仿真實驗環(huán)境,常用Python、PyCharm或Anaconda。
在Python中,與密碼學相關(guān)的庫如下:
標準庫hashlib,實現(xiàn)了SHA1、SHA224、SHA256、SHA512及MD5等多個安全哈希;
標準庫zlib,提供了Adler32和CRC32算法的實現(xiàn);
標準庫hmac,實現(xiàn)了HMAC算法;
擴展庫pycrypto和cryptography,提供了SHA系列算法和RIPEMD160等多個安全哈希算法,以及DES、AES、RSA、DSA、ELGamal等多個加密算法和數(shù)字簽名算法的實現(xiàn)。
GmSSL支持SM2/SM3/SM4等國密(國家商用密碼)算法,使用pip install<庫名>的方法安裝需要的庫。
(1)使用命令pip install rsa安裝Rsa庫;
(2)使用命令pip install common安裝Common庫;
(3)使用命令pip install pycryptodome安裝Pycryptodome庫;
(4)使用命令pip install ecdsa安裝EcDsa庫;
(5)使用命令pip install ecc安裝Ecc庫;
(6)使用命令pip install ec安裝Ec庫;
(7)使用命令pip install sm2安裝SM2庫;
(8)使用命令pip install gmssl安裝GmSSL庫。
將上述庫安裝好后,就可以編寫Python程序,進行密碼學的仿真實驗設(shè)計并運行程序,計算時間開銷。后續(xù)可以用同樣的方法繼續(xù)安裝所需要的庫。
3.1.2 C++仿真實驗環(huán)境搭建
在Windows 10系統(tǒng)中搭建C++實驗環(huán)境比較簡單,密碼學中的加密解密算法可以在VC++6.0的軟件中調(diào)試運行,也可在Visual Studio 2012中調(diào)試運行。其中,openssl庫中的sha.h含有SHA家族的5個算法,即SHA-1、SHA-224、SHA-256、SHA-384和SHA-512。利用“include openssl/sha.h”能完成sha加解密,利用“sha256.h”可實現(xiàn)數(shù)字簽名DSA算法,包含“pch.h”頭文件可完成RSA加解密算法、實現(xiàn)DES/AES算法的加解密運算,利用庫函數(shù)“ecc.h”可實現(xiàn)橢圓曲線ECC加解密算法。
3.1.3 Java仿真實驗環(huán)境搭建
在Windows 10系統(tǒng)中搭建Java仿真實驗環(huán)境,先安裝JDK,再安裝Eclipse、STS、notepad++、Visual Studio Code等。
Java的密碼算法庫主要有標準庫和專用庫,分別如下:
標準庫JCA/JCE,提供了密碼算法接口/最基本的密碼算法實現(xiàn);
標準庫JSSE,SSL/TLS協(xié)議在Java內(nèi)的實現(xiàn);
標準庫JAAS,Java的授權(quán)和認證服務(wù);
專用庫Brouncy Castle。
密碼學的仿真實驗中要用到雙線性對運算,這需要用到PBC包。PBC的一個Java封閉是JPBC[1]。在項目文件夾中創(chuàng)建一個jars文件夾,把JPBC密碼庫中的jar包放入其中。要仿真生成循環(huán)群里的生成元必須先導(dǎo)入a.properties的文件,接著把jar包導(dǎo)入到系統(tǒng)中,選中所有的jars包,配置生成路徑。利用Jecc(java橢圓曲線加密庫)實現(xiàn)ECDH加密算法。
3.1.4 區(qū)塊鏈仿真實驗環(huán)境的搭建
區(qū)塊鏈仿真實驗環(huán)境包括智能合約編寫測試部署、Fabric網(wǎng)絡(luò)的搭建與部署以及IPFS的搭建與部署。
(1)智能合約的編寫、測試、部署和運行
在Linux和Windows中,都可以用智能合約測試網(wǎng)站(https://remix.ethereum.org/)來進行智能合約的編寫和測試。智能合約的語言用的是Solidity,其中文使用說明文檔https://solidity-cn.readthedocs.io/zh/develop/[2]。在實驗環(huán)境中,通過瀏覽器訪問Remix網(wǎng)站,編寫智能合約程序,并進行編譯。在本地geth客戶端中對智能合約程序進行部署以及調(diào)用,并查看調(diào)用結(jié)果。通過以下網(wǎng)址打開Remix網(wǎng)站進行智能合約的編寫與測試:
https://remix.ethereum.org/#optimize=true&version=soljs on-v0.4.25+commit.59dbf8f1.js&appVersion=0.7.7
(2)超級賬本Hyperledger Fabric安裝與測試
在VM中首先安裝Ubuntu,然后依次安裝vim、git、curl、wget、docker、go語言,最后安裝Fabric,并用自帶的測試用例測試Fabric環(huán)境是否搭建好。
(3)IPFS的安裝部署
IPFS(星際文件系統(tǒng))是一個分布式文件系統(tǒng)協(xié)議。IPFS協(xié)議定義了文件在分布式系統(tǒng)中如何存儲、索引、傳輸。IPFS可以在Windows平臺下安裝配置。先下載https://dist.ipfs.io/#go-ipfs。然后創(chuàng)建一個ipfs節(jié)點、查看節(jié)點ID、啟動節(jié)點服務(wù)器??蓞⒖糷ttps://github.com/ipfs/go-ipfs#download-and-compile-ipfs進行源碼安裝IPFS和配置。
下面分析仿真密碼學中常用的加密解密和簽名算 法RSA、ECC、AES、DSA、ECC-DSA、SM2的 時間開銷以及雙線性對運算、指數(shù)運算的時間開銷的Python實現(xiàn)算法。C++、Java的實現(xiàn)算法是類似的,可以依此類推。
3.2.1 RSA一次加密解密的時間開銷算法實現(xiàn)
下面是密鑰長度為3 000 b時,對消息“中國福建漳州.Now is better than never.”進行RSA一次加密解密的時間開銷算法實現(xiàn)的Python程序。為了保證實驗的精確度,運行10次RSA加密解密算法,取平均時間。
#求RSA加密解密時間
3.2.2 SM2一次加密解密的時間開銷算法實現(xiàn)
下面是對消息“中國福建漳州.Now is better than never.”進行SM2一次加密解密的時間開銷算法實現(xiàn)的程序。GmSSL是一個開源的加密包的Python實現(xiàn),支持SM2/SM3/SM4等國密算法、項目采用對商業(yè)應(yīng)用友好的類BSD開源許可證,開源且可以用于閉源的商業(yè)應(yīng)用。安裝gmssl庫:pip install gmssl。
#求一次SM2加密解密所用時間
3.2.3 AES一次加密解密的時間開銷算法實現(xiàn)
下面是計算密鑰長度為16 B,即128 b時,對消息“中國福建漳州.Now is better than never.”進行一次AES加密解密的時間開銷算法實現(xiàn)的程序。
#求一次AES加密解密所用時間
3.2.4 ECC一次加密的時間開銷算法實現(xiàn)
現(xiàn)有的ECC橢圓曲線加密算法太過陳舊,無法直接調(diào)用,只能重新編寫。篇幅過長,這里略過。對消息“中國福建漳州.Now is better than never.”進行一次ECC加密所用的時間運行結(jié)果如圖1所示。目前沒有較成熟的ECC橢圓曲線的解密算法,經(jīng)ECC橢圓曲線加密算法加密后的數(shù)據(jù)要實現(xiàn)解密基本上是不可能的,也就意味著ECC橢圓曲線的加密算法在現(xiàn)階段是一種安全的加密算法,也是應(yīng)用最廣泛的一種加密算法。
圖1 計算ECC加密時間開銷
3.2.5 DSA一次簽名的時間開銷算法實現(xiàn)
取密鑰長度為1 024 b,對消息“中國福建漳州.Now is better than never.”進行DSA一次簽名的時間開銷算法實現(xiàn)的程序如下所示。
#求一次DSA簽名所用時間
3.2.6 ECC-DSA一次簽名的時間開銷算法實現(xiàn)
下面是對消息“中國福建漳州.Now is better than never.”進行ECC-DSA一次簽名的時間開銷算法實現(xiàn)的程序。因為ECDSA的實現(xiàn)需要調(diào)用ecdsa中的簽名密鑰生成方法,所以需要安裝ecdsa庫:pip install ecdsa。
#求一次ECC-DSA簽名所用時間
3.2.7 計算指數(shù)運算和雙線性對運算的時間開銷實現(xiàn)算法
以下算法實現(xiàn)了在Windows10子系統(tǒng)Debian下利用C程序計算指數(shù)運算和雙線性對運算的時間開銷。
先安裝Windows子系統(tǒng)Debian,然后安裝與配置PBC庫,再安裝依賴庫M4、flex和bison,接著安裝依賴庫GMP,最后安裝PBC。
配置好環(huán)境后,就可以設(shè)計C程序來計算一次雙線性對運算和一次指數(shù)運算的時間開銷。
把pbc.h和pbc_test.h包含到程序中。C實現(xiàn)算法如下。假設(shè)源代碼time.c存放在d:softwarelinuxprojects下,首先進入該目錄,執(zhí)行以下命令:
應(yīng)該注意的是,選擇不同的輸入文件a.param或其他,單次指數(shù)運算和雙線性對運算的時間[3]都不相同。
下面是計算一次雙線性對運算和一次指數(shù)運算的時間開銷算法實現(xiàn)的程序。
//求一次雙線性對運算和一次指數(shù)運算所用時間time.c
本文全面具體地從仿真環(huán)境搭建、算法實現(xiàn)兩個方面分析了密碼學中仿真實驗的設(shè)計與實現(xiàn)的不同應(yīng)用場景。文中所提及的全部搭建方法和實現(xiàn)算法代碼都在實際的真實軟件環(huán)境中調(diào)試通過,可以在相應(yīng)的環(huán)境中直接調(diào)用。此外,Zp上的冪指數(shù)運算gk和橢圓曲線標量乘運算kP在不同數(shù)據(jù)規(guī)模下的時間開銷算法在密碼學算法的性能分析時也經(jīng)常用到,限于篇幅本文沒有展開闡述。