一种秘密共享方案的改进
2020-11-05曾宝苇
曾宝苇 罗 锐
(成都理工大学,四川 成都610000)
秘密共享方案分担了密钥的管理风险,其主要解决了两方面的问题:(1)部分密钥泄露,不影响整体秘密信息的安全性;(2)部分密钥遗忘,不影响整体秘密信息的恢复;但传统秘密共享方案中还存在一些安全性问题:秘密分发过程中,秘密分发者在知道参与者秘密份额的情况才进行欺骗;参与者提供的子秘密并不完全真实;秘密恢复过程中,未对子秘密进行验证.而区块链却可以解决上述秘密共享方案存在的问题。区块链的本质是一个无可信第三方、点对点传输的分布式数据库,具有去中心化、防篡改、防伪造、保护参与者隐私等特点。
1 基本秘密共享方案
在一个秘密共享方案中,有一个秘密分发者和一组共享秘密的参与者P={p1,…,pn}。需要分配的秘密由分发者分成个秘密份额S1,…,Sn,每个份额Si通过信道分发给参与者。其中,为秘密值的范围,为每个秘密共享的值空间,是秘密共享的范围,则
(1)如果P'={pi1,…,pii}⊂P 是授权子集,那么能通过它们的秘密份额{si1,…,sii}重构恢复秘密;
(2)如果P'={pi1,…,pii}⊂P 不是授权子集,那么通过它们的秘密份额{si1,…,sii}则不能恢复秘密S。
2 区块链
一般来说,区块链是具有时间序列的数据块依次链接起来形成的特定数据结构,利用哈希散列函数和数字签名技术,使得传输的消息是真实不可篡改,不可伪造的,具有防篡改、可溯源的特性,同时保证了其用户参与者的匿名隐私性,而p2p 技术和工作量证明机制则使其去中心化成为可能。
区块链是一个单向链式存储结构,而块就是存储结构的数据信息,一个数据区块包含区块头和区块体两部分。区块头包含当前区块版本信息、前一区块版本信息的哈希值、目标哈希值、随机数、Merkle 树根、时间戳.区块体包含当前区块的所有事务记录,这些记录通过哈希和Merkle 树最终生成Merkle 树根,保存在区块头中。所有区块按照其时间顺序依次单向连接,形成一条区块链,其中第一个区块叫做创世区块,区块链的结构示意图如图1。
Hash 函数:通过哈希将任意长度的输入转换为固定长度的输出,输出值即为哈希值,Hash 函数的抗碰撞性、原象不可逆、难题友好性等特点,使得区块链具有防篡改、防伪功能,同时还可用作区块链中共识算法的工作量证明。本方案中用对数据交易加密,用RIPEMD160 生成参与者。
图1 区块链结构示意图
数字签名:只有信息发送方才能生成的数字字符,其他人不能伪造,用来证明发送方发送信息的真实性和发送者身份的验证,具有防抵赖的作用,本方案使用的是secp256k1 椭圆曲线数字签名算法。
3 方案设计与实现
基于现有的秘密共享方案的不足,本文提出一种秘密共享方案的改进,将区块链技术和秘密共享方案结合,改进和解决原有方案的缺陷。
本方案将子秘密数据封装成虚拟资产和交易,以参与者钱包地址作为参与者,以参与者作为P2P 网络节点,每个参与者在区块链中以对等的身份互相监督、互相协助。首先通过区块链的工作量证明机制让参与者自行将秘密分成个子秘密,每个子秘密和参与者对应,以便查询、验证和溯源;每个子秘密提交给节点校验后,存储在区块上,在通过验证的子秘密集合中,至少需要个子秘密才能恢复重构秘密。
系统参数描述:定义在有限域上的GF(φ)椭圆曲线E,特征为φ,一个基点为G∈E(GF(φ)),设秘密空间和子秘密空间均为有限域GF(φ),需共享的秘密S 是GF(φ)上随机选取的,S∈GF(φ)。(1)将子秘密数据封装成虚拟资产和交易
需共享的秘密通过工作量证明机制被参与者自行拆分成份子秘密,这些子秘密相当于是分配给参与者的虚拟资产,参与者通过挖矿的形式获得子秘密,将每份子秘密封装成子秘密块,块包含前一个块的哈希值、时间戳、Merkle 树根、随机数Nonce。
(2)将参与者钱包地址作为参与者
a.参与者生成密钥对
参与者利用随机数生成器生成一串随机数,将随机数经过生成一串256 位二进制数,判断私钥的二进制数是否处于1-n(n=1.158×1077略小于2256),如果是,则生成私钥,否则一直重复上述步骤,直到生成私钥为止。使用椭圆曲线加密算法,计算公钥,为椭圆曲线基准点。
b.由公钥生成地址
生成的公钥经过单向函数映射得到一个32 字节的数字,再经过RIPEMD-169 映射得到一个20 字节的数,再将经过两次映射,取结果前4 个字节放到20 字节后面作为校验和,再取前缀为零的12 比特版本号加到整体前面,就形成了版本号-160比特- 检验和结构,经过Base58 编码生成参与者地址字符串,作为参与者。
秘密分发:通过工作量证明机制(Pow)实现子秘密的分发,取消原有方案中秘密分发者的角色,由参与者自行分配,每个参与者获得一个子秘密,实现去中心化的秘密分发。接着参与者对获得的子秘密先进行SHA-256,再进行数字签名,将子秘密和签名结果盖上时间戳,向全网广播。使用数字签名算法和时间戳可以防止交易数据在传输过程中被篡改、伪造,防止参与者抵赖。所使用的算法如下:
SHA-256 算法输入消息的最大长度不超过2^64 bit,输入按512-bit 分组进行处理,生成的输出是一个256-bit 的消息摘要。
(1)附加填充位。填充消息,使消息长度与448 模512 同余(长度)一致,填充的比特数范围是1 到512,填充比特串的最高位为1,其余位为0。首先在消息后面加一个1,再加很多个0,直到长度 满足。
(2)附加长度值。将64bit 原始消息的长度添加到步骤1 的结果中(低字节优先)。
(3)初始化缓存。使用256-bit 缓存存储散列函数的中间结果和最终结果。该缓存表示为, , , , , , , 。
(4)处理512-bit(16 个字)报文分组序列。该算法使用六种基本逻辑函数,由64 步迭代运算组成。每个步骤将256-bit 缓存值作为输入,然后更新缓存内容。 每一步使用一个32-bit的常数值Kt 和一个32-bit 的Wt。
(5)输出:在处理完所有512-bit 数据包后,SHA-256 算法的最后一个数据包生成的输出是一个256-bit 的消息摘要。
工作量证明:hashcash 算法:
(1)获取某种公开数据data(在反垃圾邮件场景下,使用收件人地址;在比特币中,使用block 头信息)。
(2)使用一个计数器counter,初始化为0。
(3)计算data+counter 的hash 值。
(4)检查hash 值是否满足某种要求。
a.满足,结束
b.不满足,counter 加1,然后重复3-4 步骤。
椭圆数字签名生成算法:
(1)计算消息散列,令是的最左边位;
(2)在之间选择一个随机整数,计算;
(3)计算,检验,如果,则返回执行步骤(2);
(4)计算,如果,返回执行步骤(2);
(5)签名为。
秘密验证:首先通过参与者ID,验证参与者是否存在,利用公钥将签名结果解密,验证数字签名是否有效,将子秘密SHA-256,将结果和解密后的摘要对比是否一致。
椭圆曲线签名验证算法:
(1)验证和是之间整数,否则签名无效;
(2)计算;
(3)计算;
(4)计算;
(5)如果,则签名有效,否则无效。
秘密重构:想要恢复秘密S 的参与者,向全网广播,收集验证子秘密,至少需要个已通过验证的子秘密才能重构恢复秘密S。
4 方案性能分析
该方案是一个完备的秘密共享方案。
证明:授权参与者的子集将他们的子秘密组合在一起,秘密可以被恢复; 如果一组未经授权的参与者子集将他们的子秘密组合在一起,则无法获得关于秘密的任何信息。该解决方案可以保证每个参与者获得正确的秘密共享。恢复秘密后,可以保证合作参与方提交正确的秘密份额,否则协议提前终止。
5 结论
本文设计的秘密共享方案使用区块链技术,以改进分发者分发原始秘密共享方案的集中方式。秘密分发是通过参与点对点分散模式进行的,这确保了参与者之间的信任,并防止了中央分发者和参与者作弊。