Denly
Denly

Reputation: 949

crypto-js decrypt from Hex

I am trying to make a JavaScript function with package crypto-js to decode AES (CBC mode).

I input the data in an online decoding tool and it decrypted correctly, so I am sure the following data is correct, but I just can't reproduce it by JavaScript.

Here is the online decrypting (so I'm sure the data, key, iv are correct): http://aes.online-domain-tools.com/link/deb718giF4dUxZylq/

My code with crypto-js@3.1.8:

// data, key, iv are all Hex
var data = "bd6e0a73147a2c224c7c20346d0e9a138b744a5d94463cdff6dbb965055f974f097104399d2c40af2f0ac667f3857e70e9703bf27f6411f7e97c3449e8921f3c98e665914689b4b77b5bbcc8d8bc319e680eb89eedb1c25178923ae57fb3fb476755d6009f1aed88fffcb9b2ed3b4cf6f23d9c4c56da1dde6619e45a8d6f06412853ae1941cf554b6824112a913750a7485ed67fb38b950411310410de998f2597c2fcc81a305b0df369f54b75426176";
var key = 'befce5c6da98837ea421811c832817ae';
var iv = "a884a7edd5d06a48d6da9ad11fd36a75";
// transfer Hex to WordArray
var _data = CryptoJS.enc.Hex.parse(data);
var base64_data = _data.toString(CryptoJS.enc.Base64);
var _key = CryptoJS.enc.Hex.parse(key);
var _iv = CryptoJS.enc.Hex.parse(iv);

decrypted = CryptoJS.AES.decrypt(
  base64_data, // pass base64
  _key,  // pass WordArray
  {iv: _iv, // pass WordArray
   mode: CryptoJS.mode.CBC,
   padding: CryptoJS.pad.ZeroPadding
  })
console.log(decrypted.toString(CryptoJS.enc.Utf8));
// out put fail to match Utf8

It output Error: Malformed UTF-8 data

The decoded string should be: (the link is not important)

https://emogo-media-testing.s3.amazonaws.com/1503342403787_blob?AWSAccessKeyId=AKIAI5MUDCK6XYWKGAKA&Expires=1534882403&Signature=t1PFesQuOpOlIMKoOqje%2Bs7I%2Fhg 

Any hint is appreciated. Thank you!

Upvotes: 2

Views: 5105

Answers (1)

r44
r44

Reputation: 36

I know it has been a while since you asked the question but I will respond just so the next person does not stumble upon an unanswered question.

Your code works fine, it decrypts AES.CBC encrypted data correct, the problem lies with your input data.

Your encrypted data string should have looked like:

80b7c4881334675693ef9c95259e70b24d0736e98f8424233d5e37f353261c2a589287bc3f675449f7d8ed4e2289a4c06b22d7f83efc09cfb72abe3a76e193a8efbdc968232d29b9b58135bfa24d51e60e34791f652a0aa806d0be7734dd61a930a30c99f31f08740cdb182af07b19d5b4274deb958d984b3ccb9d6e2be0cfa3a026dd6b734dbf1dd3635bc7bcceface9c55dfb9455ca834a6dbd1aa0f3c23923ce6aeba59acbc80d681fee73487b9004496540830d44102b94e35eac291c4e3b8c9ac168ae799e46cde45ee652415ae69992d0f7527045fd42b82e9e6946cfb2dbcc3b93f19ff0e5035ab12250f7a917975b2f7c069cbd8a0ba0d94b318634a

for this example to work correctly.

The key you used is not a hex string but a text string. Your online example is no longer valid but I figured it out after a couple of tries.

If change the following line:

var _key = CryptoJS.enc.Hex.parse(key);

to:

var _key = CryptoJS.enc.Utf8.parse(key);

Your code example will work fine with your original data string.

When you decrypted the text on http://aes.online-domain-tools.com/ you probably had the plaintext textbox selected instead of hex for your key input.

Upvotes: 2

Related Questions