59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
package encrypter
|
||
|
||
import (
|
||
"crypto/aes"
|
||
"crypto/cipher"
|
||
"crypto/rand"
|
||
"io"
|
||
"os"
|
||
)
|
||
|
||
type Encrypter struct {
|
||
Key string
|
||
}
|
||
|
||
func NewEncrypter() *Encrypter {
|
||
key := os.Getenv("KEY")
|
||
if key == "" {
|
||
panic("Не передан параметр KEY в переменные окружения")
|
||
}
|
||
return &Encrypter{
|
||
Key: key,
|
||
}
|
||
}
|
||
|
||
func (enc *Encrypter) Encrypt(plainStr []byte) []byte {
|
||
block, err := aes.NewCipher([]byte(enc.Key))
|
||
if err != nil {
|
||
panic(err.Error())
|
||
}
|
||
aesGCM, err := cipher.NewGCM(block)
|
||
if err != nil {
|
||
panic(err.Error())
|
||
}
|
||
nonce := make([]byte, aesGCM.NonceSize())
|
||
_, err = io.ReadFull(rand.Reader, nonce)
|
||
if err != nil {
|
||
panic(err.Error())
|
||
}
|
||
return aesGCM.Seal(nonce, nonce, plainStr, nil)
|
||
}
|
||
|
||
func (enc *Encrypter) Decrypt(encryptedStr []byte) []byte {
|
||
block, err := aes.NewCipher([]byte(enc.Key))
|
||
if err != nil {
|
||
panic(err.Error())
|
||
}
|
||
aesGCM, err := cipher.NewGCM(block)
|
||
if err != nil {
|
||
panic(err.Error())
|
||
}
|
||
nonceSize := aesGCM.NonceSize()
|
||
nonce, cipherText := encryptedStr[:nonceSize], encryptedStr[nonceSize:]
|
||
plainText, err := aesGCM.Open(nil, nonce, cipherText, nil)
|
||
if err != nil {
|
||
panic(err.Error())
|
||
}
|
||
return plainText
|
||
}
|