golang aes encrypt and decrypt - pikachule/golang_notes GitHub Wiki
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"encoding/base64"
"errors"
"fmt"
"io"
)
const (
aesSecretKey string = "M19kAJF8B50AdKNp"
)
func main() {
result, err := encrypt([]byte(aesSecretKey), "helloworld")
fmt.Println(result, err)
result_decrypt, err := decrypt([]byte(aesSecretKey), result)
fmt.Println(result_decrypt, err)
}
func encrypt(key []byte, message string) (encmess string, err error) {
plainText := []byte(message)
block, err := aes.NewCipher(key)
if err != nil {
fmt.Println(err)
}
cipherText := make([]byte, aes.BlockSize+len(plainText))
iv := cipherText[:aes.BlockSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
fmt.Println(err)
}
stream := cipher.NewCFBEncrypter(block, iv)
stream.XORKeyStream(cipherText[aes.BlockSize:], plainText)
encmess = base64.URLEncoding.EncodeToString(cipherText)
return
}
func decrypt(key []byte, securemess string) (decodedmess string, err error) {
cipherText, err := base64.URLEncoding.DecodeString(securemess)
if err != nil {
fmt.Println(err)
}
block, err := aes.NewCipher(key)
if err != nil {
fmt.Println(err)
}
if len(cipherText) < aes.BlockSize {
err = errors.New("Cliphertext block size is too short")
fmt.Println(err)
}
iv := cipherText[:aes.BlockSize]
cipherText = cipherText[aes.BlockSize:]
stream := cipher.NewCFBDecrypter(block, iv)
stream.XORKeyStream(cipherText, cipherText)
decodedmess = string(cipherText)
return
}