一、实验目的

理解Shamir门限秘密共享原理和性质。

二、实验要求

  1. 熟悉门限秘密共享原理
  2. 编程实现Shamir门限秘密共享算法

三、实验内容

1、实验原理

(t,n)门限方案是基于(t.n)门限访问结构上的秘密共享方案,而(t,n)门限访问结构包括所有t个或t个以上的参与者子集所构成的集合。

(1)Shamir (t,n)门限方案是通过构造一个t-1次多项式,并将需共享的秘密作为该多项式的常数项,将秘密分成n部分分别给n个参与者,使t个参与者联合可恢复秘密,但少于t个参与者联合不能得到共享秘密的任何信息。Blakley独立地提出的另一个(t,n)门限方案,它的基本思想是利用多维空间中的点来建立门限方案,将共享的秘密看成t维空间中的一个点,每个子秘密为包含这个点的t-1维超平面的方程,任意t个t- 1维超平面的交点刚好确定共享的秘密,而t-1个子秘密(即t-1个t-1维超平面)仅能确定其交线,因而得不到共享秘密的任何信息。

(2)Blakley方案比Shamir方案信息率低,但它有一个特殊的性质:任意t个子秘密除确定交点以外,它们相互之间是无关的,而Shamir方案却与此不同,任意t个子秘密能够确定整个多项式,并能计算出其余参与者的子秘密。

2、实验代码

