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