sharedsecret

package module
v0.0.0-...-e0eefac Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 3, 2022 License: Apache-2.0 Imports: 4 Imported by: 0

README

sharedsecret

codecov GoDoc

Package sharedsecret is implementation of Shamir's Secret Sharing algorithm.

Shamir's Secret Sharing is an algorithm in cryptography created by Adi Shamir. It is a form of secret sharing, where a secret is divided into parts, giving each participant its own unique part. To reconstruct the original secret, a minimum number of parts is required. In the threshold scheme this number is less than the total number of parts. Otherwise all participants are needed to reconstruct the original secret. See wiki page.

Examples

Distribute

With the Distribute function, a given secret can be distributed to shares.

secret := big.NewInt(120398491412912873)

// Create 5 shares that 3 or more of them can recover the secret.
shares := Distribute(secret, 5, 3)

// We can recover from only 3 (or more) shares:
recovered := Recover(shares[1], shares[3], shares[0])

fmt.Println(recovered)

Output:

120398491412912873
New

With the New function, a random secret is generated and distributed into shares. Both the secret and the shares are returned.

// Create 5 shares that 3 or more of them can recover the secret.
shares, secret := New(5, 3)

// Now we should distribute the shares to different parties and forget about the shares and
// secret. Once the original secret is needed, at least 3 shares should be used in order to
// recover it:

// We can't recover from only 2 shares:
wrong := Recover(shares[1], shares[3])

// We can recover from only 3 (or more) shares:
correct := Recover(shares[1], shares[3], shares[0])

fmt.Println(secret.Cmp(wrong) != 0, secret.Cmp(correct) == 0)

Output:

true true

Readme created from Go doc with goreadme

Documentation

Overview

Package sharedsecret is implementation of Shamir's Secret Sharing algorithm.

Shamir's Secret Sharing is an algorithm in cryptography created by Adi Shamir. It is a form of secret sharing, where a secret is divided into parts, giving each participant its own unique part. To reconstruct the original secret, a minimum number of parts is required. In the threshold scheme this number is less than the total number of parts. Otherwise all participants are needed to reconstruct the original secret. See (wiki page) https://en.wikipedia.org/wiki/Shamir's_Secret_Sharing.

Example (Distribute)

With the `Distribute` function, a given secret can be distributed to shares.

secret := big.NewInt(120398491412912873)

// Create 5 shares that 3 or more of them can recover the secret.
shares := Distribute(secret, 5, 3)

// We can recover from only 3 (or more) shares:
recovered := Recover(shares[1], shares[3], shares[0])

fmt.Println(recovered)
Output:

120398491412912873
Example (New)

With the `New` function, a random secret is generated and distributed into shares. Both the secret and the shares are returned.

// Create 5 shares that 3 or more of them can recover the secret.
shares, secret := New(5, 3)

// Now we should distribute the shares to different parties and forget about the shares and
// secret. Once the original secret is needed, at least 3 shares should be used in order to
// recover it:

// We can't recover from only 2 shares:
wrong := Recover(shares[1], shares[3])

// We can recover from only 3 (or more) shares:
correct := Recover(shares[1], shares[3], shares[0])

fmt.Println(secret.Cmp(wrong) != 0, secret.Cmp(correct) == 0)
Output:

true true

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Recover

func Recover(shares ...Share) (secret *big.Int)

Recover the secret from shares. Notice that the number of shares that is used should be at least the recover amount (k) that was used in order to create them in the New function.

Types

type Share

type Share struct {
	// contains filtered or unexported fields
}

Share is a part of a secret.

func Distribute

func Distribute(secret *big.Int, n, k int64) (shares []Share)

Distribute creates n Shares for a given secret. k defines the minimum number of shares that should be collected in order to recover the secret. Recovering the secret can be done by calling Recover with more than k Share objects.

func New

func New(n, k int64) (shares []Share, secret *big.Int)

New creates n Shares and a secret. k defines the minimum number of shares that should be collected in order to recover the secret. Recovering the secret can be done by calling Recover with more than k Share objects.

func (Share) MarshalText

func (s Share) MarshalText() ([]byte, error)

MarshalText implements the encoding.TextMarshaler interface.

func (Share) String

func (s Share) String() string

String dumps the share object to a string.

func (*Share) UnmarshalText

func (s *Share) UnmarshalText(txt []byte) error

UnmarshalText implements the encoding.TextUnmarshaler interface.

Directories

Path Synopsis
internal

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL