package main import ( "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/hex" "errors" "fmt" "golang.org/x/crypto/scrypt" ) package main import ( "fmt" ) func main() { secretKey := "9b4d0672ae69b915e6a2c81e065847f3" data := "hello wordl" // AES256Encrypt ciphertext, err := AES256Encrypt(secretKey, data) if err != nil { fmt.Println("Error encrypting:", err) return } fmt.Println("CipherText:", ciphertext) // AES256Decrypt plaintext, err := AES256Decrypt(secretKey, fmt.Sprintf("%s", ciphertext)) if err != nil { return } fmt.Println("PlainText:", plaintext) } // ENCRYPT & DECRYPT func AES256Encrypt(secretKey, plainText string) (interface{}, error) { secretKeyByte := make([]byte, len(secretKey)) secretKeyByte = []byte(secretKey) plainTextByte := make([]byte, len(plainText)) plainTextByte = []byte(plainText) if len(secretKeyByte) != 32 { return nil, fmt.Errorf("Secretkey length mismatch") } key, err := scrypt.Key(secretKeyByte, []byte("salt"), 1024, 8, 1, 32) 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 } iv := make([]byte, gcm.NonceSize()) if _, err := rand.Read(iv); err != nil { return nil, err } cipherText := gcm.Seal(iv, iv, plainTextByte, nil) return hex.EncodeToString(cipherText), nil } func AES256Decrypt(secretKey string, cipherText string) (interface{}, error) { secretKeyByte := make([]byte, len(secretKey)) secretKeyByte = []byte(secretKey) if len(secretKeyByte) != 32 { return nil, fmt.Errorf("Secretkey length mismatch") } key, err := scrypt.Key(secretKeyByte, []byte("salt"), 1024, 8, 1, 32) 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 } iv := make([]byte, gcm.NonceSize()) if _, err := rand.Read(iv); err != nil { return nil, err } if len(cipherText) < len(iv) { return nil, errors.New("cipherText not to be less than secretKey") } decodedPlaintext, err := hex.DecodeString(cipherText) if err != nil { return nil, err } nonceLength := len(iv) plaintext, err := gcm.Open(nil, decodedPlaintext[:nonceLength], decodedPlaintext[nonceLength:], nil) if err != nil { return nil, err } return string(plaintext), nil }package main import ( "crypto/aes" "encoding/hex" "fmt" ) func main() { // cipher key key := "thisis32bitlongpassphraseimusing" // plaintext pt := "This is a secret" c := EncryptAES([]byte(key), pt) // plaintext fmt.Println(pt) // ciphertext fmt.Println(c) // decrypt DecryptAES([]byte(key), c) } func EncryptAES(key []byte, plaintext string) string { c, err := aes.NewCipher(key) CheckError(err) out := make([]byte, len(plaintext)) c.Encrypt(out, []byte(plaintext)) return hex.EncodeToString(out) } func DecryptAES(key []byte, ct string) { ciphertext, _ := hex.DecodeString(ct) c, err := aes.NewCipher(key) CheckError(err) pt := make([]byte, len(ciphertext)) c.Decrypt(pt, ciphertext) s := string(pt[:]) fmt.Println("DECRYPTED:", s) } func CheckError(err error) { if err != nil { panic(err) } }