陈红英
(漳州城市职业学院电子信息工程系,福建 漳州 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在不同数据规模下的时间开销算法在密码学算法的性能分析时也经常用到,限于篇幅本文没有展开阐述。