APP下载

改进SM2签名方法的区块链数字签名方案

2021-07-30杨龙海王学渊蒋和松

计算机应用 2021年7期
关键词:私钥哈希密钥

杨龙海,王学渊,蒋和松

(西南科技大学信息工程学院,四川绵阳 621010)

0 引言

近年来,新兴的区块链技术成为了研究热点,由于区块链技术的去中心化和信任机制的提出,数字签名显得尤为重要。联盟链是降低了去中心化要求的由多个机构共同管理和维护的区块链,其共识过程中的身份认证关乎整个链的防伪造和篡改的能力,也是当前联盟链的技术难点之一[1]。联盟链中的共识机制[2]维持了整个区块链的不可篡改性和链的一致性,因此保证共识机制中的每个共识节点都是有身份认证的诚实节点,防止伪造身份的恶意节点对共识过程进行破坏是一个值得研究的问题。SM2 算法[3]是我国提出的一种椭圆曲线公钥密码算法,相比RSA 算法,其密码复杂度高、处理速度快、机器性能消耗更小,可以很好地应用于区块链。

联盟链由于其中心化程度的降低,因此防止签名篡改伪造可以降低其带来的影响。针对采用了实用拜占庭容错[4](Practical Byzantine Fault Tolerance,PBFT)算法的联盟链环境,众多的节点导致在签名过程中的消耗增加。因此在防止签名篡改伪造的基础上,提高多节点间的签名过程的效率,是一个比较有价值的研究方向。苏吟雪等[5]通过零知识证明和同态加密方法,实现了基于SM2 的具有安全性证明的双方共同签名方案,可以很好地提高签名过程中的安全性;但增加了通信次数,并且一次签名仍需要执行4 次模逆运算,存在较大的算法开销。侯红霞等[6]通过拆分私钥,减少了私钥被窃取的危险性,同时结合比特承诺和同态加密方法实现基于SM2的两方协作的签名方案,在安全性上有很大的提高;但整个方案十分繁琐,且同态加密和模逆运算也增加了运算负担。兰修文[7]研究适用于SM2 曲线的点运算算法、适用于SM2 素数的快速约减算法、适用于SM2 素数的快速Montgomery 模乘算法以及Montgomery 模逆算法,通过改进SM2 底层运算方式,提高了SM2数字签名的效率,但仍没有避免模逆运算的消耗。肖帅等[8]通过引入双参数回避了SM2 算法中求模逆的运算,提高了签名速度;但密钥仍是单方面保存,无法避免密钥被窃取从而恶意伪签名的问题。当前的区块链应用大都直接运用公钥密码算法的数字签名,缺乏高效安全的适用于联盟链的签名方案。

本文根据当前联盟链的实际应用环境,提出一种基于密钥分割和国家标准SM2 签名算法的可信第三方证明签名方案。该方案将密钥分割获得的SM2 私钥分割为两部分:一部分签名方本地保存,另一部分通过密钥交换协议存储在可信第三方的独立本地数据库中,共识时签名方须向可信第三方提供身份证明后,结合两部分私钥才能进行最后的签名过程,实现了身份的双重认证,提高了身份认证的安全性;同时结合哈希摘要算法构建的多项式消去了SM2算法中耗时的模逆运算,提高了签名速度。

1 预备知识

1.1 PBFT共识算法

PBFT 主要用于解决区块链节点间的拜占庭容错问题[9],在R>3f+1(R为总节点数,f为错误节点数)的前提下,系统能保持安全性和活性,能使区块链所有节点执行相同的序列操作,但由于其效率受节点数量影响较多,故运用于联盟链。PBFT是一种状态机副本复制算法[10],即将服务作为状态机进行建模,状态机在分布式系统的不同节点进行副本复制。每个状态机的副本都保存了服务的状态,同时也实现了服务的操作。在PBFT 算法中存在三种角色:客户端、主节点和从节点,其中主节点和从节点都进行数据备份。所有的副本在一个被称为视图的轮换过程中运作。在某个视图中,一个副本作为主节点,其他副本作为备份。视图是连续编号的整数。主节点由公式p=vmod|R|计算得到,其中:v是视图编号,p是副本编号,|R|是副本集合的个数。当主节点失效时,就需要启动视图更换过程,切换主节点,生成新的视图v+1,并在该视图下继续共识过程。共识过程如图1所示。

