Search code examples
javascriptencryptionencodingcryptographycryptojs

crypto-js aes can't decrypt what it encrypted


Hello I'm trying to decrypt a encrypted aes string with crypto-js but it seems like it doesn't work right.

I'm using:

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script>
    var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");

    var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
</script>

But my results are:

encrypted: U2FsdGVkX19whKq54yOQt3l1erbtEtn/M0qJjAH+E/E=
decrypted: 4d657373616765

My expectation was the it returns back "Message". What am I missing?


Solution

  • The return type of all CryptoJS.<blockcipher>.decrypt() functions is a WordArray which is the native representation of binary data in CryptoJS. When you force it to be printed (automatically calling toString()), the binary data that it contains will be Hex encoded.

    If you want to have a different encoding, then you need to specify it. Here are some examples:

    console.log(decrypted.toString()); // Hex encoded
    console.log(decrypted.toString(CryptoJS.enc.Hex)); // Hex encoded
    console.log(CryptoJS.enc.Hex.stringify(decrypted)); // Hex encoded
    
    console.log(decrypted.toString(CryptoJS.enc.Utf8)); // UTF-8 encoded
    console.log(CryptoJS.enc.Utf8.stringify(decrypted)); // UTF-8 encoded
    
    console.log(decrypted.toString(CryptoJS.enc.Base64)); // Base64 encoded
    console.log(CryptoJS.enc.Base64.stringify(decrypted)); // Base64 encoded