董顺宇 唐 波 刘金会,
1(西北工业大学网络空间安全学院 西安 710129)
2(西北工业大学深圳研究院 广东深圳 518057)
(dongshunyu@mail.nwpu.edu.cn)
比特币是一种去中心化的加密货币,由Nakamoto[1]于2008年推出,并于2009年1月部署.比特币具有多个特点,包括:点对点协议;通过工作量证明(proof of work, PoW)协议[2]进行比特币的去中心化生产;通过透明交易、伪匿名和个人隐私保护防止双重支出.这些都使得比特币越来越受欢迎.
在比特币网络中,比特币地址充当用户账户.一般来说,匿名化的目的是防止攻击者通过比特币网络和用于记录交易的区块链发现比特币地址与真实或虚拟用户身份信息之间的关系.相反,去匿名化是揭示比特币地址与用户之间的关系,其中IP地址是重要的用户身份信息.然而,它容易受到一些去匿名化攻击.对于去匿名化攻击的防御方法有很多种,最常见的是使用比特币混币的方法.
关于比特币混币的研究起源于Maxwell[3]提出的CoinJoin匿名化方法.目前关于混币的研究集中在3个方向:1)使用中心化网站,如BitcoinFog.c,BitLaundry.com,Blockchain.info,而Mixcoin[4]是一个有代表性的研究;2)去中心化协议,如Fair Exchange,XIM,CoinParty,CoinShuffle,它们与比特币协议兼容;3)新的混币技术,如Zerocoin,Zerocash,Pinocchio,CryptoNote,它们与比特币协议不兼容,必须在新的区块链中应用.
集中混合中心化解决方案:最早的提议之一是Mixcoin.对Mixcoin改进后的一个集中混合中心化解决方案是Blindcoin[5].它本质上为Mixcoin增加了致盲性.Alice使用盲签名从混合器获得授权,因此混合器看不到接收者的身份.当前Blindcoin协议和一些盲签名方案进行结合的盲币协议较少.
BLS签名[6]是利用双线性对构造的一种短签名方案,在基于身份密码学和基于双线性对密码学中具有非常广泛的应用,可以将区块中的所有签名聚合成一个,它的签名长度也较短.本文基于区块链Blindcoin协议提出的前向安全BLS盲签名方案延续了Blindcoin的特性,用户的输入输出地址之间的联系对第三方服务商是不可见的,而且大幅度降低了对带宽和存储的要求,并且支持签名聚合,签名私钥会随着时间周期的变化而更新,从而也能够防止自适应攻击,具有前向安全性.前向安全性是指当前密钥被攻击者获取后,历史的密钥仍然是安全的,与此对应的后向安全性[7]是指当前密钥被攻击者获取后,未来的密钥仍然是安全的.
交易数据存储在由大量区块组成的比特币区块链[8]中,每个区块就像公共账本中的一个页面,记录一个区块头和最近10 min内比特币系统中发布的所有交易[9].区块头中有一项表示上一个哈希值,并且这个区块的哈希值也包含在下一个区块中,因此,所有的区块都进入了1条链.Nakamoto[1]采用PoW来确保生成块是去中心化的、规则的和安全的.比特币交易如图1所示.
图1 比特币交易图
随着临时匿名性的不足在比特币社区的影响越来越大,一个名为CoinJoin[10]的提案成为一种潜在的解决方案.在CoinJoin中,用户通过集中式混合服务(有时称为tumbler)路由各用户之间的交易,该服务用于将这些交易发布到分类账之前,模糊这些交易的发送者和接收者之间的关系.然而,这种集中式混合服务引入了单点信任和故障.事实上,混合服务总是知道每笔交易的发送者和接收者之间的联系,没有办法可以阻止混合服务窃取用户的资产.人们已经提出了一系列越来越复杂的协议来解决CoinJoin的局限性.第1个改进是Mixcoin,它试图通过在盗窃用户资产时追究混合服务的“责任”来降低盗窃风险(盗窃在技术上仍然是可能的,并且混合服务仍然知道谁与谁在进行交易).基于这种基本理念(包括Blindcoin和Blindly Signed Contracts[11])的一系列渐进式改进,一项名为TumbleBit[12]的提案最终以与比特币完全兼容的方式解决了Mixcoin的问责制和匿名性弱点;然而,TumbleBit方法平均每笔交易需要超过20 min(即2个比特币区块),并引入了额外的交易费用.Kate等人[13]的CoinShuffle和CoinShuffle++方案采用不同的方法,各用户之间执行特殊的多方计算,这样就不需要第三方混合服务.新兴的以隐私为中心的加密货币,如Zcash[14]和Monero[15]方案采用了诸如零知识简洁非交互式知识论证[16]、可追踪环签名、机密交易和隐形地址等加密原语,以提供比那些加密货币更好的隐私属性.
在经典假设条件下,盲签名需要面向随机谕言机模型(random oracle model, ROM)和公共参考串(common reference string, CRS)来构造.Fischlin等人[17]在CRS模型中提出了一种圆形最优盲签名的通用构造.Schnorr[18]基于Schnorr签名[19]构建了一个有效的3轮盲签名.尽管Schnorr盲签名被认为对多签名是安全的,但直到最近才在代数群模型和ROM中建立可证明的安全性.Baldimtsi等人[20]的研究表明,仅在ROM中证明Schnorr盲签名是不可能的.Pointcheval等人[21]证明了基于DDH(decisional Deffie-Hellman)假设的3轮Okamoto-Schnorr盲签名对于多对数多签名是安全的.
Anderson[22]首次提出可以将数字签名和前向安全性相结合,构造了一种前向安全数字签名,该签名具有以下特性:如果消息的签名者被攻击者攻击,那么攻击者就不可能在更早的时间伪造签名.因此,前向安全性意味着敌手不能构建更早时间身份验证的消息.与前向安全加密一样,Anderson的前向安全签名是通过将时间划分为时间周期并使用单向转换更新每个时间周期中的私钥实现前向安全性.由于更新算法的单向性,当签名者受到攻击时,当前时间周期的签名密钥会泄露给攻击者,但较早时间周期的签名密钥无法恢复.之后前向安全签名由Bellare等人[23]进行了形式化,并已扩展到许多变体,如群签名[24]、环签名[25]和盲签名[26].
区块链中的每个用户都可以访问网络中共享的所有交易.这一特点使用户能够验证每笔交易的完整性和真实性.但是,它也带来了一些隐私挑战:它会向网络中的任何人公开与特定ID关联的所有交易的历史记录.如比特币使用假名地址作为用户的标识符,以取消地址和真实身份之间的连接.此外,它允许用户为每个交易创建一个新的地址,以加强用户的隐私.这样可以在一定程度上保证身份的隐私.然而,它仍然容易受到一些去匿名化攻击[27].
一般比特币交易有1对2的输入和1对2的输出,因此很容易分析比特币的转移路径.CoinJoin交易将许多输入和输出组合在一起,并将它们放在一个交易中,因此CoinJoin交易中的输入很难对应到输出.假设一个事务中的输入和输出的个数都是N,每个输入分别对应1个输出,给定事件G是某个输入对应某个输出,CoinJoin交易是最简单有效的匿名化方法.根据上述原理,中心化混币提供商通过网站接收用户的比特币并进行混币活动.但是,中心化混币有2个严重的弱点:1)混币器必须知道用户的输入地址和输出地址,因此不能为用户提供真正的匿名性;2)用户必须信任混币器,提前向混币器发送比特币,用户面临币损风险[28].中心化混币的基本模型如图2所示:
图2 中心化混币基本模型
图3 盲签名技术的隐藏机制
为了提供中心化混币的内部隐私性[29],需要服务商在不知道用户输入输出地址对应关系的情况下进行输入和输出阶段,利用盲签名技术可以达到这一目的.盲签名方案是一种加密原语,其中签名者可以交互地对用户持有的消息进行签名,但是看不到被签消息的真实内容,原因是消息的拥有者对原消息进行了盲化,当消息拥有者收到盲签名后能够通过去盲处理获得真实的签名.盲签名原理如图3所示.
利用盲签名技术改进Mixcoin的缺点,解决的问题就是让用户的输入输出地址之间的联系对第三方服务商是不可见的.在Blindcoin协议中,用户使用了盲签名技术,使得第三方可以在不连接用户的输入和输出地址的情况下,实现对用户的数据交换.其本质上为Mixcoin增加了盲性.Mixcoin和Blindcoin的原理如图4所示.
图4 Mixcoin和Blindcoin原理流程对比
首先给出前向安全盲签名方案[30]的形式化定义:
定义1.前向安全盲签名.一种前向安全的盲签名系统,包含了4个基本步骤:FBSIG.KeyGen,FBSIG.Update,FBSIG.Sign,FBSIG.Verify.密钥生成算法FBSIG.KeyGen是一种多项式时间算法,输入安全参数k和时间周期总数T,输出系统参数param、签名者的初始私钥sk0以及公钥pk.
私钥更新算法FBSIG.Update是一种确定性或概率算法,输入当前时间周期i和当前时间周期的私钥ski,通过单向函数输出下一时间周期i+1的签名私钥ski+1并且删除ski+1.
签名算法FBSIG.Sign是一种概率算法,假设请求签署的消息为m∈M:{0,1}n,通过3个子算法,产生签名sig(m).
1) 盲化算法Blind:输入盲化因子α以及明文消息m,输出被盲化后的消息σ(m),并发送给签名者;
2) 签名算法Sig:盲化后的消息σ(m)和签名者的当前私钥ski作为输入,输出对盲化消息的签名sig(σ(m)),并发送给签名请求者;
3) 去盲算法Unblind:输入之前的盲化因子α和签名sig(σ(m)),输出去盲后的签名sig(m).
验证算法FBSIG.Verify是一种确定性算法,(i,m,sig(m),pk)作为输入,输出“accept”或者“reject”,对于每一个有效的签名输出“accept”,否则输出“reject”.
通过使用BLS签名方案,可以提高签名过程的存储效率并且支持签名聚合.由此产生的方案非常适合比特币,在需要多重签名的地方也很适用.下面简要概述BLS签名方案及其聚合机制[31].该方案需要:
1) 一个有效可计算的非退化配对e:G1×G2→Gt在素数阶q的群G1,G2,Gt中.让g1和g2分别是G1和G2的生成元.
2) 哈希函数H0:M→G1.BLS签名方案的工作原理如下.
密钥生成:选择一个随机的sk←q并输出(pk,sk),其中
签名Sign(sk,m):输出σ←H0(m)sk∈G1.
验证Verify(pk,m,σ):如果e(σ,g2)=e(H0(m),pk)则签名验证成功,否则签名验证失败.
该签名方案支持简单的签名聚合过程.给定三元组(pki,mi,σi),其中i=1,2,…,n,任何人都可以聚合签名σ1,σ2,…,σn∈G1.通过计算转换成一个简短的聚合签名σ←σ1…σn∈G1.
为了验证聚合签名σ∈G1,需要检查:e(σ,g2)=e(H0(m1),pk1)…e(H0(mn),pkn).
此外,验证者可以得到一个简短的聚合公钥apkpk1…pkn∈G2.
信任对于比特币混币的成功非常重要.作为第三方服务,必须让用户相信资金会被适当地混合和返还.因此,混币器经常为用户提供检查混币状态的服务并且自豪地宣传其功能.尽管如此,比特币混合器仍然被指控诈骗和实施不善.虽然混币器可能对其参与者的资金和匿名性构成威胁,但用户和外部攻击者也对威胁形势作出了贡献.用户和外部攻击者带来的一些威胁,如跟踪交易,可以通过混淆功能得到缓解.其他如硬币盗窃,可以通过混合器的实现来缓解.当前的大多数混合实现都涉及由全能运营商运行的集中式第三方,混币器操作员带来的威胁更难检测.
以下是常见的一些威胁:1)排列泄露.攻击者能够访问与输入和输出地址之间的排列有关的混合日志或数据库.2)硬币盗窃.对手通过为用户提供替代地址或破坏混合器的地址窃取输入的硬币,混币器运营商还可以窃取用户资金.3)参与者的放弃.恶意混币器运营商可以拒绝选定的良性用户参与以减少匿名集.4)参与并破坏.敌对参与者通过在混合协议执行之前中止混合协议来破坏混合.
为了解决上述比特币的隐私问题,理想的解决方案应该考虑以下属性.
匿名性:用户应该是唯一知道从输入地址到输出地址的链接的实体.
不可伪造性:任何攻击者都无法知道用户个人信息ID,不可伪造用户的签名密钥,进而无法伪造用户的签名及授权.
盲性:能够保证第三方服务商即签名者不知道盲化因子r且无法得到原消息m,看不到用户输入地址所对应的输出地址.
前向安全性:第三方服务商当前密钥被攻击者获取后历史的密钥仍是安全的,不会造成安全性问题.
抗自适应攻击:在保证前向安全性的基础上,需要保证每个时间周期密钥的变化,使得分析者不能根据某一周期签名的结果对其他时间周期进行修正.
中心化混币大致思路是服务商帮助想要进行混币交易的用户找到同伴,构造混币交易,并从中收取一定的手续费.该过程的基本模型由4个阶段构成,分别是协商、输入、输出、结束.本文方案主要用于协商阶段.步骤如下:
1) 协商阶段.想要参与混币的用户,与混币服务商进行协商,约定用于混币的输入地址、输出地址、服务商的接收地址,返回地址、混币金额、混币输入输出时间、混币手续费等相关参数.
① 系统初始化阶段.
PKG(public key generation)首先选择q,G1,G2,e,然后再选择P∈G1作为生成元,定义哈希函数H:{0,1}*→G1.最后PKG再随机性选取s∈计算公钥Pb=sP,将s秘密保存,公开参数{q,G1,G2,e,P,Pb}.
② 密钥生成阶段.
签名者将自身的个人信息ID交给PKG,PKG将任意选择x∈然后计算pk=xP,QID=H(ID‖pk),CID=sQID.最后PKG将x,pk,CID发送给签名者.此时第三方服务商的初始密钥参数已经生成.
③ 密钥更新阶段.
④ 盲签名产生阶段.
用户向服务商发送参数申请混币.首先用户需要将输出地址address1进行盲化,address1即明文消息m.用户任意选取随机数r∈为盲因子,然后计算m′=rH(m),将明文消息m盲化,并且将m′发送给签名方.签名方在收到盲化消息m′后对其签名,计算并且将发送给用户.
⑤ 验证阶段.
签名的验证者(用户)需判断等式e(σ,p)=e(H(ID‖pk),Pb)e(H(m),pk)是否成立.如果该等式成立,则说明(σ,pk)就是签名者ID在消息m上的签名.此时服务商已经返回其他参数及盲签名承诺,完成协商.
2) 输入阶段.用户按照协商阶段商定的相关参数,在约定时间之前将约定资产从输入地址发送到服务商指定的接收地址.
第三方服务商在账本公开对盲化输出地址的签名,用户以新身份A′在账本公开去盲化后的输出地址签名.
3) 输出阶段.服务商在约定时间之前,将扣除手续费后的资产,通过返回地址发送到用户指定的输出地址.
4) 结束阶段.如果协议正常运行结束,服务商和用户销毁协商阶段留下的记录,保护用户隐私.
Blindcoin协议首先修改了协商阶段的签名部分,第三方服务商通过BLS盲签名算法对用户输出地址的承诺进行签名,然后用户对收到的盲签名进行去盲操作,得到针对真实输出地址的签名,并作为输出地址获得混币后的资产凭证交给第三方服务商,此时用户使用的是另外一个身份并将该凭证交给第三方,服务商可以验证该签名的正确性以及是否使用过.由于服务商在协商阶段知道用户的输入地址但不知道输出地址,而在输出阶段知道输出地址却不知道对应的输入地址,因而无法判断用户输入和输出地址的关系.
本文方案安全性依赖于底层BLS的安全证明.BLS的安全性是在随机谕言机模型下,其中哈希函数H被设置为随机谕言机.其不可伪造性形式化证明如下:
假设哈希函数H是随机谕言机.如果CDH(computational Diffie-Hellman)问题很难解决,那么BLS签名方案在减少损失L=qH的存在性不可伪造(existential unforgeability against chosen-message attacks, EU-CMA)安全模型中是可证明安全的,其中qH是随机谕言机的查询次数.
假设在EU-CMA模型中存在一个能够以(t,qs,ε)的优势破坏签名方案的敌手F,那么可以构造一个模拟器B模拟敌手F来解决CDH问题.给定CDH问题实例(g,ga,gb),模拟器B控制随机谕言机,模拟F并执行以下操作.
设置阶段Setup:模拟器B设置公钥h=gα,私钥为α,此处α是a.模拟者运行密钥生成算法,生成公钥.注意:模拟者并不掌握私钥,要求模拟者能够在不掌握私钥的情况下构造可模拟的签名,并且为敌手设计可规约的签名.
哈希询问阶段H-Query:敌手在此阶段进行哈希查询.模拟器在收到敌手的询问后选择一个随机数i*∈[1,qH].模拟器B准备一个空表(开始时为空),用来存储所有的哈希查询和结果.第i次查询设为mi,若mi已经在模拟器维护的表中,则直接回复.否则回复如下:
并将(i,mi,wi,H(mi))添加到哈希列表中.注意:哈希请求这里是全局存在的,即使是敌手在最后计算伪造签名时,也必须访问随机谕言机,获得哈希结果,即在规约算法或者模拟者模拟算法的过程中,所有的哈希结果必须由随机谕言机计算得到.哈希请求开始之前,模拟者猜测第i次询问的消息mi作为敌手输出仿造签名时的那一次请求,所以在哈希请求设计时,将第i次请求设计成为可规约的,将其他时间的请求设计为可模拟的.这是能够强制敌手攻破困难问题的核心设计.
查询阶段Query:敌手F在此阶段进行签名查询,对于mi上的签名查询,如果mi是哈希列表中的第i*条查询消息,则中止.其他情况下模拟器B计算签名σmi=(ga)wi,按照签名规定的形式(σm=H(m)α),模拟器产生的签名是合法的.模拟者按照上述过程对敌手F的签名请求进行回复,如果询问到消息mi是之前询问过的,则终止询问,因为不允许敌手对1个消息进行2次查询.
在最后伪造时,选择一个没有请求过的消息进行伪造,如果是之前伪造过的消息,则终止伪造过程.对新的消息进行哈希询问,然后计算签名,输出伪造的签名.
不可伪造性分析:第三方混币服务商的私钥x,是由签名者将自身个人信息ID交给PKG,PKG任意选择x∈即签名者的私钥是由密钥生成中心和用户自身身份ID构成,密钥生成中心不知道用户最后的签名密钥,也就无法伪造用户的签名及授权,任何攻击者无法知道用户个人信息ID也就无法伪造用户的签名密钥,即第三方服务商的密钥具有不可伪造性.
盲性分析:消息的拥有者即用户在消息盲化阶段任意选择r∈作为盲化因子,并通过计算m′=rH(m)对明文消息m进行盲化,得到盲化后的消息m′,然后通过安全信道将m′发送给签名者,签名者对m′进行签名,由于盲因子由用户随机选择并保密,所以签名者无法得知盲因子r,更无法计算H(m)=m′r-1,因此在签名者不知道盲因子r的情况下是不能得到原消息m的,所以该方案满足盲性.
匿名性分析:第三方服务商在账本公开对盲化输出地址的签名,用户采用新身份A′在账本公开去盲化后的输出地址签名,由于A′与A在第三方服务商看来并无实际联系,结果是服务商在协商阶段知道用户的输入地址但不知道输出地址,而在输出阶段知道输出地址而不知道对应的输入地址,因而无法判断用户输入输出地址的关系.
表1 相关方案混币协议安全性对比
BLS短签名让用户确认签名者是可信的,它是最短的数字签名.之所以使用它,是因为在最大程度上使用最小带宽的区块链混币环境中需要短签名.与使用的其他签名(如RSA和DSA)相比,BLS确实能够生成短签名.例如,当使用1 024 b模数时,RSA签名的长度为1 024 b.同样,当使用1 024 b模数时,标准DSA签名的长度为320 b.DSA的椭圆曲线变体,例如ECDSA,也是320 b. 320 b的签名太长,无法键入.而BLS签名方案的长度大约为160 b,并提供类似于320 b DSA签名的安全级别.签名生成相对较快,签名验证的计算复杂度稍低,因为它包括计算量不高的配对操作.BLS签名的主要优点是使用可以组合成单个签名的多个公钥,将多个签名组合成多个消息.
为了测试本文系统的性能,使用原始文件的数据集完成测试,用户将数据文件拆分为1组块的集合,从10~500块,块大小为1 KB.接下来将根据计算成本评估签名方案的性能.
计算成本:为了评估密钥和签名的生成性能,分别从100~500不同数量的块生成密钥和签名,在实验中逐次增加50块.如图5所示,生成签名的时间成本随着区块数量的增加而线性增加.密钥生成时间范围为0.021~0.046 s.而生成签名的时间范围为0.071~0.286 s.从图5可以看出,在密钥生成过程和签名生成过程中花费的时间很少,确保了本文方案的效率.
图5 密钥及签名生成的计算开销
本文基于区块链Blindcoin协议提出了一种前向安全盲币协议,该协议具备Blindcoin的特性,用户的输入输出地址之间对第三方服务商是不可见的,而且该方案在带宽和存储需求方面实现了大幅降低,并且支持签名聚合,签名私钥会随着时间周期的变化而更新,具备前向安全性,同时也能够抵抗自适应攻击.因此本文方案提供了相对好的隐私性.本文方案能够实现的功能与目前比特币中的多重签名是一致的,但在链上仅表现为单一聚合签名.在本文方案中,用户的交易信息不会被攻击者锁定,用户既能够享受多重签名技术带来的便利,也能够保证良好的隐私性.未来工作将关注参与者数量上升会增大攻击者混入的概率问题,进而设计出具有更多安全性和功能的盲币协议.