图1 PBFT共识过程示意图Fig.1 Schematic diagram of PBFT consensus process

整个共识过程具体如下:

1)REQUEST 阶段:客户端向主节点发起请求,其中o为请求的具体操作,t为请求时客户端追加的时间戳,c为客户端标识。REQUEST:包含消息内容m,以及消息摘要d(m)。客户端对请求进行签名。

2)PRE-PREPARE 阶段:主节点收到客户端的请求,进行客户端请求消息签名校验,将非法请求丢弃,如果是正确请求则分配一个编号n,编号n主要用于对客户端的请求进行排序。然后广播一条进行过主节点签名的消息给其他副本节点。其中v为当前视图编号,d为接收到的REQEUST 阶段消息摘要,m为接收到的REQEUST阶段消息内容。

3)PREPARE 阶段:从节点i收到主节点的PREPREPARE 消息,验证主节点的消息签名,验证从节点是否已经收到视图编号v和请求序号n均相同的PRE-PREPARE 消息,将非法请求丢弃,如果是正确请求则从节点i向其他节点包括主节点发送一条带自己签名的消息。

4)COMMIT 阶段:主节点和从节点收到PREPARE 消息,验证从节点PREPARE 消息签名是否正确,将非法请求丢弃,如果是正确请求并且从节点i已收到了2f+1 个验证通过的PREPARE 消息,则向其他节点包括主节点发送一条带自己签名的消息。

5)REPLY 阶段:主节点和从节点收到COMMIT 消息,验证COMMIT消息签名是否正确,将非法请求丢弃,如果是正确请求并且从节点i已收到了2f+1 个验证通过的COMMIT 消息,则共识通过,运行客户端的请求操作o。

1.2 SM2签名算法

SM2 是国家密码管理局于2010 年发布的基于椭圆曲线离散对数困难问题的椭圆曲线公钥密码算法,包含了数字签名算法、密钥交换协议和公钥加密算法[11],成为了当前我国公钥算法标准GM/T 0003.2—2012,并进入国际标准ISO/IEC 14888-3。该数字签名算法如下:

1)密钥产生:输入SM2 椭圆曲线参数parms(椭圆曲线方程Ep、大素数p、基点G、基点的阶n),随机生成私钥d∈[1,n-1]秘密保存,利用公私钥关系生成公钥:

式中,PS即为得到的SM2 公钥,该式是SM2 运用于加密和签名的重要依据。

2)SM2 签名过程:输入SM2 椭圆曲线参数parms、私钥d和待签名的消息M同时计算杂凑值ZA。

式中:IDA是用户的可辨别标识,ENTLA是IDA的长度,a、b是椭圆曲线的系数,xG、yG分别是基点G的横纵坐标值,xA、yA分别为公钥横纵坐标值。

得到杂凑值ZA后计算与待签名消息M的哈希摘要e:

随机产生k∈[1,n-1],并由此计算椭圆曲线点X1:

计算签名参数r和s输出签名(r,s):

3)SM2 签名验证过程:输入parms、验证方拥有的公钥PS和待签名验证的消息M以及签名方传过来的签名(r′,s′),按式(3)求取待签名验证消息M的哈希摘要e,并计算t。

验证t是否等于零,若等于零则签名验证失败,否则计算椭圆曲线点X′1:

验证r′=(e′+x′1)modn是否成立,成立则签名验证成功。

2 改进SM2区块链签名方案

传统SM2签名方案运用于联盟链的PBFT共识机制,在执行一致性协议时节点间会进行大量的通信并伴随着大量的签名和签名验证过程,随着节点数量增多,网络通信量会快速增长,节点密钥的保存和交换会变得异常复杂,进而影响区块链的效率和安全性。为提高节点间密钥保存和交换的安全性,如图2 所示,本文方案建立了可信第三方作为节点管理中心[12],该节点管理中心只提供节点管理功能如辅助签名,不参与共识,对PBFT共识的中心化程度影响较小。

图2 改进签名方案架构Fig.2 Structure of improved signature scheme

