shamir秘密共享 go语言实现
算法原理参考:shamir 秘密共享
大素数p的选取,这里选取的是128bit大素数
prime, _ := rand.Prime(rand.Reader, 128)
Share和Polynomial 结构体定义,Share结构体定义了参与者拥有的秘密(x,y), Polynomial结构体定义了多项式,多项式的「知识」即该多项式的系数,知道多项式的系数,也就知道该多项式
type Share struct {x, y *big.Int }type Polynomial struct {coefficients []*big.Intmodulus *big.Int }
拉格朗日插值算法实现:对定点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) }
秘密分发:生成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 }
验证
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语言实现相关推荐
- shamir秘密共享方案_Shamir秘密分享的初学者指南
shamir秘密共享方案 An introduction to this privacy-preserving cryptographic technique and how Keyless is u ...
- shamir秘密共享matlab程序,shamir 秘密共享代码
早期的秘 密共享是由Shamir.¨和Blakley'纠于1979年分别提 出的,并分别给出了第一个(t,凡)门限秘密共享方 l LDPC 下面介绍LDPC的概念,编码及其译码. LDPC...... ...
- Shamir秘密共享算法
Shamir秘密共享算法 简介 秘密s被分成n份毫无相关的部分信息,每一部分信息称为一个子密钥,由一个参与者持有,只有至少拥有t份子密钥时才能恢复出秘密s,这种方案为(t, n)-秘密分割门限方案,t ...
- 记录我看的密码学方案中的技术,Shamir秘密共享,Schnorr零知识证明,EIGamal密码体制
记录我看的论文中基于的技术,对他们进行大概介绍 Shamir 秘密共享方案 零知识证明 EIGamal密码体制 Shamir 秘密共享方案 1979年,Shamir提出的一个基于拉格朗日插值的(k,n ...
- Shamir 秘密共享方案和Feldman可验证的秘密共享方案
常用的秘密共享方案 首先提出问题--平均工资问题 什么是秘密共享? Shamir秘密共享分案 算法流程 可验证秘密共享的提出 什么是计算安全?什么是无条件安全? Feldman可验证的秘密共享 安全多 ...
- Java实现Shamir秘密共享带注释
最近在复现一篇联邦学习的安全聚合论文,需要用到Shamir秘密共享,就用Java实现了一下,有兴趣的可以看看. package com.duwei.crypto;import java.math.Bi ...
- Shamir秘密共享机制(加法、乘法共享)Matlab可视化实现
具体秘密共享的流程可以参考下面这个链接的内容:https://blog.csdn.net/Matrix_element/article/details/117357359 main1.m 加法方案的主 ...
- 密码学系列-Shamir秘密共享
秘密共享支持将秘密值S拆分为N多份,并设置阈值k,集齐不少于k份的秘密信息,可联合恢复出秘密值S,少于k份则无法获得关于S的任何信息.秘密共享多用于敏感数据的分布式管理.常见的秘密共享方法有Shami ...
- python实现shamir秘密共享算法
shamir算法介绍 拉格朗日插值解密 代码实现 用到的G_hash是国密算法SM3, g_p是Miller_Rabin算法生成大素数算法 ModReverse是生成逆元算法 from random ...
最新文章
- leetcode001 two_Sum
- AngularJS指令封装高德地图组件
- 建造者模式(工厂模式6)
- FreeBSD5.3下安装Apache+PHP+MySQL+Tomcat
- js 字符串加减法_JavaScript (+) 加法运算符
- JSP由浅入深(3)—— 通过表达式增加动态内容
- 使用装饰器配置路由的
- kaggle 训练自己的cycleGan
- 0x5f3759df的数学原理
- Android 屏幕尺寸知识
- 计算机科学与技术考研课程安排,计算机科学与技术(0812)硕士研究生培养方案(一)...
- 1096: 字符逆序
- 2018年公有云iaas_2018年如何学会正确做云
- 英伟达2022财年第二季度获得创纪录营收65.1亿美元
- codeM美团编程大赛初赛B轮E题
- 学习之路二十七:三种序列化方式的一些注意点
- 【Chapter 1】什么是软件架构
- 计算机二级题库病毒,计算机二级MS Office题库
- 程序员跳槽时,如何优雅地谈薪水?
- scroll-view实现下拉刷新(避免onload进入页面初始refresher-triggered为true触发下拉问题)