func NewCrypter(key io.Reader) (*crypter, error) {
	crypter := &crypter{}
	crypter.hmacKey = make([]byte, HmacKeyLength)
	if _, err := io.ReadFull(key, crypter.hmacKey); err != nil {
		return crypter, err
	}
	crypter.symetricKey = make([]byte, SymetricKeyLength)
	if _, err := io.ReadFull(key, crypter.symetricKey); err != nil {
		return crypter, err
	}
	block, err := aes.NewCipher(crypter.symetricKey)
	if err != nil {
		return crypter, err
	}
	crypter.block = block
	return crypter, nil
}
New creates and returns a new crypter. Keys are obtained by reading from
the provided reader.
package crypto
import (
	"bytes"
	"crypto/aes"
	"crypto/cipher"
	"crypto/hmac"
	"crypto/rand"
	"crypto/sha512"
	"encoding/base64"
	"fmt"
	"io"
	"os"
)
const (
	SymetricKeyLength = 32
	HmacKeyLength = 128
	HmacOutputLength = 64
)
type Crypter interface {
	EncryptString(plaintext string) (string, error)
	DecryptString(message string) (string, error)
}
type crypter struct {
	hmacKey, symetricKey []byte
	block                cipher.Block
}