package diffiehellman import ( "crypto/rand" "math/big" ) var one = big.NewInt(1) // PrivateKey greater then 1 and less then p func PrivateKey(p *big.Int) *big.Int { priv, _ := rand.Int(rand.Reader, p) // [0..p) if priv.Cmp(one) <= 0 { return PrivateKey(p) } return priv } func PublicKey(a, p *big.Int, g int64) *big.Int { return new(big.Int).Exp(big.NewInt(g), a, p) } func SecretKey(a, B, p *big.Int) *big.Int { return new(big.Int).Exp(B, a, p) } func NewPair(p *big.Int, g int64) (*big.Int, *big.Int) { priv := PrivateKey(p) pub := PublicKey(priv, p, g) return priv, pub }