陳紅英
(漳州城市職業學院電子信息工程系,福建 漳州 363000)
加密解密和數字簽名技術是密碼學中的重要原語。隨著信息安全技術在各領域應用的日益廣泛,多種加密解密、數字簽名算法被學者提出。這些算法需要先在仿真環境下被驗證。但是,在現有的文獻中難以找到密碼學仿真實驗的設計與實現的內容。
本文對密碼學仿真實驗的多種實驗環境進行分析,系統地提出了各種常用軟件(如Python、Java、C++等)在不同操作系統中的實驗環境搭建的方法及步驟,并在多種軟件中設計實現了相應的仿真代碼。所設計和實現的代碼具有通用性,在各個算法的仿真實驗中可以被直接調用。
在密碼學中,一般需要對各種加解密算法和簽名算法進行性能對比和分析,分析其時間開銷和空間開銷,以比較算法的優劣,從而真正地評判一個算法。
仿真實驗是實際實驗的前提,而實際的操作又是對仿真實驗的驗證,二者的關系是相輔相成的。當密碼學中的各種新的加密解密算法和簽名算法被提出但沒被實際應用所驗證時,其性能只有通過仿真實驗的結果來進行分析。
密碼學中常用的加密解密算法有RSA、ECC、AES等,常用簽名算法有DSA、ECC-DSA等,還有求雙線性對運算、指數運算時間開銷算法,以及對這些算法的各種改進。在分析這些算法的優劣時,都需要對其性能進行分析。對于密碼學中各種不同的加密解密算法和簽名算法,按照其所要求的復雜度不同而設計的仿真實驗應使用的語言及庫都是不同的。因此,就必須根據需要來搭建不同的實驗環境,進行仿真算法的設計和實現。
目前,針對密碼學中仿真實驗的環境搭建、算法設計和實現,很難找到相關的文獻,更不用說具有通用性的可操作的內容了。
因此,密碼學中仿真實驗存在的主要問題涉及仿真實驗環境選擇、搭建以及包/庫的導入困難,各種加密解密的時間開銷仿真實驗算法設計困難,各種簽名算法的時間開銷仿真實驗算法設計困難,求雙線性對運算、指數運算時間開銷仿真實驗算法設計困難。
在密碼學的仿真實驗中,常用的軟件有Python、C++、Java、Solidity、Fabric。一般需要結合各個軟件中所開發的一些支撐庫來決定選擇使用哪個軟件。
下面分析各種常用軟件的實驗環境搭建的方法和步驟,從而總結出擴展到其他軟件的仿真實驗環境搭建的一般方法,所闡述的方法具有可操作性。
3.1.1 Python仿真實驗環境搭建
Python是現在常用的一種編程語言,比起C++,它能用較短的代碼實現同樣的功能。此外,它還能利用網絡爬蟲進行數據采集與數據挖掘。因此,學習和熟練掌握該語言的人越來越多。
在Windows 10系統中搭建Python仿真實驗環境,常用Python、PyCharm或Anaconda。
在Python中,與密碼學相關的庫如下:
標準庫hashlib,實現了SHA1、SHA224、SHA256、SHA512及MD5等多個安全哈希;
標準庫zlib,提供了Adler32和CRC32算法的實現;
標準庫hmac,實現了HMAC算法;
擴展庫pycrypto和cryptography,提供了SHA系列算法和RIPEMD160等多個安全哈希算法,以及DES、AES、RSA、DSA、ELGamal等多個加密算法和數字簽名算法的實現。
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程序,進行密碼學的仿真實驗設計并運行程序,計算時間開銷。后續可以用同樣的方法繼續安裝所需要的庫。
3.1.2 C++仿真實驗環境搭建
在Windows 10系統中搭建C++實驗環境比較簡單,密碼學中的加密解密算法可以在VC++6.0的軟件中調試運行,也可在Visual Studio 2012中調試運行。其中,openssl庫中的sha.h含有SHA家族的5個算法,即SHA-1、SHA-224、SHA-256、SHA-384和SHA-512。利用“include openssl/sha.h”能完成sha加解密,利用“sha256.h”可實現數字簽名DSA算法,包含“pch.h”頭文件可完成RSA加解密算法、實現DES/AES算法的加解密運算,利用庫函數“ecc.h”可實現橢圓曲線ECC加解密算法。
3.1.3 Java仿真實驗環境搭建
在Windows 10系統中搭建Java仿真實驗環境,先安裝JDK,再安裝Eclipse、STS、notepad++、Visual Studio Code等。
Java的密碼算法庫主要有標準庫和專用庫,分別如下:
標準庫JCA/JCE,提供了密碼算法接口/最基本的密碼算法實現;
標準庫JSSE,SSL/TLS協議在Java內的實現;
標準庫JAAS,Java的授權和認證服務;
專用庫Brouncy Castle。
密碼學的仿真實驗中要用到雙線性對運算,這需要用到PBC包。PBC的一個Java封閉是JPBC[1]。在項目文件夾中創建一個jars文件夾,把JPBC密碼庫中的jar包放入其中。要仿真生成循環群里的生成元必須先導入a.properties的文件,接著把jar包導入到系統中,選中所有的jars包,配置生成路徑。利用Jecc(java橢圓曲線加密庫)實現ECDH加密算法。
3.1.4 區塊鏈仿真實驗環境的搭建
區塊鏈仿真實驗環境包括智能合約編寫測試部署、Fabric網絡的搭建與部署以及IPFS的搭建與部署。
(1)智能合約的編寫、測試、部署和運行
在Linux和Windows中,都可以用智能合約測試網站(https://remix.ethereum.org/)來進行智能合約的編寫和測試。智能合約的語言用的是Solidity,其中文使用說明文檔https://solidity-cn.readthedocs.io/zh/develop/[2]。在實驗環境中,通過瀏覽器訪問Remix網站,編寫智能合約程序,并進行編譯。在本地geth客戶端中對智能合約程序進行部署以及調用,并查看調用結果。通過以下網址打開Remix網站進行智能合約的編寫與測試:
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環境是否搭建好。
(3)IPFS的安裝部署
IPFS(星際文件系統)是一個分布式文件系統協議。IPFS協議定義了文件在分布式系統中如何存儲、索引、傳輸。IPFS可以在Windows平臺下安裝配置。先下載https://dist.ipfs.io/#go-ipfs。然后創建一個ipfs節點、查看節點ID、啟動節點服務器。可參考https://github.com/ipfs/go-ipfs#download-and-compile-ipfs進行源碼安裝IPFS和配置。
下面分析仿真密碼學中常用的加密解密和簽名算 法RSA、ECC、AES、DSA、ECC-DSA、SM2的 時間開銷以及雙線性對運算、指數運算的時間開銷的Python實現算法。C++、Java的實現算法是類似的,可以依此類推。
3.2.1 RSA一次加密解密的時間開銷算法實現
下面是密鑰長度為3 000 b時,對消息“中國福建漳州.Now is better than never.”進行RSA一次加密解密的時間開銷算法實現的Python程序。為了保證實驗的精確度,運行10次RSA加密解密算法,取平均時間。
#求RSA加密解密時間
3.2.2 SM2一次加密解密的時間開銷算法實現
下面是對消息“中國福建漳州.Now is better than never.”進行SM2一次加密解密的時間開銷算法實現的程序。GmSSL是一個開源的加密包的Python實現,支持SM2/SM3/SM4等國密算法、項目采用對商業應用友好的類BSD開源許可證,開源且可以用于閉源的商業應用。安裝gmssl庫:pip install gmssl。
#求一次SM2加密解密所用時間
3.2.3 AES一次加密解密的時間開銷算法實現
下面是計算密鑰長度為16 B,即128 b時,對消息“中國福建漳州.Now is better than never.”進行一次AES加密解密的時間開銷算法實現的程序。
#求一次AES加密解密所用時間
3.2.4 ECC一次加密的時間開銷算法實現
現有的ECC橢圓曲線加密算法太過陳舊,無法直接調用,只能重新編寫。篇幅過長,這里略過。對消息“中國福建漳州.Now is better than never.”進行一次ECC加密所用的時間運行結果如圖1所示。目前沒有較成熟的ECC橢圓曲線的解密算法,經ECC橢圓曲線加密算法加密后的數據要實現解密基本上是不可能的,也就意味著ECC橢圓曲線的加密算法在現階段是一種安全的加密算法,也是應用最廣泛的一種加密算法。

圖1 計算ECC加密時間開銷
3.2.5 DSA一次簽名的時間開銷算法實現
取密鑰長度為1 024 b,對消息“中國福建漳州.Now is better than never.”進行DSA一次簽名的時間開銷算法實現的程序如下所示。
#求一次DSA簽名所用時間
3.2.6 ECC-DSA一次簽名的時間開銷算法實現
下面是對消息“中國福建漳州.Now is better than never.”進行ECC-DSA一次簽名的時間開銷算法實現的程序。因為ECDSA的實現需要調用ecdsa中的簽名密鑰生成方法,所以需要安裝ecdsa庫:pip install ecdsa。
#求一次ECC-DSA簽名所用時間
3.2.7 計算指數運算和雙線性對運算的時間開銷實現算法
以下算法實現了在Windows10子系統Debian下利用C程序計算指數運算和雙線性對運算的時間開銷。
先安裝Windows子系統Debian,然后安裝與配置PBC庫,再安裝依賴庫M4、flex和bison,接著安裝依賴庫GMP,最后安裝PBC。
配置好環境后,就可以設計C程序來計算一次雙線性對運算和一次指數運算的時間開銷。
把pbc.h和pbc_test.h包含到程序中。C實現算法如下。假設源代碼time.c存放在d:softwarelinuxprojects下,首先進入該目錄,執行以下命令:
應該注意的是,選擇不同的輸入文件a.param或其他,單次指數運算和雙線性對運算的時間[3]都不相同。
下面是計算一次雙線性對運算和一次指數運算的時間開銷算法實現的程序。
//求一次雙線性對運算和一次指數運算所用時間time.c
本文全面具體地從仿真環境搭建、算法實現兩個方面分析了密碼學中仿真實驗的設計與實現的不同應用場景。文中所提及的全部搭建方法和實現算法代碼都在實際的真實軟件環境中調試通過,可以在相應的環境中直接調用。此外,Zp上的冪指數運算gk和橢圓曲線標量乘運算kP在不同數據規模下的時間開銷算法在密碼學算法的性能分析時也經常用到,限于篇幅本文沒有展開闡述。