shamir算法介绍

拉格朗日插值解密

代码实现

用到的G_hash是国密算法SM3,
g_p是Miller_Rabin算法生成大素数算法
ModReverse是生成逆元算法

from random import randintfrom algorithm.g_hash import G_hash
from algorithm.g_keypairs import g_p, ModReverse
"""
使用说明
只能加解密64位hash值
加密时,
G_si(S,n,k)     加密数据S,给n个人,至少k能解密
返回share[]  有n项
解密时
shamir_decrypt(Share)   Share为share[]至少k个元素的数组
返回要加密的值
"""# 输入要保护的数据,生成秘密共享数据n条,构建k元多项式
# 生成的素数为(2**64,2**65)就是16*16位二进制数  hash为 64*16
# 把hash分为4端16*16加密
# 返回的是si是s[1][i]+s[2][i]+s[3][i]+s[4][i]
# 解密是 用k-1个 i,s[1][i] (0<i<k)解出 hash[1]..
def G_si(S,n,k):nimi_key=khash =[int(S[0:16], 16), int(S[16:32], 16), int(S[32:48], 16), int(S[48:64], 16)]# print("秘密 :hash值",hash)a=[0]prime=g_p()s = [prime,[], [], [], []]# print("prime",prime)# 生成k-1个系数  -->  a[1 <---> k-1]  a0是秘密值while k-1:temp=randint(2**10,prime)if temp not in a:a.append(temp)k=k-1# print(a)# 生成共享密钥  Si   n个点# hash_num就是s[]的下标,记录 4组n个点# i 就是x的值# hash[]就是秘密值# j就是x的第几项,x的几次方# 最后生成 s[[prime,y1,y2,y3...],[],[],[]]for hash_num in range(1,5):for i in range(1,n+1):temp=hash[hash_num-1]for j in range(1,k):temp=(temp+a[j]*(i**j))%primes[hash_num].append([i,temp])share=[]for i in range(0, n):share.append([[s[0],nimi_key], s[1][i], s[2][i], s[3][i], s[4][i]])# print("share=",share)# share =  [[素数, nimikey],[point1],[point2],point[3],point[4]] * n个keyreturn sharedef shamir_decrypt(s):# s=[[素数, nimikey],[point1],[point2],point[3],point[4]] * n# k是多项式系数  a0+ a1*x^1+....a(k-1)*x^(k-1)k=s[0][0][1]p=s[0][0][0]if len(s)<k:print("密钥不够,无法解密")return# 获取横坐标值及对应的s下标 [x,i]的数组x=[]for i in range(len(s)):x.append([s[i][1][0],i])# print("横坐标有",x)hash = ""for hash_i in range(1,5):L = 0# j对应 x 横坐标 及 存储y值的i下标for j in x:Lx=1Lx1=1# 求除了 横坐标为j 的xxx=[]for some in x:if some!=j:xx.append(some)# print(xx)for i in xx:Lx=(-1)*Lx*i[0]Lx1=Lx1*(j[0]-i[0])# Lj 的 分子Lx 分母Lx1Lx=(Lx+p)%pLx1=(Lx1+p)%p# print("Lx,",Lx,"Lx1",Lx1)Lx1=ModReverse(Lx1,p)L=(L+s[j[1]][hash_i][1]*Lx*Lx1)%p# print(L)hash=hash+str(hex(L))[2:]# print("长度",len(hash))return hash# hash=G_hash("zazal")
# print(hash)
# # print(int(hash,16))
#
# share=G_si(hash,3,3)
#
# print(shamir_decrypt(share))
# s=[share[0],share[1],share[2]]
#
#
# print(shamir_decrypt(s))

python实现shamir秘密共享算法相关推荐

  1. Shamir秘密共享算法

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

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

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

  3. 密码学系列-Shamir秘密共享

    秘密共享支持将秘密值S拆分为N多份,并设置阈值k,集齐不少于k份的秘密信息,可联合恢复出秘密值S,少于k份则无法获得关于S的任何信息.秘密共享多用于敏感数据的分布式管理.常见的秘密共享方法有Shami ...

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

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

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

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

  6. Java实现Shamir秘密共享带注释

    最近在复现一篇联邦学习的安全聚合论文,需要用到Shamir秘密共享,就用Java实现了一下,有兴趣的可以看看. package com.duwei.crypto;import java.math.Bi ...

  7. shamir秘密共享 go语言实现

    算法原理参考:shamir 秘密共享 大素数p的选取,这里选取的是128bit大素数 prime, _ := rand.Prime(rand.Reader, 128) Share和Polynomial ...

  8. 记录我看的密码学方案中的技术,Shamir秘密共享,Schnorr零知识证明,EIGamal密码体制

    记录我看的论文中基于的技术,对他们进行大概介绍 Shamir 秘密共享方案 零知识证明 EIGamal密码体制 Shamir 秘密共享方案 1979年,Shamir提出的一个基于拉格朗日插值的(k,n ...

  9. Shamir秘密共享机制(加法、乘法共享)Matlab可视化实现

    具体秘密共享的流程可以参考下面这个链接的内容:https://blog.csdn.net/Matrix_element/article/details/117357359 main1.m 加法方案的主 ...

最新文章

  1. linux mint 修改dns,如何在Ubuntu和LinuxMint中刷新DNS缓存
  2. 苹果放大招?「廉价版」5G iPhone 将揭晓,M2芯片来袭?
  3. 少儿编程语言python-2019儿童编程语言大全
  4. 【机器视觉】 for算子
  5. C++学习笔记:(十)异常
  6. Tomcat 7 'javax.el.ELException' 的解决方式(failed to parse the expression [${xxx}])
  7. 机器学习知识总结系列-机器学习中的数学-概率与数理统计(1-3-1)
  8. 系统架构设计师 - 软件架构设计 - 软件架构风格
  9. 并查集的补集 (关押罪犯)
  10. 【Spring】actual transaction available for current thread - cannot reliably process ‘remove‘ call
  11. 什么是SQL Server事务日志中的虚拟日志文件?
  12. JVM判断对象是否存活
  13. linux 复制文件并改名,在Linux上复制和重命名文件
  14. 论文笔记:Connectionist Temporal Classification: Labelling Unsegmented Sequence
  15. 学习笔记:强化学习与最优控制(Chapter 2)
  16. 软件测试的目的和意义
  17. 解决Playbook不能充电的问题
  18. Android - 集成高德地图API(搜索,地图,定位)
  19. QGIS二次开发 数据编辑功能等
  20. 机器学习吴恩达课程总结(五)

热门文章

  1. 所谓“尽人事,听天命”
  2. 通过自定义android键盘实现车牌号输入法
  3. VB6 在Win10中 DPI字体125%的时候显示模糊的解决方案
  4. 如何提取fMRI的时间序列,以及构建功能连接矩阵(functional connectivity)
  5. sketch的切图技巧总结:如何批量切出固定大小的切图并保留透明部分?
  6. php 语义计算,科学网—【语义计算:关于解析逻辑语义角色】 - 李维的博文
  7. java类的封装_Java类中的封装
  8. IPV6地址的一些基础知识:
  9. 接口测试平台-93: 全局域名库表+存储
  10. visio2007一些知识