Shamir's secret sharing method generates a number of shares, of which a threshold defines the number of shares which can be used to re-build the message.
Shamir Secret Share in Go |
Theory
Some sample code is:
package main import ( "fmt" "github.com/codahale/sss" "os" "strconv" "encoding/hex" ) func main() { message:= "Help" n1:=5 k1:=3 argCount := len(os.Args[1:]) if (argCount>0) {message= string(os.Args[1])} if (argCount>1) {n1,_ = strconv.Atoi(os.Args[2])} if (argCount>2) {k1,_ = strconv.Atoi(os.Args[3])} n := byte(n1) k := byte(k1) fmt.Printf("Message:\t%s\n\n",message) fmt.Printf("Policy. Any %d from %d\n\n",k1,n1) if (k1>n1) { fmt.Printf("Cannot do this, as k greater than n") os.Exit(0) } shares, _:= sss.Split(n, k, []byte(message)) subset := make(map[byte][]byte, k) for x, y := range shares { fmt.Printf("Share:\t%d\t%s\n",x,hex.EncodeToString(y)) subset[x] = y if len(subset) == int(k) { break } } reconstructed := string(sss.Combine(subset)) fmt.Printf("\nReconstructed: %s\n",reconstructed) }
A sample run is:
Message: Hello Policy. Any 3 from 5 Share: 1 6dcf2bc81b Share: 2 86bcacbce3 Share: 3 a316eb1897 Reconstructed: Hello