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
}