# -*- coding:utf-8 -*-
import random
import math"""
This program generates a Shamir (t,n)-Threshold Scheme, with the desired
settings - as set by the user. The scheme can be initiated by running this
python script through the command line, or run directly via the python shell.For specifications, the program requires the following 4 parameters:
-Prime field, over which all calculations will be conducted
-Desired secret, in the form of some number less than the prime field
-Number of total participants
-Size of threshold
"""# 输入q, n, t, k
def initiateScheme(predefinedVars):kField = []n = 0t = 0#*Allows scheme to be run multiple times with different secretif not predefinedVars:Elements = input("Enter prime field (q)\n")q = int(Elements)q = testPrimality(q)Field = createField(q)print("\nField created:")print("q:", Field)kField = Fieldn = input("Enter number of participants n (less than field order)\n")t = input("Enter access structure length t (less than participant number)\n")predefinedVars = [n, t, q, Field]if(n >= t):print("Creating new (" + t + ", " + n + ")-Threshold Scheme")else:print("Access structure length must be less than number of participants")initiateScheme()else:kField = predefinedVars[3]q = predefinedVars[2]t = predefinedVars[1]n = predefinedVars[0]secretInd = input("\nEnter index of desired secret (k) in field (0 to (q-1))\n")secret_k = kField[int(secretInd)]print("k:", secret_k)recovered_k = runScheme(t, n, secret_k, q, Field)return predefinedVars, recovered_k# 检查是不是素数
def testPrimality(q):i = qq = math.sqrt(q)q = int(q)for p in range(2, (q+1)):f = i / pif(f.is_integer()):#print(f)#print(i)#print(p)newQ = input("Enter prime number")newQ = int(newQ)newQ = testPrimality(newQ)i = newQbreakreturn i# 创建有限域 GF(q)
def createField(q):ModuloK = []for i in range(0, q):ModuloK.append(i) return ModuloK# 运行算法
def runScheme(t_str, n_str, k, q, Field):x_subi = [0]a_subj = [0]pShares = [0]pShares_regex = [0]t = int(t_str)n = int(n_str)for i in range(1, n+1):#print("ran")x = getDistinctX(x_subi, Field)x_subi.append(x)print("x 所有取值:", x_subi)for j in range(1, t):ind = random.randint(0, q)a_subj.append(Field[ind])# 根据需要加减a_i的值print("a_1的值:", a_subj[1], "a_2的值:", a_subj[2])print("a_3的值:", a_subj[3], "a_4的值:", a_subj[4])    for i in range(1, n+1):x = x_subi[i]# print("x_i的值:",x)polynomialSum = k#print(k)for j in range(1, t):a = a_subj[j]# print("a:", a)exponent = math.pow(x, j)# print("exponent:", exponent)polynomialSum += a * exponent# print("polynomialSum:", polynomialSum)regEx = polynomialSum % qprint("(%d, %d)" %(x, regEx))pShares_regex.append(regEx)# print("all f(x) :", pShares_regex)pShares.append(polynomialSum)# 根据你需要的多项式,手动修改# print("f(x) = %d + %d x +%d x^2  mod %d" %(k, a_subj[1], a_subj[2], q))print("f(x) = %d + %d x +%d x^2 +%d x^3 + %d x^4 mod %d" %(k, a_subj[1], a_subj[2], a_subj[3], a_subj[4] ,q))print("Shares generated")displayShares_i(pShares_regex)generatedK = tryAccessStructure(k, pShares, x_subi, t_str, q)return generatedKdef reduce(integer, F):F.sort(reverse=True)print(F)binary = []regEx = []for i, f in enumerate(F):if(integer >= f):integer -= fbinary.append(1)regEx.append(f)else:binary.append(0)return binary, regExdef tryAccessStructure(k, pShares, x_subi, t_str, q):P_Subset = getSubset()generatedK = generateK(pShares, x_subi, P_Subset, q)if(generatedK != k):print("Incorrect secret; access structure must be of length: " + t_str)else:print("Secret recovered")r = input("Try different access structure (Y or N)\n")if(r.upper() == "Y"):generatedK = tryAccessStructure(k, pShares, x_subi, t_str, q)return generatedK# 生成x的值,x = 1~5
def getDistinctX(x_subi, F): #x_subi = []ind = random.randint(1, 5)# ind = range(0, (len(F)-1))x = F[ind]if not x in x_subi:return xelse:x = getDistinctX(x_subi, F)return xdef displayShares_i(pShares):P_ID_str = input("Enter participant number to see share (number from 1 - n)\n")P_ID = int(P_ID_str)try:Share = pShares[P_ID]Share = int(Share)print("Share for participant #" + P_ID_str + ": " + str(Share))Repeat = input("Display another share (Y, or N)\n")if(Repeat.upper() == "Y"):displayShares_i(pShares)except:print("Index out of range: \nEnter number between 1 and access structure length.")displayShares_i(pShares)return # 获取子密钥
def getSubset():Subset_RAWstr = input("\nEnter list of participants who wish to recover the secret\nEnter in form 'ID#1 ID#2 ... ID#T' where ID#i is the number of\nparticipant i \n")Subset_str = Subset_RAWstr.split()Subset = [0]Subset_mm = input("Enter list of Participant i secrets\n")for ID in Subset_str:try:ID = int(ID)Subset.append(ID)except:print("Error in list entered, try again")Subset = getSubset()#ADD RECURSIVE FUNCTIONreturn Subset# 恢复秘密k
def generateK(pShares, x_subi, Subset, q):y_subset = []x_subset = []Subset.sort()for ID in Subset:y_i = pShares[ID]x_i = x_subi[ID]y_subset.append(y_i)x_subset.append(x_i)recoveredK = 0for j in range(1, (len(x_subset))):x_j = x_subset[j]b_j = 1for L in range(1, len(x_subset)):if(L != j):x_L = x_subset[L]newCoeff = float(x_L)/(x_L - x_j)b_j = b_j * newCoeffrecoveredK += y_subset[j] * (b_j)recoveredK_int = int(round(recoveredK))print("恢复出的秘密值k:", recoveredK_int)return recoveredK_intdef runPackage(predefinedVars, recoveredKs):predefinedVars, returnK = initiateScheme(predefinedVars)# print("predefinedVars:", predefinedVars, "returnK:", returnK)if returnK in predefinedVars:print("New secret found:" + str(returnK))recoveredKs.append(returnK)print(recoveredKs)else:print("Invalid access structure")response = input("Run process again for different k in field (Y or N).\n")if(response.upper() == "Y"):runPackage(predefinedVars, recoveredKs)# initiateScheme()runPackage([], [])

四、实验步骤和结果

1、正确示范

2、错误示范

五、实验收获与体会

  1. 在这次实验中,使用的是python编写shamir门限算法,通过构造初始化函数、创建有限域 GF(q)、运行算法等函数组合编写成该门限共享方案。
  2. 通过这次实验,可以知道秘密共享算法是一种非常安全的算法,将共享的秘密分成若干份分别给予若干参与者保管,并规定哪些参与者联合起来可重构秘密,哪些参与者联合起来并不能得到任何信息,就像错误示范所示,当参与者个数少于最少重构秘密个数时,则不能得到任何信息。

