Shamir’s Secret Sharing scheme is an important cryptographic algorithm that allows private information— “secrets” — to be distributed securely amongst an untrusted network.

Shamir’s method for secret sharing relies on polynomial interpolation, which is an algebraic method of estimating unknown values in a gap between two known data points — without needing to know anything about what is on either side of those points.

SSS encodes a “secret” into a polynomial, then splits it into pieces and distributes it It’s possible to use polynomial interpolation to efficiently reconstruct that secret without requiring every single share. Instead only the threshold is needed, which provides enough points of data to correctly estimate the values between gaps in the encrypted shares.

Shamir秘密共享方案,叫做Shamir Secret Sharing, SSS。是由Shamir提出的一个分享密钥(本文秘密和“密钥”同义)的局部、并共同计算密钥的方法。

设计目的

假设公司A,B,C有一个密钥可以打开共同的仓库房门,为了防止保管人不在,或者被侵害,或者钥匙被偷,或者监守自盗。需要设计一个分享秘密的方案。

一个直观的方案就是将秘密分开为3份,给ABC各自钥匙的一部分,他们的子密钥合起来才能打开房门。

数学定义

引入一个临界点(Threshold,也叫门槛)的概念。N个分享秘密的人,只要凑够k个人(k<=N)就可以重建秘密。k就是这个临界点。

k

k=N,表明方案中所有的参与者需要贡献出自己的子秘密,才能合成所需的秘密。

举例

一个(k,N) 临界点方案,其共享秘密是 S.

对一个k-1次的多项式,取 N个不一样的点(i,f(i))。那么只要凑够 k个点就可以接出系数(a0,a1,……ak-1)。

只要把N个点分给N个人,设某个系数为共同秘密(如a0是秘密),那么就等于实现了SSS算法。

秘密分配及还原过程

首先介绍一个小费马定理:

引申为:

那么有:

秘密碎片生成:

构造一个多项式

其中,S为我们的秘密,p为素数,且S < p

取w个不相等的x,带入F(x)中,得到w组(xi,yi),分配给w个人

公开p,销毁多项式,每个人负责保密自己的(xi,yi)

秘密恢复:

当x=0时,F(0)=S,即可恢复出S

将t组(xi,yi)带入下式即可

其中,负一次方为该项模p的逆

将t组(xi,yi)带入即可得到S

示例:

假设我们有w=4个人,设定至少t=3人才能恢复秘密。

秘密S=2,p=23

构造

取x1=1,x2=2,x3=3,x4=4

带入得y1=7,y2=16, y3=6,y4=0

利用3组进行恢复(1,7) (3,6) (4,0)

计算可得到S=2

一个简单的恢复脚本

1 #coding:utf-8

2

3

4 def oj(a, n): #求逆的函数

5 a = a %n6 s = [0, 1]7 while a != 1:8 if a ==0:9 return010 q = n/a11 t = n %a12 n =a13 a =t14 s += [s[-2] - q * s[-1]]15 return s[-1]16

17 p = 23

18 m = ((4, 0),19 (3, 6),20 (2, 16))21 r =(22 m[0][1] * (0 - m[1][0]) * (0 - m[2][0]) * oj((m[0][0] - m[1][0]) * (m[0][0] - m[2][0]), p) +

23 m[1][1] * (0 - m[0][0]) * (0 - m[2][0]) * oj((m[1][0] - m[0][0]) * (m[1][0] - m[2][0]), p) +

24 m[2][1] * (0 - m[0][0]) * (0 - m[1][0]) * oj((m[2][0] - m[0][0]) * (m[2][0] - m[1][0]), p)25 ) %p26 print r

另外一个脚本

1 importCrypto.Util.number as numb2 importrandom3

4

5 #求逆的函数,之前的版本用python2写的,这次用的python3,只把整除符号改了一下

6 defoj(a, n):7 a = a %n8 s = [0, 1]9 while a != 1:10 if a ==0:11 return012 q = n //a13 t = n %a14 n =a15 a =t16 s += [s[-2] - q * s[-1]]17 return s[-1]18

19

20 #max_length 为p的长度,同时也是秘密的最大长度

21 #secret_is_text =0 默认输入时文本, 非0时认为是数字

22 #p 默认为0, 会根据max_length 自动生成,不为0时直接使用,需要保证p为素数, 函数内没有素性检验

23 def create(max_length=513, secret_is_text=0, p=0):24 if notp:25 p =numb.getPrime(max_length)26

27 w = int(input("请输入秘密保存人数:"))28 t = int(input("请输入秘密恢复所需人数:"))29 while not (t > 0 and t <=w):30 t = int(input("请重新输入:"))31 s = input("请输入你的秘密:")32

33 ifsecret_is_text:34 s = numb.bytes_to_long(s.encode("utf-8"))35 else:36 try:37 s =int(s)38 exceptException as e:39 s = numb.bytes_to_long(s.encode("utf-8"))40

