package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"encoding/hex"
"errors"
"fmt"
"log"
"golang.org/x/crypto/scrypt"
)
var (
key []byte
err error
)
func init() {
secretKey := "2a688bc3f0e8ec1431402e9e4a1fb563"
if len(secretKey) != 32 {
err = errors.New("Secretkey length miss match")
}
key, err = scrypt.Key([]byte(secretKey), []byte("salt"), 1024, 8, 1, 32)
if err != nil {
log.Fatal(err)
}
}
func AES256Encrypt(data string) ([]byte, error) {
if err != nil {
return nil, err
}
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
gcm, err := cipher.NewGCM(block)
if err != nil {
return nil, err
}
nonce := make([]byte, gcm.NonceSize())
if _, err = rand.Read(nonce); err != nil {
return nil, err
}
ciphertext := gcm.Seal(nonce, nonce, []byte(data), nil)
return ciphertext, nil
}
func AES256Decrypt(cipherText []byte) ([]byte, error) {
if err != nil {
return nil, err
}
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
gcm, err := cipher.NewGCM(block)
if err != nil {
return nil, err
}
nonceSize := gcm.NonceSize()
if len(cipherText) < nonceSize {
return nil, errors.New("Ciphertext too short")
}
nonce, ciphertext := cipherText[:nonceSize], cipherText[nonceSize:]
plaintext, err := gcm.Open(nil, nonce, ciphertext, nil)
if err != nil {
return nil, err
}
return plaintext, nil
}
func main() {
data := "Hello Wordl!"
enc, err := AES256Encrypt(data)
if err != nil {
log.Fatal(err)
}
dec, err := AES256Decrypt(enc)
if err != nil {
log.Fatal(err)
}
fmt.Println("Cipher: ", hex.EncodeToString(enc))
fmt.Println("Cipher Text: ", string(dec))
}