Contents

Go shamir

Shamir密钥分享算法

参考:https://www.cxyzjd.com/article/shangsongwww/90266455

秘密共享技术是密码学和信息安全的一个重要研究内容,Shamir密钥分享算法最早是由Shamir和Blackly在1970年基于Lagrange插值和矢量方法提出的,其基本思想是分发者通过秘密多项式,将秘密s分解为n个秘密分发个持有者,其中任意不少于k个秘密均能恢复密文,而任意少于k个秘密均无法得到密文的任何信息。

实际应用

比如在门限体系中,为了保证信息安全性,一个秘密通常不能由单个持有者保存。比如一些重要场所的通行,比如遗嘱的生效等,必须将秘密分由多人保管并且只有当多人同时在场时秘密才能得以恢复。在这些场合,就需要这样一套的密钥分享技术。

示例1:

# 算法库
github.com/hashicorp/vault/shamir
github.com/serialt/lancet/cryptor/shamir (基于vault)
github.com/corvus-ch/shamir
package main

import (
	"encoding/base64"
	"fmt"

	"github.com/serialt/lancet/cryptor/shamir"
)

func main() {
	secret := []byte("dnwkUubRaEXr7TV7VswNqh4L3cHEbJjH")
	// 将密码分成5份,最少需要3份才能合并成原始密码
	msg, err := shamir.Split(secret, 5, 3)
	if err != nil {
		fmt.Println(err)
	} else {
		for k, v := range msg {
			fmt.Printf("shamir share secret %v: %v\n", k, base64.RawStdEncoding.EncodeToString(v))
		}

	}
	deCode()

}

func combine(parts ...[]byte) []byte {
	var msgParts [][]byte
	for _, v := range parts {
		msgParts = append(msgParts, v)
	}
	result, err := shamir.Combine(msgParts)
	if err != nil {
		return nil
	}
	return result
}

func deCode() {

	msg1, _ := base64.StdEncoding.DecodeString("Im3P+3AOr7So+dB7feyrNGY0lAeT1Ou3I3Rn0PmWN5Ad")
	msg2, _ := base64.StdEncoding.DecodeString("xguYlI5C77FDOln9R0gNT963V9B+RR12C7RlQVcSfCWX")
	msg3, _ := base64.StdEncoding.DecodeString("9AytrQ+ZDzSHJNx4rq3qGYxKeM/bcBclWiCwZYqdUlC8")

	// msg := [][]byte{
	// 	msg1,
	// 	msg2,
	// 	msg3,
	// }
	fmt.Printf("\ncomboine secret: %s \n", string(combine(msg1, msg2, msg3)))

}