title: “AES Decode Secret with Key”
date: 2021-05-04T17:22:51
slug: aes-decode-secret-with-key
package main
import (
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"errors"
"fmt"
"strings"
)
const (
// EncryptHeaderV1 ...
EncryptHeaderV1 = ""
)
func main() {
fmt.Println(decrypt("K+aZKT/MGhPdy37RIMANJU3hGd1ypZiTyUxbxdC6x3MzSN2j1d9o5QD8OxPaO/rk+VQtmkh+yFR0gQNXo1SbpaweKlwcn82N/F6bjSa0Zcs="))
}
func decrypt(secret string) (string, error) {
if len(secret) == 0 {
return "", nil
}
decrypted, err := ReversibleDecrypt(secret, "JpF2PeV2TQvPcjIi")
if err != nil {
return "", err
}
return decrypted, nil
}
func ReversibleDecrypt(str, key string) (string, error) {
if strings.HasPrefix(str, EncryptHeaderV1) {
str = str[len(EncryptHeaderV1):]
return decryptAES(str, key)
}
// fallback to base64
return decodeB64(str)
}
func decodeB64(str string) (string, error) {
cipherText, err := base64.StdEncoding.DecodeString(str)
return string(cipherText), err
}
func decryptAES(str, key string) (string, error) {
keyBytes := []byte(key)
var block cipher.Block
var cipherText []byte
var err error
if block, err = aes.NewCipher(keyBytes); err != nil {
return "", err
}
if cipherText, err = base64.StdEncoding.DecodeString(str); err != nil {
return "", err
}
if len(cipherText) < aes.BlockSize {
err = errors.New("cipherText too short")
return "", err
}
iv := cipherText[:aes.BlockSize]
cipherText = cipherText[aes.BlockSize:]
cfb := cipher.NewCFBDecrypter(block, iv)
cfb.XORKeyStream(cipherText, cipherText)
return string(cipherText), nil
}