假定节点管理中心对100 个共识节点进行管理,根据拜占庭容错问题,当共识节点中故障及非法节点达到f≥(R-1)/3(其中R为总的共识节点数量,f为故障及非法节点的数量),即整个共识系统达到甚至超过33 个故障及非法节点时,会导致整个联盟链的共识系统失去其安全性和活性。由于节点管理中心不参与共识,其本身在共识阶段对联盟链的中心化程度的影响微乎其微,那么会对共识产生影响的只会在辅助各共识节点的签名过程中。由于每一个共识节点的加入受到已有共识节点的监督,故共识节点的总数不会变化,也就是节点管理中心不能避开所有节点添加其他非法节点,节点管理中心只能在已有的节点上来影响共识,也就是必须有33 个甚至超过33 个非法节点共同参与才会影响联盟链的安全性和活性,因此节点管理中心对中心化程度和系统安全性影响不大。

所有参与共识过程的节点在生成密钥对时,将私钥分割为两部分,一部分本地保存,另一部分由密钥交换协议交予节点管理中心,每次参与共识时,须先向节点管理中心验证身份(哈希密码验证)后,由节点管理中心协助完成签名与签名验证。

2.1 算法描述

设SM2的椭圆曲线参数为parms,节点管理中心为CA,签名共识节点方为Signer,签名验证共识节点方为Verifier。其整个签名方案如下:

1)密钥生成及分割:当联盟链产生新的PBFT 共识节点时,由CA 为该节点建立节点档案库,存储节点的IP 等信息,同时产生两个随机数d1和d2(其中d1+d2∈[1,n-1])分别作为Signer私钥分量和CA 私钥分量,由SM2 密钥生成公钥PS=[d1+d2]G,记录当前时间戳进行哈希加密作为身份密码并由密钥交换协议将身份密码PW和Signer 私钥分量d1传给Signer。图3给出了密钥生成的具体过程。

图3 改进SM2签名密钥生成流程Fig.3 Key generation process of improved SM2 signature

给出伪代码实现如下:

2)签名及签名验证:签名过程如图4 所示,Signer 先向CA递交哈希密码PW进行身份验证,验证不通过不予协助签名,CA 记录此信息,该节点视为PBFT 故障节点。验证通过后利用Signer私钥分量对消息M进行签名。Signer利用式(3)计算待签名消息M的哈希摘要e,同时随机产生1 组α,β∈[1,n-1],与私钥和消息摘要e构造随机数k并由式(4)求出椭圆曲线点X1:

图4 改进SM2签名流程Fig.4 Flowchart of improved SM2 signature

计算签名参数r和s输出签名(r,s,β):

给出伪代码实现如下:

其签名验证过程如下:Verifier 先向CA 递交哈希密码PW进行身份验证,验证不通过不予协助签名,CA记录此信息,该节点视为PBFT 故障节点。验证通过后获得消息M的签名(r′,s′,β′)和CA 保存的私钥分量d2,利用公钥对Signer 签名信息进行签名验证,其签名验证过程如图5所示。

图5 改进SM2签名验证流程Fig.5 Flowchart of improved SM2 signature verification

Verifier 首先判断传入签名参数是否合法即验证(r′,s′,β′)∈[1,n-1],不满足则签名验证不通过;若通过则由式(3)计算密码杂凑算法值e,并计算两个中间参数t′和u′:

计算R′=(e′+)modn的值是否等于Signer传过来的r′,如果是则签名验证成功,否则签名验证不通过。

给出伪代码实现如下:

2.2 算法分析

本文改进方案是基于SM2 算法提出的,也可以利用椭圆曲线的离散对数难题实现签名[11],那么要满足签名成功就需要先满足签名方案的正确性,即签名方的签名信息是能够被签名验证方验证成功的,现给出本文方案的原理正确性证明。

由方案签名过程可知,(r′,s′,β′)是Signer传过来的签名信息,则可以求到椭圆曲线点

由改进签名方案公关系得PS=[d1+d2]G,并将将r′和s′的值代入可得:

因此只要签名信息(r′,s′,β′)签名过程产生的(r,s,β)保持一致且消息哈希摘要相同,那么由式(9)可得:

3 改进方案性能分析

