0

Below are two versions of codes that encrypt a text string. One is using Node JS, the other is using PHP. I am not sure why the output is different, where I expect the output should be the same.

Nodejs v11.9.0

const crypto = require('crypto');
const secret_data = 'httpswwwcom';
const CIPHER_METHOD = 'aes-256-ctr';
const key = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
const iv = 'BBBBBBBBBBBBBBBB';
const cipher = crypto.createCipheriv(CIPHER_METHOD, key, iv);
const encrypted = cipher.update(secret_data , 'ascii', 'ascii') + cipher.final('ascii');
console.log(Buffer.from(encrypted).toString('base64'));

PHP 7.3.2

const secret_data = 'httpswwwcom';
const CIPHER_METHOD = 'aes-256-ctr';
const key = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
const iv = 'BBBBBBBBBBBBBBBB';
$encrypt= openssl_encrypt(
    secret_data ,
    CIPHER_METHOD,
    key,
    OPENSSL_RAW_DATA,
    iv
);
echo base64_encode($encrypt);

Nodejs output is: Jx0UQhAEJSQ8Cwo=

PHP output is: p50UwhAEJSS8C4o=

I have tried updating the encodings (e.g. from Ascii to latin1, or utf8, or binary), but I couldn't make my NodeJS output the same with PHP.

What do I need to do or modify my NodeJS codes to match the output from PHP?

forestclown
  • 1,418
  • 4
  • 19
  • 37
  • I dont know how how work the encription on Nodejs... but check the `createCipheriv` function if your original `iv` still a string or the function convert your original `iv` to hex or whatever. – MTK Mar 04 '19 at 14:33
  • @MTK When check the documentation for both Node and PHP, both the IV and Key can be accepted as string. If I convert IV to hex in Nodejs like Buffer.from(iv).toString('hex'), NodeJS will throw Error: Invalid IV length – forestclown Mar 04 '19 at 14:45
  • I know that can be accepted as string but mi question is if `createCipheriv` don't change (inside on process) your original string to another type. I do'nt suggest you to change manually the `iv` type. I suggest to chek inside `createCipheriv` function if your original `LTvVTPHXt1tXJj5H` still the same as you imput (sorry for mi English) – MTK Mar 04 '19 at 14:52
  • Is there a way to check? Because crypto.createCipheriv comes with nodeJS not 3rd party library I have installed. – forestclown Mar 04 '19 at 15:02
  • have a look at [here](https://stackoverflow.com/questions/12027847/aes-encrypt-in-php-with-openssl-decrypt-in-node-js) – kelalaka Mar 04 '19 at 15:21

0 Answers0