数字签名技术
数字签名是以电子形式存在于数据信息之中的,或作为其附件或逻辑上与之有联系的数据,可用于辨别数据签署人的身份,并表明签署人对数据信息中所含信息的认可。 在形式上,一个数字签名方案通常包含三个多项式时间算法:(G,S,V),其中,密钥生成算法G从可选私钥集中随机选择一个私钥,算法输出私钥及对应的公钥;签名算法S依据给定的消息和私钥,生成一个签名;签名验证算法则在给定消息、公钥和签名的基础上,验证消息是否为指定签名者所签名。为了减少原始消息可能带来的巨大签名计算量,通常是先生成原始消息的哈希值,然后再对这个哈希值进行签名。
数字签名标准与ECDSA算法 1991年8月,美国国家标准局(NIST)公布了数字签名标准(Digital Signature Standard,DSS),在标准中,采用了DSA(Digital Signature Algorithm)算法。DSA算法是ElGamal签名算法的变种,其安全性基于离散对数难题。 ECDSA(Elliptic Curve Digital Signature Algorithm)则是DSA算法的一个变种。与DSA算法使用的整数有限域不同,ECDSA使用的是椭圆曲线群。区块链中应用的数字签名算法就是ECDSA算法。 1.椭圆曲线数字签名生成 假定Alice希望对消息m进行签名,她所采用的椭圆曲线参数为D=(p,a,b,G,n,h)(例如,可以采用前述的secp256k1曲线),对应的密钥对为(k,Q),其中Q为公钥,k为私钥。Alice将按如下步骤进行签名。 第1步 产生一个随机数d,1≤d≤n-1。 第2步 计算dG=(x1,y1),将x1转化为整数。 第3步 计算r=mod n,若r=0转向第1步。 第4步 计算d-1mod n。 第5步 计算哈希值SHA(m),并将得到的比特串转化为整数e。 第6步 计算s=d-1(e+kr)mod n,若s=0,则转向第1步。 第7步 (r,s)即为Alice对消息m的签名。 2.椭圆曲线签名验证 为验证Alice对消息m的签名(r,s),Bob可以得到Alice所用的椭圆曲线参数以及Alice的公钥Q。Bob将按以下步骤操作。 第1步 验证r和s是区间[1,n-1]上的整数。 第2步 计算SHA(m)并将其转化为整数e。 第3步 计算w=s-1mod n。 第4步 计算u1=ew mod n以及u2=rw mod n。 第5步 计算X=u1G+u2Q。 第6步 若X=O,则拒绝签名,否则将X的x坐标x1转化为整数,并计算v=mod n。 第7步 当且仅当v=r时,签名通过验证。 为具体说明椭圆曲线签名和验证算法的过程,我们来看一个简化的例子:Alice决定把10个比特币支付给Bob,矿工Miner负责把这笔账记录下来。这个过程是怎么使用签名和验证算法进行的呢? 首先Alice从自己钱包中取出10个比特币,要将这10个比特币支付给Bob,于是交易消息m“Alice支付10 BTC给Bob”产生了。这个消息会向全网广播。收到这个交易消息的用户会产生疑问:这个交易是不是真的?为打消其他用户的疑虑,Alice需要对这段交易消息进行数字签名,以向大家确定这个交易确实是由她发出的。为此,Alice使用了secp256k1椭圆曲线进行数字签名,这个对交易消息内容的签名需要使用Alice的私钥k(签名算法的第6步)。考虑到消息的规模和公钥密码算法的效率,对交易消息进行的签名实际上是对交易消息的哈希值进行签名。由于密码哈希函数的抗碰撞性,可以认为这样的转化是合理有效的。于是Alice向全网广播的内容除了交易消息本身外,还包含Alice对消息的签名以及Alice的公钥信息。 假定Alice发送的交易消息连同签名发出后,为矿工Miner所接收。为在区块链中记录这一交易,Miner首先需要验证这个交易是不是Alice发出的,即进行签名验证的工作。为此,Miner也使用了同样的secp256k1椭圆曲线来验证签名。对Alice签名验证的过程需要使用Alice的公钥参与,如签名验证算法中的第5步就使用了Alice的公钥Q。如一切顺利的话,Miner可以验证交易消息m“Alice支付10 BTC给Bob”确实是Alice发出的,Miner可以在之后的操作中把这个交易记入区块链中。如果签名验证失败,表明Miner收到的这个消息存在问题,Miner会放弃将相关的交易记入区块链的操作。 利用椭圆曲线的签名和验证算法,一方面可以保证用户的账户不被冒名顶替,另一方面也能确保用户不能否认其所签名的交易。用户发起交易的时候,使用自己的私钥对交易信息签名,矿工收到信息后用户的公钥对签名进行验证,一旦通过,该交易信息就可通过矿工进行记账,最终完成交易。