3.1 防非备案IP攻击分析

本文改进签名方案签名是基于联盟链PBFT机制提出的,故所有共识节点在产生时其IP 会在CA 备案,因此攻击者Attacker 使用非备案IP 攻击,CA 将会拦截所有非备案IP 的访问,攻击者将无法参与共识,故也无法参与签名过程。

假设攻击者Attacker 通过非法途径获取到联盟链某共识节点的IP 信息,通过伪造IP 访问CA 意图参与共识和签名,那么他要参与PBFT共识需要满足两个条件:一是需要提供哈希密码PW来进行身份验证;二是需要私钥分量d1完成签名。由整个方案可知,共识节点IP 信息、共识节点身份哈希密码、私钥同时被窃取的可能性极低,故该方案可以防非备案IP攻击。

3.2 防数据篡改和替换消息的伪造攻击分析

1)如果攻击者不是联盟链上节点就不会通过CA 获取到签名信息。设攻击者Attacker 是PBFT 共识网络中的一个恶意攻击节点,Attacker 可以通过CA 身份验证阶段获取到Signer 发送的(r,s,β)信息,之后Attacker 伪造消息M″来代替M进行签名:

根据签名过程,由于s、e、r三个参数均为已知量,Attacker使用伪造替换的消息M″进行消息摘要计算然后伪造签名计算s″=d1(α+e″r)modn,将(r,s″,β)作为M″的签名数据。Verifier收到(r,s″,β)签名信息后,进行如下签名验证,计算椭圆曲线点

由此可知通过对消息进行哈希运算可以实现数据的完整性,一旦数据遭到篡改,哈希数值将会发生变化,会使得签名无效,因哈希冲突的概率可以忽略不计,故改进的SM2签名算法是抵抗已知消息伪造的。

在改进签名算法的安全模型中包含挑战者T 和敌手AT。挑战者与敌手运行如下的攻击游戏:挑战者T 运行密钥生成算法并把生成的系统参数parms和验证公钥给敌手AT。AT可以进行n次训练,即输入的消息为(M1,M2,…,Mn),由挑战者给出合格的数字签名(δ1,δ2,…,δn)。在训练后,如果敌手AT 能够给出一个有效的消息签名对(M*,δ*),并且消息M*∉{M1,M2,…,Mn},那么就称敌手成功地伪造了签名,并将该事件称为ATEvent。AT 不断用输入的消息为交由挑战者T 执行签名算法生成(δ1,δ2,…,δn),设传统SM2 算法存在性伪造签名的概率为PSM2。攻击者最多询问n个消息的签名,最多σ次查询随机预言机,设哈希函数的输出空间为θ,那么攻击者未经随机预言机查询而得到一个合格的输出的概率是,那么在整个攻击过程中,攻击者最多有的概率能区分随机预言机的输出,那么不能区分的概率就是由于私钥的验证需要验证中心CA 的参与,那么AT 的签名结果要满足两方的验证,其概率为1/2;询问签名的最终目的是为了解决椭圆曲线离散对数问题,在参数保持一致的情况下,AT 合法的伪造签名的概率为:

因此,如果存在攻击者能够伪造共同签名,那么这个攻击者也就能够伪造SM2 数字签名;也就是说,如果SM2 数字签名算法是安全的,那么我们的共同签名协议也是安全的。

3.3 效率分析

在实际联盟链的运用环境中,特别在PBFT 共识过程中,PBFT 算法可以容忍小于1/3 个无效或者恶意节点[13],并且在较少节点的情况下可以有不错的性能,而且分叉的几率很低。但为了降低拜占庭将军问题带来的风险,一般会增加共识网络中节点数量[14],以减少恶意节点带来的影响,由于PBFT 算法的每个副本节点都需要和其他节点进行P2P 的共识同步,因此随着节点的增多,性能下降很快,并且共识节点的增多,会使得互相验证身份的过程也变得复杂[15],即其签名次数中会随着节点数量的增加变得越来越多,从而使得签名过程中的消耗变得巨大,这也是当前区块链技术运用于实际市场存在的问题之一。图6 是两种签名方案在PBFT 共识过程中的通信开销随节点个数变化的曲线图,可以明显看到节点数量越多,两种方案的通信开销增加速度也会越来越快,改进后的签名方案在通信开销上会比经典SM2 签名方案消耗得更多,这是改进方案每个节点在获取节点管理中心子私钥的过程中产生的。

