Search code examples
javascriptencryptioncryptojs

Cipher a string using crypto-js with hex encoding to make it url friendly


I am using crypto-js by brix. I have this function below that handles the encryption of a plain text.

import CryptoJS from 'crypto-js'
import AES from 'crypto-js/aes'

const SECRET = 'I am batman'
const plainText = 'This is Sparta!'

export function enc(plainText){
    // returns something like this U2FsdGVkX184He5Rp991JYAiCSdTwfZs8T3kJUk3zAc=  
    // but with random `/` and I dont want that
    // I want it to be Hex but .toString(CryptoJs.enc.Hex) 
    // is not working, it just returns an '' empty string
    // it's a string, I checked using typeof
    return AES.encrypt(plainText, SECRET).toString();
}

How do I make the enc(string) to return a Hex value which is url friendly?


Solution

  • You would likely want to do:

    export function dec(cipherText){
       var bytes = CryptoJS.AES.decrypt(cipherText, SECRET);
       var hex = bytes.toString(CryptoJS.enc.Hex);
       var plain = bytes.toString(CryptoJS.enc.Utf8);
       return [hex, plain];
    }
    

    This takes the encrypted base64 string and will return the decrypted plaintext and hexadecimal.

    EDIT: In regards to your comment and edited question:

    const SECRET = 'I am batman'
    
    function enc(plainText){
        var b64 = CryptoJS.AES.encrypt(plainText, SECRET).toString();
        var e64 = CryptoJS.enc.Base64.parse(b64);
        var eHex = e64.toString(CryptoJS.enc.Hex);
        return eHex;
    }
    
    function dec(cipherText){
       var reb64 = CryptoJS.enc.Hex.parse(cipherText);
       var bytes = reb64.toString(CryptoJS.enc.Base64);
       var decrypt = CryptoJS.AES.decrypt(bytes, SECRET);
       var plain = decrypt.toString(CryptoJS.enc.Utf8);
       return plain;
    }
    

    The end result takes the base64 string, makes it hexadecimal and returns the decrypted string.