1

I've got a set of functions for encrypting/decrypting on the server (C#), however I'd like to port the decryption piece to Javascript. Here's the C# decryption functions I've used previously in C# with a sample encrypted string, password and IV

I'm having trouble with the JavaScript decryption piece using Cryptojs. The result that comes back is unexpectedly an empty string.

var ciphertext = "0MuDwNoWBFjN/1anszbl0Cxkrwh9ahRwE3c61t7io2c=";
var key = "8beee7ac-42d1-4294-91b8-68cd032cf1e1";
var iv = "9bC_#$/-+%@Kli%1Az=-@qT";

var ciphertextWA = CryptoJS.enc.Hex.parse(ciphertext);
var keyWA = CryptoJS.enc.Utf8.parse(key);
var ivWA = CryptoJS.enc.Utf8.parse(iv);
var ciphertextCP = { ciphertext: ciphertextWA };

var decrypted = CryptoJS.AES.decrypt(
    ciphertextCP,
    keyWA,
{ iv: ivWA }
);
console.log(decrypted.toString(CryptoJS.enc.Utf8));
1
  • I don't know what the defaults are, but check if you're using the same padding mode in both cases. Commented Jun 18, 2022 at 1:50

1 Answer 1

3

The bugs are in the determination of IV and key. Both are derived from passwords using SHA512. In the case of the key the first 32 bytes (bytes 0-31) are used, in the case of the IV the 16 bytes following the first 32 bytes (bytes 32-47).

The fixed code is:

var ciphertext = "0MuDwNoWBFjN/1anszbl0Cxkrwh9ahRwE3c61t7io2c=";
var key = "8beee7ac-42d1-4294-91b8-68cd032cf1e1";
var iv = "9bC_#$/-+%@Kli%1Az=-@qT";

var ciphertextWA = CryptoJS.enc.Base64.parse(ciphertext);
var ciphertextCP = { ciphertext: ciphertextWA };

var keyHashWA = CryptoJS.SHA512(key);
var keyWA = CryptoJS.lib.WordArray.create(keyHashWA.words.slice(0, 32/4));
var ivHashWA = CryptoJS.SHA512(iv);
var ivWA = CryptoJS.lib.WordArray.create(ivHashWA.words.slice(32/4, 48/4));

var decryptedWA = CryptoJS.AES.decrypt(
    ciphertextCP,
    keyWA,
    { iv: ivWA }
);
console.log(decryptedWA.toString(CryptoJS.enc.Utf8));
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>


Edit:
As you correctly guessed, the problem is caused by the different encodings (Windows-1252 in the C# code and UTF-8 in the JavaScript code). The fix is to decode in the JavaScript code with Windows-1252.
CryptoJS supports Latin1 (aka ISO-8859-1) but not Windows-1252 (aka Cp1252), s. encoders. The differences between the two encodings are minor, ranging from 0x80 to 0x9F. Just like UTF-8, both correspond to ASCII encoding in the range between 0x00 and 0x7F. Since the original plaintext contained only ASCII characters, there were no problems.
However, the new plaintext now contains byte sequences that are not compatible with UTF-8 (hence the error) or whose characters differ from Latin1 (hence the mismatches).
Since CryptoJS does not support Windows-1252, the decoding must be done with JavaScript on-board means or another library. One possibility is to convert the CryptoJS type WordArray to the more general JavaScript type Uint8Array. Then, using TextDecoder(), which supports a large repertoire of encodings, decoding can be performed using Windows-1252:

var ciphertext = `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`;
var key = "55790c03-4a4b-49f7-b7fe-d178454d88f0";
var iv = "9bC_#$/-+%@Kli%1Az=-@qT";

var ciphertextWA = CryptoJS.enc.Base64.parse(ciphertext);
var ciphertextCP = { ciphertext: ciphertextWA };

var keyHashWA = CryptoJS.SHA512(key);
var keyWA = CryptoJS.lib.WordArray.create(keyHashWA.words.slice(0, 32/4));
var ivHashWA = CryptoJS.SHA512(iv);
var ivWA = CryptoJS.lib.WordArray.create(ivHashWA.words.slice(32/4, 48/4));

var decryptedWA = CryptoJS.AES.decrypt(
    ciphertextCP,
    keyWA,
    { iv: ivWA }
);

function convertWordArrayToUint8Array(wordArray) {
    var arrayOfWords = wordArray.hasOwnProperty("words") ? wordArray.words : [];
    var length = wordArray.hasOwnProperty("sigBytes") ? wordArray.sigBytes : arrayOfWords.length * 4;
    var uInt8Array = new Uint8Array(length), index=0, word, i;
    for (i=0; i<length; i++) {
        word = arrayOfWords[i];
        uInt8Array[index++] = word >> 24;
        uInt8Array[index++] = (word >> 16) & 0xff;
        uInt8Array[index++] = (word >> 8) & 0xff;
        uInt8Array[index++] = word & 0xff;
    }
    return uInt8Array;
}

var decryptedUint8Array = convertWordArrayToUint8Array(decryptedWA);
var decrypted = new TextDecoder('windows-1252').decode(decryptedUint8Array);
console.log(decrypted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>

Sign up to request clarification or add additional context in comments.

3 Comments

Thanks for this! I noticed through testing with more complex data that the encoding is wrong. If I use UTF8 I get Malformed utf-8 data error. I tried using Latin1 and that seems to get me 99% of the way there, although double quotes don't come back correctly. I'm guessing I need to create a converter for the word array from w-1252, that I think i can manage on my own, but wondering if you know of a way to extend the enc object so I can just do CryptoJS.enc.W1252 in the final line?
@TheMuffinMan - Please see the edit section of my answer.
Works perfectly now. Appreciate the effort and detail.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.