图6 两种签名方案通信开销随节点数量变化对比Fig.6 Comparison of communication overhead of two signature schemes varying with the number of nodes

本文方案借助实际联盟链PBFT共识机制的运用环境,通过构造签名私钥与消息哈希值的中间多项式,除去了SM2 签名算法中存在的耗时的模逆过程,在传统SM2 签名运用于该方案的基础上,提高了计算效率。本文借助Java 软件工具包JDK1.8 中的ECPoint 椭圆曲线计算包和TIO 网络编程框架模拟共识节点间的签名过程,统计了共识过程中在签名过程中时间总消耗的平均值,并计算了共识效率的提升比η:

本次实验由两部分运行环境构成,一部分是节点端运行环境即参与共识的节点环境,其节点模拟环境如下:CPU 为Intel i5-4210U;内存8 GB;操作系统使用Windows 10 专业版;数据存储工具为sqllite。另一部分为CA 运行环境即参与节点身份认证的环境(采用阿里云ECS 服务器)如下:CPU 为1核;内存2 GB;操作系统为CentOS 7.3 64位;数据存储工具采用MySQL8.0。另外本次实验使用的SM2 相关参数与国家SM2 密码标准参数保持一致,最终得出实验结果如表1所示。

表1 传统SM2算法与改进SM2算法实验数据对比Tab.1 Comparison of experimental data between traditional SM2 algorithm and improved SM2 algorithm

图7 给出了两种签名方案运用于PBFT 过程中的时间消耗对比,可以看到在共识节点间需要签名的消息规模相同的条件下:当节点较少时,尽管本文改进方案消去了耗时的模逆过程(求逆过程消耗是点乘消耗的80 倍),但改进方案中比传统SM2 算法多一次通信过程,使得采用传统SM2 签名算法和改进后的算法时间消耗相差不大;但随着节点的增多,通信过程带来的影响较整个过程就较小了,如此改进后的SM2 算法时间消耗相比传统的SM2 算法会越来越小,且节点越多效率差距越明显,在节点数量达到30 个时,其效率较传统SM2 算法可以提升27.56%。

图7 两种签名方案在共识过程中总时间消耗对比Fig.7 Total time consumption comparison of two signature schemes in consensus project

图8 和图9 分别给出了两种方案在签名阶段和签名验证阶段的时间消耗对比,可以看出改进方案在签名过程的速度较传统签名算法有较大的提升,并且其效率相比签名验证过程提升得更多。

图8 两种方案在签名过程中的时间消耗对比Fig.8 Time consumption comparison of signing process between two schemes

图9 两种方案在签名验证过程中的时间消耗对比Fig.9 Time consumption comparison of verification process between two schemes

4 结语

结合国密SM2 签名算法和联盟链中独特的PBFT 共识机制,是解决当前区块链存在的如签名效率等部分技术难题的一个重要方向,对于当前联盟链技术应用于市场有一定的理论价值和实践意义。本文针对私钥保存和签名的时间消耗问题提出了基于密钥分割和国家标准SM2签名算法的可信第三方证明签名方案,通过协作签名能在一定程度上使得由中心化导致的伪造篡改的可能性降低,结合哈希摘要和PBFT特性又可以减少节点间签名总时间消耗,可以满足当前联盟链的应用环境需要。本文方案第三方协作签名尽管使得签名安全可靠,但同时也增大了网络通信量,所以将在下一步工作中设计一种快捷的协作签名协议,以降低节点间的网络通信量,进一步提高签名效率。

猜你喜欢

私钥哈希密钥
比特币的安全性到底有多高
幻中邂逅之金色密钥
幻中邂逅之金色密钥
Spatially defined single-cell transcriptional profiling characterizes diverse chondrocyte subtypes and nucleus pulposus progenitors in human intervertebral discs
哈希值处理 功能全面更易用
程序员把7500枚比特币扔掉损失巨大
文件哈希值处理一条龙
Android密钥库简析
基于身份的聚合签名体制研究
巧用哈希数值传递文件