How to do the correct way to encrypt to AES256 using CryptoJs

Hi i’m new to React Native, i can encrypt the data in the PHP but not with React Native using Crypto JS. (result in JS always different, the correct one is from the PHP)

This is the example in PHP :

<?php

$data = 'my1234567';
$iv = 'yourivare1234567';
$key = '356d9abc7532ceb0945b615a622c3370';

$abc = openssl_encrypt($data, 'aes-256-cbc', $key, 0,  $iv);
var_dump($abc);
// result is : string(24) "9EF/QLpR+o/KrVueiI4L0g=="

Now i try to replicate it in my React Native apps using Crypto JS. But the result always different, where i’m expecting the result using hardcoded data and iv like above is : “9EF/QLpR+o/KrVueiI4L0g==”

Below is the source code in JS :

const data = 'my1234567';
const iv = 'yourivare1234567';
const key = '356d9abc7532ceb0945b615a622c3370';

const fkey = CryptoJS.enc.Hex.parse(key);
const fiv = CryptoJS.enc.Hex.parse(iv);

const enc = CryptoJS.AES.encrypt(data, md5key, {
        iv: fiv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7,
});

const final = enc.ciphertext.toString(CryptoJS.enc.Base64);
console.log('encrypted password: ' , final) // result is kYLFiwI1IDZcFfsKsbrbzg==

Can somebody help on this?

Thanks before

Answer

fkey and fiv must be parsed using the UTF8 encoder. md5key is not defined and must be replaced by fkey:

const data = 'my1234567';
const iv = 'yourivare1234567';
const key = '356d9abc7532ceb0945b615a622c3370';

const fkey = CryptoJS.enc.Utf8.parse(key);
const fiv = CryptoJS.enc.Utf8.parse(iv);

const enc = CryptoJS.AES.encrypt(data, fkey, {
        iv: fiv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7,
});

const final = enc.ciphertext.toString(CryptoJS.enc.Base64);
console.log('encrypted password: ' , final) // result is 9EF/QLpR+o/KrVueiI4L0g==
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>

Note that (except for testing purposes) no static IV may be used for security reasons.