Shamir门限秘密共享相关推荐

  1. Shamir 门限秘密共享

    Shamir 门限秘密共享        1979年,Shamir第一次提出了基于拉格朗日插值法的秘密共享策略,该方法实现简单,且为完备理想方案,是目前研究与应用最广泛的秘密共享策略.         ...

  2. 基于中国剩余定理的(t, n)门限秘密共享方案

    基于中国剩余定理的(t, n)门限秘密共享方案 目录 实验目的 实验环境 实现目标 方案设计 背景 实验原理 算法步骤 方案实现 流程图 主要函数介绍 主要代码 数据分析 数据1 数据1运行结果 数据 ...

  3. 基于 t 维空间中点的确定的(t, n)门限秘密共享

    基于 t 维空间中点的确定的(t, n)门限秘密共享 其原理基于三维空间中,两个互不平行的面相交于一条直线,三个互不平行的面相交于一个唯一确定的点. 那么,(t, n)门限秘密共享就可以看作将秘密信息 ...

  4. Shamir 门限方案|秘密共享|拉格朗日插值|密码学

    门限秘密分割 秘密s被分成n份毫无相关的部分信息,每一部分信息称为一个子密钥,由一个参与者持有,只有至少拥有k份子密钥时才能恢复出秘密s,这种方案为(k, n)-秘密分割门限方案,k称为方案的门限值 ...

  5. shamir秘密共享matlab程序,shamir 秘密共享代码

    早期的秘 密共享是由Shamir.¨和Blakley'纠于1979年分别提 出的,并分别给出了第一个(t,凡)门限秘密共享方 l LDPC 下面介绍LDPC的概念,编码及其译码. LDPC...... ...

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

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

  7. Shamir 秘密共享方案和Feldman可验证的秘密共享方案

    常用的秘密共享方案 首先提出问题--平均工资问题 什么是秘密共享? Shamir秘密共享分案 算法流程 可验证秘密共享的提出 什么是计算安全?什么是无条件安全? Feldman可验证的秘密共享 安全多 ...

  8. 安全多方计算之六:秘密共享

    秘密共享 1. 秘密共享简介 2. Shamir秘密共享方案 3. Asmuth-Bloom方案 4. 可验证的秘密共享 4.1 Feldman的VSS方案 4.2 Pedersen的VSS方案 5. ...

  9. 基于Pedersen承诺的可验证秘密共享方案: Pedersen VSS

    传统(t,n)门限秘密共享方案并未考虑参与者和秘密分发者可能出现的恶意行为: 当重构秘密时,不诚实的参与者发送错误的秘密份额 当份额分发时,秘密分发者分发错误的秘密份额 为解决上述欺骗问题,有学者于1 ...

最新文章

  1. VC++向txt文件中写入字符串
  2. docker 标记和推送镜像
  3. hdu 1163 ( 求n^n位根)
  4. 【Qt】sqlite数据库使用
  5. 剑与远征种族刻印让玩家期待,绿裔刻印真有那么好看
  6. hibernate 懒加载_Hibernate懒/急加载示例
  7. 源码分析Thread
  8. 1 jquery对checkbox的简单操作
  9. django 中静态文件项目加载问题
  10. 深海迷航坐标传送代码_深海迷航代码输入方法
  11. 实际成本调整(R12)
  12. c++直方图匹配终极版,支持任意通道数(opencv版本)
  13. Qt三种方式实现背景色和背景图(都可放缩,qss方式也可以)
  14. 新能源充电桩控制板迭代升级,打开充电桩行业发展新机遇
  15. 含有使字的诗句_带有使字的诗-带有使字的诗句
  16. esp寄存器与ebp寄存器介绍
  17. 全国英语计算机等级考试报名费,通知 | 全国大学生英语竞赛计算机等级考试报名...
  18. 视图的概念、特点及使用
  19. Casbin之ABAC
  20. 外媒评选出来的中国五大人工智能(AI) 公司

热门文章

  1. Python datetime 时区转换大坑
  2. STM32两个APP跳转间,内存的重叠,冲突和影响
  3. 安卓毕业设计app项目-基于Uniapp+SSM实现的日常饮食美食菜谱管理
  4. 精通HTML 第二章 使用适当的标签完成任务 阅读笔记
  5. base64转cer_[SSL证书].pfx格式和.Cer格式的区别以及格式互相转换
  6. 红米k30pro和红米note8pro的区别 红米k30pro和红米note8pro参数对比
  7. 数据集json格式转化为xml格式、txt格式
  8. 【深度学习】——过拟合的处理方法
  9. 网卡bond模式配置问题
  10. 最优排序二叉树(OBST)