一种基于区块链的多方公平PDF合同签署方法
技术领域
本发明涉及信息安全领域,特别是涉及一种区块链应用技术,用于完成多方公平PDF合同签署。
背景技术
公平的合同签署是指参与合同签署的双方或者多方要么同时都能得到有各方签名的合同,要么都得不到有效合同的签名。该问题研究的很早,在密码应用技术领域一直是受到关注的,从早期的纯粹双方的公平合同签署,到后来的基于第三方的公平合同签署协议,人们给出了多种有趣有效的解决方案。
然而,理论的研究成果在应用到PDF合同签署时,却出现了障碍。PDF合同签署设计上是一个各方顺序签名的技术,即后序合同签署方的签名包含前序合同签署方的签名,另外PDF规范按照自己定义的数字签名方法,每次签名时都会增加一些辅助的数据。这样的特性,使得传统的对于同一个文档进行的交换数字签名的技术失去了效用。
田海博等人提出了一种满足便携文档格式的公平多方合同签署协议,2018年发表在期刊《西电学报》第45卷第1期。该方法采用了可验证加密签名(VES)方案,提出了分布式哈希的计算方法,给出了多方公平签署合同的过程。然而,该方法后序合同签署方需要传递前序合同签署方的数字签名,且TTP需要在线参与到多方合同签署的过程中,协助完成检查,对TTP的要求较高,容易造成瓶颈。
发明内容
针对当前方法对TTP依赖较强,效率较低,存在的通信和性能瓶颈的问题,本发明引入区块链技术,把各方的VES和分布式哈希所涉及的状态量存储到区块链中,并融合进一个群组密钥协商协议GKA,用于向区块链中存储加密的数字签名,确保合同签署各方关于合同内容和合同签名的隐私性,最终实现了一个基于区块链的多方公平合同签署方法。
本发明的目的在于设计一种基于区块链的公平多方PDF合同签署方法,本发明利用区块链可信存储、可信计算等特点,使得TTP完全成为离线第三方,提高协议整体执行的效率。
为实现上述目的,本发明给出如下方法:
一种基于区块链的多方公平PDF合同签署方法,包括多名合同签署方P1,…,Pn,n为大于1的整数,一个可信第三方TTP及区块链节点,所述各个合同签署方协商一致的PDF合同m0,包括以下步骤:
S1)P1生成所述PDF合同m0的数字签名可验证加密签名VES1,计算合同内容的哈希上下文CTX1,生成群组密钥协商协议GKA的元素GE1,把VES1、CTX1和GE1封装为区块链交易,发送给任意区块链节点;
S2)由P2开始,i按照由2至n升序,Pi验证Pi-1(1<i≤n)的VESi-1签名,若验证失败退出协议,若验证成功则Pi生成数字签名VESi、CTXi、GEi并通过区块链交易发送给任意区块链节点;
S3)在Pn完成操作后,以Pj(1≤j≤n)代表所述合同签署方P1,…,Pn,Pj验证其它未验证的VES签名,如果验证失败,退出协议,否则计算群组加密密钥GK,加密PDF文档的数字签名形成密文Cj,把Cj封装为交易发送给任意区块链节点;
S4)Pj查询区块链数据,用GK解密其它合同签署方的密文,1≤j≤n,合成各方顺序签署的PDF合同;
S5)Pj在合成PDF合同过程中出现异常时与TTP通信,完成异常处理流程。
上述步骤1)包括:
S11)所述合同签署方P1所采用的是各个所述合同签署方协商一致的VES方案(VES.Gen,VES.Sign,VES.Verify),所述合同签署方P1通过VES.Gen算法生成所述合同签署方P1的签名公私钥对
S12)所述合同签署方P1使用作为签名密钥,使用各个所述合同签署方协商一致的兼容数字签名方案(Gen,Sign,Verify)中的数字签名算法Sign签署PDF合同m0,得到其中mP1和是所述合同签署方P1根据PDF数字签名规范所生成的附属信息,mP1为空或不为空,符号“||”是二进制比特串的串接操作;
S13)所述合同签署方P1计算其中pkTTP是TTP兼容VES方案的公钥,设置
S14)所述合同签署方P1合成含有其数字签名的PDF合同采用各个所述合同签署方协商一致的哈希方案(Hash.init,Hash.update,Hash.final),计算Hash.init,计算计算完成后设置此时的哈希缓存为CTX1;
S15)所述合同签署方P1采用各个所述合同签署方协商一致的GKA方案(GKA.Gen,GKA.KA),其中GKA.Gen与区块链节点所采用数字签名方案(BC.Gen,BC.Sign,BC.Verify)中的BC.Gen算法兼容,之后按照GKA.KA算法计算GE1;其中(BC.Gen,BC.Sign,BC.Verify)表示在本发明技术方案中区块链节点适用的任意一种数字签名方案;
S16)所述合同签署方P1把VES1、CTX1和GE1封装为区块链交易的数据,把交易发送给区块链节点。
上述步骤2)包括:
S21)所述Pi-1的VES签名是采用各个所述合同签署方协商一致的VES方案(VES.Gen,VES.Sign,VES.Verify)中的VES.Sign算法生成的,Pi通过VES.Gen算法生成签名公私钥对
S22)所述Pi采用VES.Verify算法验证VES签名,如果该算法返回假,则停止执行协议,否则继续;
S23)所述Pi使用Pi-1,…,P1所分别提供的VESi-1,…,VES1之中的附属信息 合成准文档其中是长度分别为的全0比特串,然后按照PDF数字签名规范生成附属信息和之后定义Pi使用各个所述合同签署方协商一致的哈希方案(Hash.init,Hash.update,Hash.final),计算Hash.init,计算后用Pi-1提供的CTXi-1替换此时形成的哈希缓存,之后计算计算Hash.final得到的哈希值,之后Pi使用作为签名密钥,使用各个所述合同签署方协商一致的兼容数字签名方案(Gen,Sign,Verify)中的数字签名算法Sign签署内容得到其中Sign算法是先求哈希后计算签名的构造方法,实际计算签名时直接对的哈希值签名;
S24)所述Pi计算其中pkTTP是TTP兼容VES方案的公钥,设置
S25)所述Pi采用各个所述合同签署方协商一致的哈希方案(Hash.init,Hash.update,Hash.final),计算Hash.init,计算后用CTXi-1替换此时形成的哈希缓存,之后计算计算完成后设置此时的哈希缓存为CTXi;
S26)所述Pi采用各个所述合同签署方协商一致的GKA方案(GKA.Gen,GKA.KA),其中GKA.Gen与区块链节点所采用数字签名方案(BC.Gen,BC.Sign,BC.Verify)中的BC.Gen算法兼容,之后按照GKA.KA算法计算GEi;
S27)所述Pi把VESi、CTXi和GEi封装为区块链交易的数据,把交易发送给任意区块链节点。
上述步骤3)包括:
S31)所述Pj,1≤j≤n,查询区块链节点,确认Pn是否完成了操作,如果没有完成,继续等待,否则继续执行;
S32)所述Pj查询VESl,,使用各个所述合同签署方协商一致的VES方案(VES.Gen,VES.Sign,VES.Verify)中的VES.Verify算法验证VESl,在1<l时,采用CTXl-1辅助完成验证,如果任何一个VES签名验证失败,退出协议,否则继续执行;
其中所述VESl表示当l≠j,j-1,且1≤l≤n时所指代的合同签署方Pl的可验证加密签名;
所述CTXl-1表示当l≠j,j-1,且1≤l≤n时所指代的合同签署方Pl-1的哈希上下文;
S33)所述Pj采用各个所述合同签署方协商一致的的GKA方案以各方提交的GE元素为输入,计算群组密钥GK,并采用对称密钥加密算法加密形成密文Cj;
S34)所述Pj把所述Cj封装为区块链交易的数据,把交易发送给任意区块链节点。
上述步骤4)包括:
S41)所述Pj向区块链查询VESg,密文Cg,1≤g≤n,如果超过了合同签署最大时长,则执行异常处理流程,退出协议;
S42)所述Pj采用群组密钥GK,使用对称密钥解密算法解密Cg获得明文1≤g≤n;
S43)所述Pj使用PDF合同m0,1≤g≤n合成各方顺序签署的PDF合同。
上述步骤5)包括:
S51)所述Pj向区块链查询VESg,密文Cg,1≤l≤n,如果超过了合同签署最大时长,则向TTP发送仲裁请求,指明要求仲裁的合同签署方,群组密钥GK,描述要求仲裁的原因;例如缺少Cg,或者解密后无法验证
S52)所述TTP查询区块链数据,确认Pj是遵从协议的,确认要求仲裁的对象尚没有被仲裁过,那么TTP使用自己的私钥,将Pj所要求仲裁的合同签署方的VES签名恢复为普通签名,并再次确认被仲裁的原因,把恢复的普通签名加密后形成密文,向区块链中记录此次仲裁事件。
S53)Pj用GK解密加密的普通签名,按照步骤43)合成有签名的PDF合同。
上述合同签署方把交易发送给区块链节点的过程如下:
S61)区块链节点运行多方合同签署的智能合约,包含注册,存储等接口;
S62)智能合约通过注册接口确认合同的所有签署人、认可的TTP、签署人的顺序、此次合同签署的唯一编号等信息,并为各个签署人分配存储区;
S63)智能合约通过存储接口存储合同签署方或者TTP的交易数据,并把不同合同签署人生成的不同交易数据存储在为其分配的存储区中,交易数据中应当包含此次合同签署的唯一编号。
本发明技术方案中中为了便于在不同步骤中进行描述和区分,每个数据参数所采用的下标符号i、j、g在各自的取值范围下,均对应于所述的各个相应的合同签署方P1,…,Pn。例如,当i=j=g=3时,Pi、Pj、Pg均代表合同签署方P3,其他参数符号如C、VES等,当下标取值相同时也表示同一含义。
本发明具有以下优点:
首先,矿工或者其它第三方通过合同签署方存储到区块链中的数据和运行的智能合约,只能判断有些公钥持有人准备签署一份合同,并不能知晓合同的内容或者各方对合同给出的数字签名,具有隐私保护的属性;其次,合同签署各方如果都诚实的执行协议,各方都可以本地恢复完整的PDF合同,整个过程只需要向区块链存储两次数据即可完成;最后,合同签署各方如果有任何一方不诚实的执行协议,要么各方都没有存储第二轮加密的签名数据,从而都没有获得完整的PDF合同签名或者任何其它合同签署方的有效数字签名,要么各方可以通过可信第三方恢复不诚实合同签署方的数字签名,各方都获得完整的PDF合同签名,协议是公平的。
本发明所提供的一种基于区块链的多方公平PDF合同签署方法,可以作为基于以太坊的分布式应用或者其它支持智能合约或者脚本技术区块链的一个应用,并且可以进一步增加代币或者令牌机制,激励合同签署方和TTP按照协议执行,形成更为完善的公平多方PDF合同签署应用,广泛用于电子商务、电子政务、金融科技等领域需要签署电子合同的场景中。
附图说明:
图1是基于区块链的公平多方PDF合同签署,实线表示正常的协议执行流程,图中以P1为例展示了各个合同签署方向区块链节点发送的交易情况,双箭头实线表明各个合同签署方都会与区块链节点交互;虚线表示异常处理的流程,各个合同参与方都可能与TTP通信以处理异常,TTP需要与区块链节点通信验证交易,记录处理流程。
具体实施方式:
实施例1:
设多名合同签署方P1,…,Pn、一个可信第三方TTP及以太坊区块链节点。每个合同签署方具有以太坊数字签名的公私钥。以太坊采用了ECDSA数字签名方案,椭圆曲线是SECP-256k1。每个合同签署方的数字签名方案(BC.Gen,BC.Sign,BC.Verify)就代表ECDSA中相应的密钥生成算法,签名算法和签名验证算法。每个合同签署方的区块链公钥和私钥都使用ECDSA的密钥生成算法得到。例如,P1的私钥表示为:
S:8b9519e7f1dd9fa5d47ebf205bfd7dd800c404a0b7aa1991dae344118f7713aa;
公钥相应的表示为:
X:2da31c6cd1cd7dd0f43299bf01676731b1ab40217b659c13ac2a5726a3f9ab1
Y:390a7665a6dc1505af34261bc9309fc56d0417984c10c7102f37355d02119cb9;
各个合同签署方使用协商一致的GKA算法,其密钥生成算法GKA.Gen与ECDSA的密钥生成算法相同。GKA.KA的算法描述如下:设P1,…,Pn按照其在以太坊中注册的顺序排序,首尾相连,那么P1计算与其两个邻居的ECDH共享密钥和计算例如n=4,h采用SHA-256哈希算法,那么P4的公钥为:
X:4e5e993fedca03957105c1d44a92aea51a4c99eb271697ff84eac558ed9d7662
Y:720900b851ac216de89961cf5c04fdee087dda91f53ef7dd6645a9795d27b5a8
P2的公钥为:
X:990c9521257d44e193d9ad561c05c63e8942f053a2d520d0aa226d34034d8d60
Y:c0f994ef2befa8ba9add5871ca958d6d01d045726ffaaa1419f3d5bd9bc3141a
SK12的十六进制表达是
A889D164A8B780903E7B53BAAEB37EE3B173411FFB9B30EEF53DE56E2CE1810D
SK14的十六进制表达是
7830037E35981A16F1C4E242CB862E1576BD4E6A906C2B7CDEA49ABCB3E78037
GE1的十六进制表达是
6A96557BCB3E9165FA760A8D5C9CF4322BAB6393F8284D72C6F243C359245981
这样,当各合同签署方都提交了各自的GE元素后,每一个合同签署方可以用自己与邻居的ECDH(椭圆曲线Diffie-Hellman)秘密值计算所有其它合同签署方哈希之后的秘密值,进而,可以得知每个合同签署方的加密密钥。GKA.KA算法的正式描述见Zhao等人2011年在《Ad Hoc Networks》期刊中的DASGKA实例。
可验证加密签名VES方案可以采用Ateniese在2004年发表在《ACM Transactionson Information and System Security》期刊中的RSA-VES方案,这样各合同签署方都具有RSA签名算法的公钥和私钥。PDF签名采用Adobe公司在PDF 1.7中给出的签名规范,同样选择RSA签名算法。满足VES方案(VES.Gen,VES.Sign,VES.Verify)和数字签名方案(Gen,Sign,Verify)兼容的需求。
采用以太坊智能合约,意味着各合同签署方和TTP拥有以太坊钱包客户端,可以生成和发送交易,可以查询以太坊区块链数据;同时意味着存在一个以太坊智能合约,使得各合同签署方可以通过智能合约完成注册和数据存储。在本实施例中,我们采用扩展的钱包客户端,采用Solidity语言开发智能合约,提供注册Register和存储Store两个接口。合同签署各方通过注册接口确认合同签署的意向,得到合同签署的唯一编号,确认各方认可的TTP、确认各签署人的签名顺序、并为各个签署人分配存储区。合同签署方或者TTP通过存储接口Store存储交易中的数据字段,并把不同合同签署人生成的不同交易数据存储在为其分配的存储区中,交易数据中应当包含此次合同签署的唯一编号。
TTP除拥有扩展的以太坊钱包之外,还需要打开服务程序,接受合同签署方的仲裁请求,提供仲裁服务。
哈希方案(Hash.init,Hash.update,Hash.final)在本具体实施例1采用SHA256哈希方案。
下面描述n=4时各方签署合同的实施过程:
各合同签署方通过以太坊智能合约的注册接口确认各方顺序等信息,设定合同签署方顺序为P1、P2、P3、P4,可信第三方为TTP,区块链节点是钱包客户端连接的任意以太坊节点,之后,
1)P1生成合同的数字签名可验证加密签名VES1,计算合同内容的哈希上下文CTX1,生成群组密钥协商协议(GKA)的元素GE1,把VES1、CTX1和GE1封装为区块链交易,发送给区块链节点,具体包括:
11)P1所签署的PDF合同是P1、P2、P3、P4协商一致的,称为m0,P1采用RSA-VES方案,P1通过RSA-VES的密钥生成算法生成P1的签名公私钥对
12)P1使用作为RSA签名密钥,按照PDF规范采用itextpdf库文件通过扩展的钱包客户端完成PDF合同的签署,生成的数字签名是通过对比签过名的PDF文档和原始未签名的PDF文档的比特序列,获得包含签名字段的比特序列,之后减去签名的比特序列,获得mP1和
13)P1通过扩展的钱包客户端通过RSA-VES算法获得可验证加密签名,签署内容为TTP的公钥也由RSA-VES算法提供,设签署的VES签名表示为设置
14)P1采用SHA256方案,首先对其初始化,然后执行更新操作,更新输入的比特序列是含有P1签名的完整PDF文档,更新之后,读取缓存的比特序列,形成CTX1;
15)P1采用前述的GKA方案,生成与左右邻居的ECDH共享秘密SK14和SK12,计算
16)P1把VES1、CTX1和GE1封装为以太坊交易的数据,调用智能合约的Store接口,把交易发送给以太坊区块链节点,交易发送时遵照以太坊客户端的规范,用ECDSA数字签名算法签名。
2)P2验证P1的VES签名,验证失败退出协议,否则P2生成新的数字签名VES2、CTX2、GE2并通过交易发给区块链节点,具体实施时,
21)P1的VES签名是采用RSA-VES方案中的签名算法生成的,P2通过该方案的密钥生成算法生成RSA签名的公私钥对
22)P2采用P1的RSA公钥,TTP的RSA公钥,并用PDF合同m0和VES1中的mP1和合成VES签署的比特序列,采用RSA-VES方案的签名验证算法验证P1的VES签名,如果该算法返回假,表明P1没有提交有效的数字签名,则停止执行协议,否则继续;
23)P2获取P1的附属信息mP1和按照PDF规范把mP1和与m0合成一个PDF文档,并采用0填充P1的数字签名的字段,形成与P1签完名之后完全相同长度的准文档之后采用itextpdf库文件通过扩展的钱包客户端按照PDF规范继续完成PDF合同的签署,形成和得到之后P2初始化SHA256算法,然后依赖P1提供的CTX1替换SHA256的缓存内容,之后更新输入填充后得到最终的哈希值,之后P2使用作为签名密钥,使用RSA数字签名算法直接签署PDF合同的哈希值,得到
24)P2根据重新计算的哈希值,按照RSA-VES的VES签名方案计算P2的VES签名设置
25)P2初始化SHA256方案,用CTX1的比特序列替换初始化之后的比特序列,并更新输入的比特序列,把此时SHA256的缓存内容设置为CTX2;
27)P2采用前述的GKA方案,生成与左右邻居的ECDH共享秘密SK21和SK23,计算
28)P2把VES2、CTX2和GE2封装为以太坊交易的数据,调用智能合约的Store接口,把交易发送给以太坊区块链节点,交易发送时遵照以太坊客户端的规范,用ECDSA数字签名算法签名。
3)P3验证P2的VES签名,验证失败退出协议,否则P3生成新的数字签名VES3、CTX3、GE3并通过交易发给区块链节点,具体实施过程与P2的实施过程类似,其中
4)P4验证P3的VES签名,验证失败退出协议,否则P4生成新的数字签名VES4、CTX4、GE4并通过交易发给区块链节点,具体实施过程与P2的实施过程类似,其中
5)P1验证P2、P3、P4的VES签名,需要计算比特序列的哈希值,其中的比特序列P1可以直接从VES2的内容构造出来,的比特序列无法恢复,需要使用步骤23)类似的方法,采用CTX2与VES3的内容计算其哈希值,哈希值的计算方法与类似;此时,采用RSA-VES的验证算法,P1可以验证P2、P3、P4的VES签名,如果任何一个签名验证失败,退出协议;否则计算群组加密密钥GK,计算方法是计算GK=SHA256(SHA256(SK12)||SHA256(SK23)||SHA256(SK34)||SHA256(SK14)),然后采用AES256-CTR加密形成C1,把C1封装为交易,调用Store接口,采用P1的以太坊私钥,采用ECDSA数字签名签署,之后发给以太坊节点;
6)P2验证P3、P4的VES签名,计算比特序列的哈希值,计算过程与步骤5)类似,如果任何一个签名验证失败,退出协议;否则计算群组加密密钥GK,计算方法是计算GK=SHA256(SHA256(SK21)||SHA256(SK23)||SHA256(SK34)||SHA256(SK41)),然后采用AES256-CTR加密形成C2,把C2封装为交易,调用Store接口,采用P2的以太坊私钥,采用ECDSA数字签名签署,之后发给以太坊节点;
7)P3验证P1,P4的VES签名,计算比特序列的哈希值,计算过程与步骤5)类似,如果签名验证失败,退出协议;否则计算群组加密密钥GK,计算方法是计算GK=SHA256(SHA256(SK12)||SHA256(SK32)||SHA256(SK34)||SHA256(SK41)),然后采用AES256-CTR加密形成C3,把C3封装为交易,调用Store接口,采用P3的以太坊私钥,采用ECDSA数字签名签署,之后发给以太坊节点;
8)P4验证P1,P2的VES签名,计算比特序列的哈希值,计算过程与步骤5)类似,如果签名验证失败,退出协议;否则计算群组加密密钥GK,计算方法是计算GK=SHA256(SHA256(SK12)||SHA256(SK23)||SHA256(SK43)||SHA256(SK41)),然后采用AES256-CTR加密形成C4,把C4封装为交易,调用Store接口,采用P4的以太坊私钥,采用ECDSA数字签名签署,之后发给以太坊节点;
9)P1用GK解密Cg,2≤g≤4,得到然后用PDF合同m0,VESg,1≤g≤4中的和首先验证解密的数字签名是否正确,验证不通过,认为出现了异常,执行异常处理流程,否则依照PDF合同的规范合成新的PDF文档,获得具有各合同签署方签名的PDF合同;
10)P2、P3、P4获得有签字的PDF合同的过程类似步骤9)。
11)如果在步骤9或者步骤10中,Pj,1≤j≤4,发送含有加密数字签名的交易之后开始计时,如果超时后依旧未能获取、或者获取后验证不通过某个或某些合同签署方加密后的数字签名,例如未能获得Pi的数字签名,1≤i≠j≤4,那么认为合同签署出现了异常,需要完成异常处理流程;Pj向TTP发送仲裁请求,指明Pi的以太坊地址,描述原因为超时,同时给出智能合约的地址和Pj计算的群组加密密钥GK;
TTP查询智能合约存储的内容,确认Pi确实没有发送加密的数字签名,而同时Pj是遵守协议的,即发送了加密的数字签名,且解密后与VESj中的VES签名恢复后的数字签名相同,且Pi的VES签名从来没有恢复过,此时TTP受理仲裁,恢复VESi中的VES签名为普通签名,如果仲裁的描述原因是数字签名不正确,需要对比恢复的数字签名和描述的数字签名是否一致,一致则不再处理,否则使用GK加密后形成Ci,并把仲裁事件和Ci一起形成交易,调用智能合约的Store接口,发送给区块链节点;
此后,Pj获取Ci,解密后类似步骤9)合成PDF文档。
实施例2:
实施例2与实施例1基本相同,不同之处在于实施例2运行在QTUM、Fabric等智能合约平台中。
实施例3:
实施例3与实施例1基本相同,不同之处在于实施例3采用了DSA数字签名、DSA-VES可验证签名、SHA-3-256哈希方案等具体方案。
实施例4:
实施例4与实施例1基本相同,不同之处在于实施例4的合同签署人数不是4人,而是3人或者5到100中的任意人数。
实施例5:
实施例5与实施例1基本相同,不同之处在于实施例5采用了AES-CBC,AES-ECB,AES-CFB,AES-OFB或者其他包括但不限于IDEA,3DES等加密算法加密了PDF合同的数字签名。