1. secret sharing秘密共享
1.1 secret sharing definition
在Adi Shamir 1979年论文《How to share a secret》(发表在论文《Safeguarding cryptographic keys 》之后,实现方式不同且效率更低。),举了个例子,若11个人需要6个以上到场才能打开某个带锁的箱子,则至少需要462把锁,每个人至少需要到252把钥匙。(具体解法可参见博客锁和钥匙的分配问题。)
假设需要共享的秘密为某数据 ,将 切分为 段 ,需要实现的是:
- 1)知道大于等于 段 信息,则可以恢复出完整的数据 ;
- 2)知道少于等于 段 信息,则无法确定完整的数据 。
称为阈值机制。
有效的阈值机制在管理密码学key时非常有用。通常,为了保护数据,我们可以对数据进行加密,但是为了保护加密用的key,需要有专门的密钥key保护措施:
通过使用
阈值机制,将密钥key分为
份分别保存,可以在
块密钥段损坏的情况下,仍能恢复密钥key;而在非法获得哪怕
块正确的密钥段也无法重构出正确的密钥key。
阈值机制特别适于一群相互怀疑但又不得不合作的群体使用。
1.2 a simple threshold scheme
基于的多项式插值:当有 个不同的点 时,任意两个 均不相同,可唯一确定 阶的多项式 ,使得对于任意的 ,均满足 。
将其推广到
threshold scheme可为:
将数据
表示为number数字,切分为数据段
,取任意的
阶多项式
,其中
,对
段信息都进行计算,有:
所以,对于任意k个数据段子集(及相应的索引
),可通过多项式插值的方式计算多项式
的系数,然后可计算出完整的
值,
。若仅知道
个数据段,则无法计算相应的
值。
为了使计算结果更准确,将采用模运算来替代实数域运算。可以取比 的素数 作为模基数。
2. verifiable secret sharing可验证的秘密共享
Benny Chor等人1985年论文《Verifiable secret sharing and achieving simultaneity in the presence of faults》首次提出了verifiable secret sharing可验证的秘密共享的概念。
2.1 背景介绍
在该论文中,提出了如下场景:同时广播网络中,有n个参与方
,可容忍t个拜占庭错误。
n个人在同一个房间,每个人有自己的黑板和粉笔。房间设置为开灯一个小时,然后关灯一个小时,再开灯一小时,关灯一小时,如此往复。在关灯时,每个人在自己的黑板上写一段话,只有灯亮时,才能同时看到其它人黑板上的内容。在第
次灯关闭时
写的内容,被称为
的第
条消息。
可能存在的场景是,在灯关时,有人偷偷告诉别人即将准备写在黑板上的内容。
所以存在以下属性:
1)在第
轮,假设
不与任何人合作,则
的第
条消息与其它每个人的第
条消息是independent相互独立的;(即时性)
2)当灯亮时,消息不允许擦除或者修改。若
的黑板为空白的,则表示他发送的为空消息。(广播)
3)所有人都可以看到每个人的第
条消息。(广播)
将上述过程抽象为数学描述:
假设
代表通信网络,该网络中有
个processor 处理器
通过同一消息通道,参与消息的发送和接收。每个参与方除了需要将信息发送给其它人外,还需要进行内部的计算(如抛硬币,读取存储器状态等) 。
若
按指定的协议
执行,则可说
是正确的,否则称其为错误的。错误的参与方会尝试毁坏整个通信系统。
Simultaneous broadcast networks 即时通信网络是以下协议即时性的核心组成:抛掷硬币,公平选举,合同签订,秘密交换等。
2.2 Verifiable Secret Sharing定义
在Adi Shamir 1979年论文《How to share a secret》中提出的秘密共享方法在信息理论上来说是安全的,但是基于的考虑是所有参与方都是正确的,且消息段的分发是私下地privately。实际应用时,在分布式网络中存在错误的参与方,也没法将消息段以明文形式通过公共网络发送。
当考虑存在不诚实参与方时,对于一个消息段 ,需要有相应的算法来验证其确实是秘密的有效片段,否则不存在秘密可言。所以Shamir秘密共享机制在需要容错能力的分布式环境中无法使用。
Benny Chor等人1985年论文《Verifiable secret sharing and achieving simultaneity in the presence of faults》提出了具有容错机制的可验证秘密共享算法:
将秘密抽象为一个secret bit
,
个参与者,
个错误,安全参数为
。存在将秘密切分的delaer A和参与者C。
-
Part I(准备阶段)
1)获取具有K-bits长度的素数 个—— 。
2)计算 。
3)选取 ,使得 的最低有效位为 。
4)计算 。
5)广播 。 -
Part II(数据段分发)
6)通过在A和C之间运行oblivious transfer,每一个参与者C将获得 的随机片段。 -
Part III(重构秘密)
7)每个参与方C都广播自己所拥有的 片段。
8)参与方C可验证A是否背离了协议,若发现A不诚实,则设置b=“empty message”;若诚实,则C继续接收 的其它数据片段(至少 个),然后尝试对 进行因式分解。若 可被分解,且正好有 个素数因子,且the exponent 3 is relative prime to ,则C可计算 ,取 的最低有效位即为A要共享的秘密 。
3. Feldman Verifiable Secret Sharing(Feldman VSS算法)
Paul Feldman 1997年论文《A Practical Scheme for Non-interactive Verifiable Secret Sharing》是第一个有效的VSS算法。
参考资料:
[1] 1991年论文《non-interactive and information-theoretic secure verifiable secret sharing》
[2] 1979年论文《How to share a secret》
[3] 1997年论文《A Practical Scheme for Non-interactive Verifiable Secret Sharing》
[4] 1985年论文《Verifiable secret sharing and achieving simultaneity in the presence of faults》
[5] 1979年论文《Safeguarding cryptographic keys 》
[6] 1998年论文《Proactive Secret Sharing Or: How to Cope With Perpetual Leakage》
[7] https://en.wikipedia.org/wiki/Verifiable_secret_sharing