算法原理参考:shamir 秘密共享

  1. 大素数p的选取,这里选取的是128bit大素数

     prime, _ := rand.Prime(rand.Reader, 128)
    
  2. Share和Polynomial 结构体定义,Share结构体定义了参与者拥有的秘密(x,y), Polynomial结构体定义了多项式,多项式的「知识」即该多项式的系数,知道多项式的系数,也就知道该多项式

    type Share struct {x, y *big.Int
    }type Polynomial struct {coefficients []*big.Intmodulus      *big.Int
    }
    
  3. 拉格朗日插值算法实现:对定点shares,计算该多项式在x处的值,对于sss算法 ,秘密在x=0处,需要注意的是拉格朗日插值算法中有模除,需要转为乘以这个数的逆元

    func Lagrange(x, modulus *big.Int, shares ...Share) *big.Int {xs := make([]*big.Int, len(shares))ys := make([]*big.Int, len(shares))for i := range shares {xs[i] = shares[i].xys[i] = shares[i].y}numerators := make([]*big.Int, len(xs))denominators := make([]*big.Int, len(ys))for i := range xs {numerators[i] = cal(xs, x, i)denominators[i] = cal(xs, xs[i], i)}result := big.NewInt(0)for i := range numerators {numerators[i].Mul(numerators[i], ys[i])numerators[i].Mod(numerators[i], modulus)v := (&big.Int{}).Set(numerators[i].Mul(numerators[i], denominators[i].ModInverse(denominators[i],modulus)))result.Add(result, v)}return result.Mod(result, modulus)
    }
    
  4. 秘密分发:生成t-1次对多项式,若提供secret,则使用提供的秘密,否则随机生成秘密,随后计算n个参与者的秘密shares

    func SecretDistribute(secret, modulus *big.Int, t, n int64) ([]Share, *big.Int) {if t > n {panic("t has to be less than n")}p := NewPolynomial(t, modulus)if secret != nil {p.coefficients[0] = secret}secret = p.coefficients[0]shares := make([]Share, n)for i := int64(0); i < n; i++ {x, _ := rand.Int(rand.Reader, modulus)y := p.valueAt(x)shares[i] = Share{x, y}}return shares, secret
    }
    
  5. 验证

    func main() {prime := prime128Bit()//secret := big.NewInt(12345678987654321)shares, secret1 := SecretDistribute(nil, prime, 5, 8)respect := Lagrange(big.NewInt(0), prime, shares[0], shares[5], shares[4], shares[1],shares[7])fmt.Println(secret1,respect)
    }

完整代码:


package mainimport ("crypto/rand""fmt""math/big"
)type Share struct {x, y *big.Int
}type Polynomial struct {coefficients []*big.Intmodulus      *big.Int
}// Calculate the value of the polynomial at a point
func (p *Polynomial) eval(x *big.Int) *big.Int {length := len(p.coefficients)if length == 0 {return big.NewInt(0)}result := (&big.Int{}).Set(p.coefficients[length-1])for i := length - 1; i > 0; i-- {tmp := big.Int{}tmp.Mul(x, result)result.Add(p.coefficients[i-1], &tmp)result.Mod(result, p.modulus)}return result
}func NewPolynomial(degree int, modulus *big.Int) Polynomial {coefficients := make([]*big.Int, degree+1)for i := 0; i < degree+1; i++ {coefficients[i], _ = rand.Int(rand.Reader, modulus)}return Polynomial{coefficients, modulus}
}func Lagrange(x, modulus *big.Int, shares ...Share) *big.Int {xs := make([]*big.Int, len(shares))ys := make([]*big.Int, len(shares))for i := range shares {xs[i] = shares[i].xys[i] = shares[i].y}numerators := make([]*big.Int, len(xs))denominators := make([]*big.Int, len(ys))for i := range xs {numerators[i] = cal(xs, x, i, modulus)denominators[i] = cal(xs, xs[i], i, modulus)}result := big.NewInt(0)for i := range numerators {numerators[i].Mul(numerators[i], ys[i])numerators[i].Mod(numerators[i], modulus)v := (&big.Int{}).Set(numerators[i].Mul(numerators[i], denominators[i].ModInverse(denominators[i], modulus)))result.Add(result, v)}return result.Mod(result, modulus)
}func cal(xs []*big.Int, x *big.Int, i int, modulus *big.Int) *big.Int {res := big.NewInt(1)for j := 0; j < len(xs); j++ {if j != i {tmp := (&big.Int{}).Sub(x, xs[j])res.Mul(res, tmp)res.Mod(res, modulus)}}return res
}func SecretDistribute(secret, modulus *big.Int, t, n int) ([]Share, *big.Int) {if t > n {panic("t has to be less than n")}p := NewPolynomial(t-1, modulus)if secret != nil {p.coefficients[0] = secret}secret = p.coefficients[0]shares := make([]Share, n)for i := 0; i < n; i++ {x, _ := rand.Int(rand.Reader, modulus)y := p.eval(x)shares[i] = Share{x, y}}return shares, secret
}func main() {prime, _ := rand.Prime(rand.Reader, 128)//secret := big.NewInt(12345678987654321)shares, secret1 := SecretDistribute(nil, prime, 5, 8)respect := Lagrange(big.NewInt(0), prime, shares[0], shares[5], shares[4], shares[1], shares[7])fmt.Println(secret1, respect)
}

shamir秘密共享 go语言实现相关推荐

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

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

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

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

  3. Shamir秘密共享算法

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

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

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

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

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

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

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

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

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

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

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

  9. python实现shamir秘密共享算法

    shamir算法介绍 拉格朗日插值解密 代码实现 用到的G_hash是国密算法SM3, g_p是Miller_Rabin算法生成大素数算法 ModReverse是生成逆元算法 from random ...

最新文章

  1. leetcode001 two_Sum
  2. AngularJS指令封装高德地图组件
  3. 建造者模式(工厂模式6)
  4. FreeBSD5.3下安装Apache+PHP+MySQL+Tomcat
  5. js 字符串加减法_JavaScript (+) 加法运算符
  6. JSP由浅入深(3)—— 通过表达式增加动态内容
  7. 使用装饰器配置路由的
  8. kaggle 训练自己的cycleGan
  9. 0x5f3759df的数学原理
  10. Android 屏幕尺寸知识
  11. 计算机科学与技术考研课程安排,计算机科学与技术(0812)硕士研究生培养方案(一)...
  12. 1096: 字符逆序
  13. 2018年公有云iaas_2018年如何学会正确做云
  14. 英伟达2022财年第二季度获得创纪录营收65.1亿美元
  15. codeM美团编程大赛初赛B轮E题
  16. 学习之路二十七:三种序列化方式的一些注意点
  17. 【Chapter 1】什么是软件架构
  18. 计算机二级题库病毒,计算机二级MS Office题库
  19. 程序员跳槽时,如何优雅地谈薪水?
  20. scroll-view实现下拉刷新(避免onload进入页面初始refresher-triggered为true触发下拉问题)

热门文章

  1. ie和chrom等主流主要区别
  2. python去除句子中所有数字
  3. 中文分词中的新词发现地点切分等问题
  4. 什么是Node - 学习node
  5. 将DataTable中的数据保存到Excel (二) 使用NPOI
  6. 杰里之静电处理方法【篇4】
  7. C#与三菱,西门子,台达,基恩士,等各品牌plc通讯源码。
  8. [转载] PCL库相关资源的查找和使用Tip
  9. 利用 Css 制作精美的卡片UI (赞)
  10. 逻辑分析仪Kingst第一天