Skip to content

Instantly share code, notes, and snippets.

@brahimmachkouri
Forked from temoto/aes-cfb-example.go
Created December 24, 2016 12:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brahimmachkouri/e501ff1917893019d6b8f930b5343207 to your computer and use it in GitHub Desktop.
Save brahimmachkouri/e501ff1917893019d6b8f930b5343207 to your computer and use it in GitHub Desktop.
Example of AES (Rijndael) CFB encryption in Go. IMHO, http://golang.org/pkg/crypto/cipher/ could benefit a lot from similar snippet.
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)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment