package main import ( "crypto/aes" "crypto/cipher" "fmt" ) func EncryptAESCFB(dst, src, key, iv []byte) error { aesBlockEncrypter, err := aes.NewCipher([]byte(key)) if err != nil { return err } aesEncrypter := cipher.NewCFBEncrypter(aesBlockEncrypter, iv) aesEncrypter.XORKeyStream(dst, src) return nil } func DecryptAESCFB(dst, src, key, iv []byte) error { aesBlockDecrypter, err := aes.NewCipher([]byte(key)) if err != nil { return nil } aesDecrypter := cipher.NewCFBDecrypter(aesBlockDecrypter, iv) aesDecrypter.XORKeyStream(dst, src) return nil } func main() { const key16 = "1234567890123456" const key24 = "123456789012345678901234" const key32 = "12345678901234567890123456789012" var key = key16 var msg = "message" var iv = []byte(key)[:aes.BlockSize] // Using IV same as key is probably bad var err error // Encrypt encrypted := make([]byte, len(msg)) err = EncryptAESCFB(encrypted, []byte(msg), []byte(key), iv) if err != nil { panic(err) } fmt.Printf("Encrypting %v %s -> %v\n", []byte(msg), msg, encrypted) // Decrypt decrypted := make([]byte, len(msg)) err = DecryptAESCFB(decrypted, encrypted, []byte(key), iv) if err != nil { panic(err) } fmt.Printf("Decrypting %v -> %v %s\n", encrypted, decrypted, decrypted) }