Golang - AES-128-CBC Decryption returns invalid/strange characters before decrypted message

134 views Asked by At

I'm trying to decrypt aes-128-cbc data using go.

Everything seams to working, but i getting random text with invalid/strange characters before decrypted message.

Here is my code.

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "crypto/sha512"
    "encoding/base64"
    "fmt"
    "io"

    "golang.org/x/crypto/hkdf"
)

func main() {
    encryptedData := "e3557c3738f51200fb4b83f4f6f942244eef3c83c944dbbaaabd62f5fd0402e8fa32e0a7b46df27a7965467eb1450a6ab36aa32ef635cac5547d23954f42a657JCwhsbSIVjqmYGz/T2mwR4lUYAXKI8bVzKe5WECVWyPErgA2iNoaQY5nrGP7jS90RgHqwn2w2u20/Ek1VhxSuhjAWNFN+Qhu9T5FCuGNtJUEZ7EEyBZYkk0bH3xNkI/srTx5nKOktAKKPOhUUh803/8SthbwcA8d5TsZvGnF2u5qyeQdw5KazpQplRter3TZ53N0Gc1QTSKlIis0lflisaAGwT7hYkhwvimPrpV59BvqvH9+p/13sTNK7oSrBbYa/nDNinuUZ1pLUgkSA7lDxIePezcHj6DnZG/JIePjRJHD9N6O4oA2z6NDKleaTXo6TeLDPK3n/UJWSWNoWO/ku9ghL2aSTwYJSw0JQEASgnVZ9IzyFDsCHuvy7Hq1Akji6rt2fXNMtf4r3p2w3oywHRCKlZRMznahsB8tMfe8IPBBJ3uisQwuKucosbI5bN7CCKDvQrRwISe10PRxm0SD3ZBmQAPZzNP/uwNYgGkt5gPsYY+ozQgW4snU+9w8WoUmePoGNyuD7hBKkNbRD/UcAD2Lp5YZrHBPbaC9Pcjgx0OvbHY3OJ4ZBP+iDPRG3bL5IQW0R6l2Kx+plQvXIiU4cJ3vj1KtI4Qp3LiFz97KMnPT4R2/nLk8Qay9Ny7AsLyJ+J8aGyvnWmwEvArC78omg8lmtx0GNS8zc3wRy1zSbm+nUmqLxhetgGVyFeVVTCL30ChhbbectrK0t8qB12LTDm4d8Uo22oyJt077E0oQWcVE63m5Ryxq4sjqepMXXcMN2vVDKwbmmdXjaqXV8Gn5VyqL6CZGbSNWnMakj9GIa5ztjgo3sIBeSUXbCyG6VkHr854JlfWkwsgvG4x4LouK/31sC7e8h9FoM5HfmI9LGMHJTuIAnv6jDST2EXffqFZFuksc2QEsjgXusyl8KzXhEmkLkj26TdynHzcCg+7Rmhs="
    key := getHKDF()
    decryptedData := Decrypt(encryptedData, key)
    fmt.Printf("%s", decryptedData)

}

func getHKDF() []byte {
    hash := sha512.New
    secret := []byte("MY SECRET")
    salt := []byte("")
    if _, err := rand.Read(salt); err != nil {
        panic(err)
    }

    info := []byte("MY INOF")

    kdf := hkdf.New(hash, secret, salt, info)

    key := make([]byte, 16)
    if _, err := io.ReadFull(kdf, key); err != nil {
        panic(err)
    }
    return key
}

func Decrypt(encryptedData string, key []byte) []byte {
    data, err := base64.StdEncoding.DecodeString(encryptedData)
    if err != nil {
        panic(err)
    }
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }

    iv := data[0:aes.BlockSize]

    buffer := make([]byte, len(data)-len(iv))
    decrypter := cipher.NewCBCDecrypter(block, iv)

    decrypter.CryptBlocks(buffer, data[len(iv):])
    return PKCS7Unpadding(buffer)
}

func PKCS7Unpadding(plantText []byte) []byte {
    length := len(plantText)
    padding := int(plantText[length-1])
    return plantText[:(length - padding)]
}

Output

`����G�_Qf2�mr�w\yX�yN^|��-2�Dw,��z�N�����DsG
������%�I���
��O�اP��}���H��w���G�X�g6�S|YToxNjp7czoyOiJpZCI7aTo0NTg7czo3OiJwcm9kdWN0IjtzOjQwOiJBcnRpY2Egc29mdHdhcmUgMSB5ZWFyIExpY2Vuc2UgMC01IFVzZXJzIjtzOjY6ImV4cGlyZSI7czoxMDoiNDA3MDk5NTE0MCI7czoxMDoibWF4X3NlcnZlciI7czoxOiI0IjtzOjEwOiJzZWxsZXJfY2lkIjtpOjI1O3M6MTA6InNlbGxlcl91aWQiO2k6ODE7czoxMDoiY29tcGFueV9pZCI7aToxMzk7czo0OiJwYWlkIjtpOjE7czo2OiJzZWxsZXIiO3M6MzM6IkFuZHLDqSBCb2xpbmhhcyBAIFNBUyBBcnRpY2EgVGVjaCI7czo2OiJhY3RpdmUiO2k6MTtzOjU6ImxhYmVsIjtzOjg6Im15X2xhYmVsIjtzOjc6InNlcnZpY2UiO2k6MTtzOjEyOiJtYXhfd2Vic2l0ZXMiO047czoxMjoiY29tcGFueV9uYW1lIjtzOjEwOiJSb2RyaWd1ZXphIjtzOjk6IlgtQVBJLUtFWSI7czozMjoiNDAxYTk0ZWQ2MjFlZWZmOWY1OGE2N2MxY2Q1YzJkZTgiO3

A quick fix for it is remove all text before last pipe (|)

Example

fmt.Printf("%s", decryptedData[strings.LastIndex(string(decryptedData), "|")+1:])

Output

YToxNjp7czoyOiJpZCI7aTo0NTg7czo3OiJwcm9kdWN0IjtzOjQwOiJBcnRpY2Egc29mdHdhcmUgMSB5ZWFyIExpY2Vuc2UgMC01IFVzZXJzIjtzOjY6ImV4cGlyZSI7czoxMDoiNDA3MDk5NTE0MCI7czoxMDoibWF4X3NlcnZlciI7czoxOiI0IjtzOjEwOiJzZWxsZXJfY2lkIjtpOjI1O3M6MTA6InNlbGxlcl91aWQiO2k6ODE7czoxMDoiY29tcGFueV9pZCI7aToxMzk7czo0OiJwYWlkIjtpOjE7czo2OiJzZWxsZXIiO3M6MzM6IkFuZHLDqSBCb2xpbmhhcyBAIFNBUyBBcnRpY2EgVGVjaCI7czo2OiJhY3RpdmUiO2k6MTtzOjU6ImxhYmVsIjtzOjg6Im15X2xhYmVsIjtzOjc6InNlcnZpY2UiO2k6MTtzOjEyOiJtYXhfd2Vic2l0ZXMiO047czoxMjoiY29tcGFueV9uYW1lIjtzOjEwOiJSb2RyaWd1ZXphIjtzOjk6IlgtQVBJLUtFWSI7czozMjoiNDAxYTk0ZWQ2MjFlZWZmOWY1OGE2N2MxY2Q1YzJkZTgiO3

Anyone can help to figure out resolve this issue properly without the need to removing unnecessary parts of the decoded message or to check if my decryption fuction is correct?

Thanks in advance

Best regards

0

There are 0 answers