学习shamir秘密分享
介绍
1979年Shamir在下文提出基于拉格朗日插值多项式的\((r,n)\)秘密共享方案(\(0<r \leq n\))。秘密拥有者通过构建一元多项式将秘密分为\(n\)份,接收方收集大于等于\(r\)份的子秘密即可重构多项式恢复秘密。
方案
\((r,n)\)秘密共享方案分为秘密分享和秘密重构两步:
- 秘密分享
假设有一个秘密\(M\),取\(r-1\)个随机数\(d_1,d_2,...,d_{r-1}\),构造一个\(r-1\)次一元多项式\(w(x)=M+d_1x+d_2x^2+...+d_{r-1}x^{r-1}\)。
\(x\)取\((1,...,n)\),计算出\(n\)个子秘密\((x,w(x))\),将这\(n\)个子秘密发送给\(n\)个不同的人。
- 秘密重构
当有不少于\(r\)个不同的子秘密聚在一起时,根据拉格朗日插值,可以唯一插值出一个\(r-1\)次多项式,即:
也可以看作是:\(w(x)=M+d_1x+d_2x^2+...+d_{r-1}x^{r-1}\),另\(x=0\),就可以得到秘密\(M=w(0)\)。
实验
import random
from decimal import Decimal
FIELD_SIZE = 10**5 # GF域大小
def reconstruct_secret(shares):
"""
Combines individual shares (points on graph)
using Lagranges interpolation.
`shares` is a list of points (x, y) belonging to a
polynomial with a constant of our key.
"""
sums = 0
for j, share_j in enumerate(shares):
xj, yj = share_j
prod = Decimal(1)
for i, share_i in enumerate(shares):
xi, _ = share_i
if i != j:
prod *= Decimal(Decimal(xi)/(xi-xj))
prod *= yj
sums += Decimal(prod)
return int(round(Decimal(sums), 0))
def polynom(x, coefficients):
"""
This generates a single point on the graph of given polynomial
in `x`. The polynomial is given by the list of `coefficients`.
"""
point = 0
# Loop through reversed list, so that indices from enumerate match the
# actual coefficient indices
for coefficient_index, coefficient_value in enumerate(coefficients[::-1]):
point += x ** coefficient_index * coefficient_value
return point
def coeff(t, secret):
"""
Randomly generate a list of coefficients for a polynomial with
degree of `t` - 1, whose constant is `secret`.
For example with a 3rd degree coefficient like this:
3x^3 + 4x^2 + 18x + 554
554 is the secret, and the polynomial degree + 1 is
how many points are needed to recover this secret.
(in this case it's 4 points).
"""
coeff = [random.randrange(0, FIELD_SIZE) for _ in range(t - 1)]
coeff.append(secret)
return coeff
def generate_shares(n, m, secret):
"""
Split given `secret` into `n` shares with minimum threshold
of `m` shares to recover this `secret`, using SSS algorithm.
"""
coefficients = coeff(m, secret)
shares = []
for i in range(1, n+1):
x = random.randrange(1, FIELD_SIZE)
shares.append((x, polynom(x, coefficients)))
return shares
# Driver code
if __name__ == '__main__':
# (3,5) sharing scheme
t, n = 3, 5
secret = 1234
print(f'Original Secret: {secret}')
# Phase I: Generation of shares
shares = generate_shares(n, t, secret)
print(f'Shares: {", ".join(str(share) for share in shares)}')
# Phase II: Secret Reconstruction
# Picking t shares randomly for
# reconstruction
pool = random.sample(shares, t)
print(f'Combining shares: {", ".join(str(share) for share in pool)}')
print(f'Reconstructed secret: {reconstruct_secret(pool)}')
## 输出
Original Secret: 1234
Shares: (85479, 169064248999330), (64655, 96725154480594), (47701, 52649409201294), (99941, 231110282437614), (93923, 204115595277642)
Combining shares: (47701, 52649409201294), (64655, 96725154480594), (99941, 231110282437614)
Reconstructed secret: 1234
总结
秘密共享方案广泛应用于要求信任是分布式而不是集中式的密码系统中。使用秘密共享的真实场景的突出例子包括:
- 基于阈值的比特币签名
- 安全多方计算
- 具有多方计算的私有机器学习
- 密码管理
学习shamir秘密分享的更多相关文章
- Shamir秘密共享方案 (Python)
Shamir's Secret Sharing scheme is an important cryptographic algorithm that allows private informati ...
- PMBOK 学习与实践分享视频
本系列为自己在学习PMBOK时进行的总结与分享,每一节主要包括两部分: 对PMBOK本身的一个结构笔记和讲解. 对自己项目管理工作的一个总结和思考. PMBOK 学习与实践分享视频内容清单 人力资源管 ...
- TreeGrid 控件集 :delphi 学习群 ---- 166637277 (Delphi学习交流与分享)
delphi 学习群: 166637277 (Delphi学习交流与分享). 群主QQ: 1936431438 TreeGrid 控件集 收集: 1.https://www.lmd.de/produ ...
- 一份最中肯的Java学习路线+资源分享(拒绝傻逼式分享)
这是一篇针对Java初学者,或者说在Java学习路线上出了一些问题(不知道该学什么.不知道整体的学习路线是什么样的) 第一步:Java基础(一个月左右) 推荐视频: 下面的是黑马内部视频,我比较推荐的 ...
- SQL Server 学习博客分享列表(应用式学习 + 深入理解)
SQL Server 学习博客分享列表(应用式学习 + 深入理解) 转自:https://blog.csdn.net/tianjing0805/article/details/75047574 SQL ...
- JS的学习体会与分享
最近在学习js这门计算机网络的新知识.相比与之前所学习的html和css这两门编程语言,js 还是有很多的不同之处,它相比于前两门知识还是有一定的难度和逻辑性的.今天跟大家分享一篇文章,希望能从中获得 ...
- python基础系列教程,数学基础系列教程,数据分析系列教程,神经网络系列教程,深度学习系列视频教程分享交流
大家好,我是一个技术爱好者,目前对大数据人工智能很是痴迷,虽然学历只有高中,目前正在大踏步的向着人工智能狂奔,如果你也想学习,那就来吧 我的学习进度python基础(Numpy,pandas,matp ...
- 《PHP框架Laravel学习》系列分享专栏
<PHP框架Laravel学习>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201735.html 文章 Laravel教程:l ...
- 史诗级Java/JavaWeb学习资源免费分享
黑马内部视频+相关配套学习资料 Java Spring 技术栈构建前后台团购网站 Java SSM开发大众点评后端 欢迎关注微信公众号:Java面试通关手册 回复关键词: "资源分享第一波& ...
- 怎样学习webpack - 走心分享
很多朋友可能都知道webpack,也见过webpack的代码,但是不明白里面一坨一坨的东西是什么意思,到底有什么用处!我们每个人学习一个新东西可能都会有这个过程,但是我个人觉得webpack可能是最混 ...
随机推荐
- 2022 GDOI普及组游记
2022 GDOI普及组游记 注:传送门均为校内网址 day -4 被年级主任集中开会,给我们免了亿堆作业,灌了亿壶鸡汤,宣布了为期一(亿)周的集训开始. day -3 中午一直在复习期中(4.21- ...
- 深入解析Apache Mina源码(1)——Mina的过滤器机制实现
1.深入解析Apache Mina源码(1)--Mina的过滤器机制实现 2.深入解析Apache Mina源码(2)--Mina的事件模型 3.深入解析Apache Mina源码(3)--Mina的 ...
- 支付宝支付功能接入(PC)
在使用支付宝支付功能开发的阶段, 可以在沙箱环境下进行开发, 开发完成之后, 到线上再进行相关参数的替换即可 一. 登陆支付宝开放平台(https://open.alipay.com/platform ...
- AWMS(ApeosWare Management Suite)的一些配置信息
富士胶片商业创新的富士施乐打印复印一体机,一般可用被称为亚特兰大(ApeosWare Management Suite)的管理软件. Windows Server 2012 上安装的SQLServer ...
- 在自家的代码生成工具中,增加对跨平台WxPython项目的前端代码生成,简直方便的不得了
在经过长时间对WxPython的深入研究,并对其构建项目有深入的了解,以及完成对基础框架的完整改写后,终于在代码生成工具完全整合了基于 Python 跨平台方案项目的代码快速生成了,包括基于FastA ...
- 《JavaScript 模式》读书笔记(7)— 设计模式1
这些模式已经出现了相当长的一段时间,并被证明在许多情况下都非常有用.这也是为什么需要自己熟悉并谈论这些模式的原因. 虽然这些设计模式是与语言和实现方式无关的,并且人们已经对此研究了多年,但都主要是从强 ...
- vue使用高德地图Amap未定义问题
// 引入高德地图 import VueAMap from 'vue-amap'; Vue.use(VueAMap); // 初始化vue-amap VueAMap.initAMapApiLoader ...
- 两个 F# 的 MVVM
fsprojects/Avalonia.FuncUI: Develop cross-plattform GUI Applications using F# and Avalonia! fabulous ...
- 解决用netty去做web服务时,post长度过大的问题
原文地址 http://my.oschina.net/momohuang/blog/114552 先说一下,本来是想自己写socket ,启动一个简单点的web服务用于接收数据的.写完之后,发现会有各 ...
- Qt/C++音视频开发58-逐帧播放/上一帧下一帧/切换播放进度/实时解码
一.前言 逐帧播放是近期增加的功能,之前也一直思考过这个功能该如何实现,对于mdk/qtav等内核组件,可以直接用该组件提供的接口实现即可,而对于ffmpeg,需要自己处理,如果有缓存的数据的话,可以 ...