41 x_list =list()42 a_list =list()43 i =w44 while i >0:45 x = random.randint(p // 2, p) #该范围没有特定限制,如果想让xi,yi取小一点儿的话可把范围写小点儿,但是要大于w

46 if x not inx_list:47 x_list.append(x)48 i -= 1

49

50 for a inrange(t):51 a_list.append(random.randint(p // 2, p)) #同上

52

53 result =list()54 for x inx_list:55 y =s56 for a_n inrange(t):57 a =a_list[i]58 y += a * pow(x, i + 1, p)59 result.append((x, y))60 returnt, p, result61

62

63 #get_text=1 默认恢复为字符串,若想得到数字填0

64 def restore(p, information, get_text=1):65

66 x_list =list()67 y_list=list()68 for x, y ininformation:69 x_list.append(x)70 y_list.append(y)71

72 s =073 for x_i inrange(len(x_list)):74 tmp_num =y_list[x_i]75 x_i_j = 1

76 for x_j inrange(len(x_list)):77 if x_i !=x_j:78 tmp_num = tmp_num * (0 - x_list[x_j]) %p79 x_i_j *= x_list[x_i] -x_list[x_j]80 tmp_num = tmp_num * oj(x_i_j, p) %p81 s +=tmp_num82

83 s = s %p84 print(s)85 ifget_text:86 try:87 s =numb.long_to_bytes(s)88 s = s.decode("utf-8")89 exceptException as e:90 print(e)91

92 returns93

94

95 t, p, result = create() #result为秘密碎片的列表

96 print(result)97 print(restore(p, result[:t])) #这里我取了result的前t个,实际中可以取任意t个。

python的秘密_Shamir秘密共享方案 (Python)相关推荐

  1. 基于中国剩余定理的秘密共享方案(Python实现)

    本文目录 一.实验目的(包括实验环境.实现目标等等) 1. 实验环境 2. 实现目标 二.方案设计(包括背景.原理.必要的公式.图表.算法步骤等等) 1. 背景 2. 原理 3. 公式 4. 中国剩余 ...

  2. python深入和扩展_加速方案 — Python扩展模块

    原标题:加速方案 - Python扩展模块 ctypes(一)- 初识 这章我们介绍Python的扩展名之ctypes,教大家认识ctypes.喜欢Python的读者们可以加Python学习交流群:5 ...

  3. shamir秘密共享方案_Shamir秘密分享的初学者指南

    shamir秘密共享方案 An introduction to this privacy-preserving cryptographic technique and how Keyless is u ...

  4. Python 的 51 个秘密曝光,Github 获 2 万星

    点击上方"小詹学Python",选择"置顶或者星标" 第一时间收到精彩推送! Python, 是一个设计优美的解释型高级语言, 它提供了很多能让程序员感到舒适的 ...

  5. LSSS线性秘密共享方案详细构造方法与原理解释

    关于LSSS线性秘密共享方案详细构造方法与原理解释 文章目录 1.LSSS定义 2.Access Tree转化为LSSS矩阵方法 3.LSSS算法正确性证明 1.LSSS定义 LSSS英文精确定义如下 ...

  6. 基于中国剩余定理的秘密共享方案(miracl库)

    注意:本文算法效率极低,大数在3位数时就会运行10分钟左右,若是更大的数字,博主等不了没试过.请移步https://blog.csdn.net/qq_42450533/article/details/ ...

  7. 基于中国剩余定理的秘密共享方案(miracl)

    基于中国剩余定理的秘密共享方案 该算法比https://blog.csdn.net/qq_42450533/article/details/102942808的代码效率更高. 秘密共享是将秘密以适当的 ...

  8. 关于秘密共享方案的实例(shamir)

    网上有些博主可能发布过相关的文章,我之前也动手算过一次,怎么算都算不对.后来发现mod p这个运算的除法运算比较独特. 首先介绍一个小费马定理: 引申为: 那么有: 接下来步入正题:shamir(t, ...

  9. 秘密共享方案介绍SS

    秘密共享 概念 Shamir秘密共享方案 秘密拆分 秘密恢复 补充 网页参考链接 概念 问题1:保险柜中存放有10个人的共有财产,要从保险柜中取出物品,必须有半数以上的人在场才可取出,半数以下则不行. ...

最新文章

  1. python【蓝桥杯vip练习题库】ALGO-157 阶乘末尾(高精度)
  2. eclipse目录出现重复情况 解决
  3. getopt()和getopt_long()用法
  4. linux opencv cmake,OpenCV基础篇之使用CMake管理工程
  5. 时间格式化,常用时间,格式
  6. python学习之继承
  7. Hadoop-2.2.0中文文档—— Common - CLI MiniCluster
  8. 老男孩Linux高新运维第28期最终篇+老男孩Linux运维+老男孩linux运维全套
  9. 2021数学建模A题详细思路
  10. 一个很好用的angularjs日期插件
  11. iOS开发 swift 3dTouch实现 附代码
  12. JavaSE总结知识点 重要的点(并不是详细的教材语录)
  13. UE4学习笔记-材质篇(一)UV动画制作
  14. Mysql 编程实战三之计算两个日期的工作日数
  15. Golang zap和lumberjack实现日志存储和自动管理
  16. luogu4185 [USACO18JAN]MooTube Gold
  17. java excel api及详细教程_Java Excel Api及详细教程
  18. Javaweb-请求报500问题
  19. 基于C#分步式聊天系统的在线视频直播系统设计
  20. LEDE/Openwrt 打印机插件 CUPS,在WIN10下添加打印机(打印机连接路由器进行远程打印)

热门文章

  1. D-脱硫生物素dethiobiotinCAS号:533-48-2
  2. 基于MODIS数据的滁州市冬小麦长势遥感监测研究
  3. 小米手机比较 联通、移动、电信 3G 支持比较
  4. 一键生成iosandroid应用图标
  5. 关于mac上如何U盘
  6. 华为HCIE认证改版(2021年5月30日正式改版升级)
  7. 智云通CRM:如何与客户建立信任关系?
  8. git重置commit时的注释
  9. openwrt路由器接华为E3372(E8372)网卡实现4G转有线和WIFI
  10. PS如何查看所选图层的实际像素?