Search code examples
javascriptencryptioncryptographyaescryptojs

AES 128 Decryption: First char of CryptoJS.enc.Latin1 is malformed


I have a string which is encoded and need to decrypt it. I have used the Crypto JS and after certain research, I could reach to below solution.

data = "+JdTb5BOloxaBHQlTw6NPLNV9lZix1OwhR3HF3IRtu2pdg/TLkrTw6Xu4JpKFlxE+zgOZavj0UynSZ+ojxmDXRbUlfyOc4YAncJVMXr28/AtfxZkNQoHbPIo7WxcSdidNE2k+DHZFcNNKOzYnvL1oDN4ezecs8Vo7K6vC5ZFLPUylXsi5sPsGye+TBbauPX+/wXa3hWUJVMNk6HUghW7l4N5Ei7HnrxLkFSFnz+9YUKYbFMEgV6wd9debHrpyytVhA3x2+Eyn5KnQ7iNJKQsNw==";
key = "062ec23950a55b9f8b21b0f9d45ca853";

// Decode the base64 data so we can separate iv and crypt text.
var rawData = atob(data);
var iv = rawData.substring(0,32);
var crypttext = rawData.substring(32);

// Decrypt...
var plaintextArray = CryptoJS.AES.decrypt(
  { ciphertext: CryptoJS.enc.Latin1.parse(crypttext) },
  CryptoJS.enc.Hex.parse(key),
  { iv: CryptoJS.enc.Latin1.parse(iv) }
);

var test = CryptoJS.enc.Latin1.stringify(plaintextArray);
console.log(test.toString())
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/aes.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>

The output of the above is

8«ÊWÒϬR¶jÛWY#ESPONSE_TEXT>
   <RESULT>OK</RESULT>
   <RESULT_CODE>-1</RESULT_CODE>
   <TERMINATION_STATUS>SUCCESS</TERMINATION_STATUS>
   <COUNTER>2</COUNTER>
   </RESPONSE>

Instead of

   <RESPONSE_TEXT>
   <RESULT>OK</RESULT>
   <RESULT_CODE>-1</RESULT_CODE>
   <TERMINATION_STATUS>SUCCESS</TERMINATION_STATUS>
   <COUNTER>2</COUNTER>
   </RESPONSE>

I am not able to find why 8«ÊWÒϬR¶jÛWY is been coming to the result. Kindly help to find the missing thread.


Solution

  • Use - CryptoJS.lib.WordArray.random(128/8) to generate iv

    data = "+JdTb5BOloxaBHQlTw6NPH2KFaA1mUL2vEuOqHmteozJutLfH1fQrDn+OE8Y1LgoFNqTjpuELCLB1noWbQ9Dz2g6NcD2vPAd4okiYArXnz+YKhVaGcqw+FTThjTWadMD/KvpzZ7SlxBh7HpCbZ/KMmxsOOnuk2F8pVEV3pkJMUgxV36c/iN9C+aRHPt95XRKzfU5ISaoBIq+/9K4WzW6i8yI8r6sdyRDoRc2q/EXuvX5666vdP1yojm2yhaL+1EwgkkYRn+GLyYuzFN1yCi+OA==";
    key = "062ec23950a55b9f8b21b0f9d45ca853";
    
    // Decode the base64 data so we can separate iv and crypt text.
    var rawData = atob(data);
    var iv = CryptoJS.lib.WordArray.random(128/8);
    var crypttext = rawData;
    
    
    // Decrypt...
    var plaintextArray = CryptoJS.AES.decrypt(
      { 
      	ciphertext: CryptoJS.enc.Latin1.parse(crypttext)
      },
      CryptoJS.enc.Hex.parse(key),
      { 
        iv: CryptoJS.enc.Latin1.parse(iv),
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
      }
    );
    
    var decrypted = CryptoJS.enc.Latin1.stringify(plaintextArray);
    console.log(decrypted);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>

    Fiddle - https://jsfiddle.net/guptasanchit90dev/p00fhmp4/