AES Decode Secret with Key


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
}
Print Friendly, PDF & Email