|
|
@@ -0,0 +1,53 @@ |
|
|
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) |
|
|
} |