1

I've been hunting the internet for the last 3 hours and I've finally decided to ask the question. Is is possible to decrypt a base64 text string in NodeJS that was encrypted through PHP.

I've tried many steps to break it down but nothing I do seems to work.

My Old PHP Methods That DOES work.

class EncryptionSystem{
    private $iv;
    public $iv_size;
    public $key;

    public function __construct(){
        $this->iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        $this->iv = mcrypt_create_iv($this->iv_size, MCRYPT_RAND);
        $this->key = "SUPER SECURE STRING";
    }

    public function crypt_data($data = null){
        $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->key, $data, MCRYPT_MODE_CBC, $this->iv);
        $ciphertext = $this->iv.$ciphertext;
        return $ciphertext;
    }

    public function decrypt_data($data){
        $ciphertext_dec = base64_decode($data);
        $iv_dec = substr($ciphertext_dec, 0, $this->iv_size);
        $ciphertext_dec = substr($ciphertext_dec, $this->iv_size);
        $plaintext_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->key, $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
        return array($iv_dec,$plaintext_dec);
    }
}

My Attempt at the NodeJS using Mcrypt (Does Not Work)

var post64 = results[0].post;
var de64 = Buffer.from(post64, 'base64');
var desCBC = new MCrypt("rijndael-128","cbc");

var iv = de64.slice(0,desCBC.getIvSize());
var ciphered = de64.slice(desCBC.getIvSize());

console.log("IV:",iv);
console.log(iv.length);
console.log("IV SIZE:",desCBC.getIvSize());
desCBC.open(new Buffer(password.slice(0,desCBC.getIvSize(),"utf8")),new Buffer(iv,"utf8"));

var plaintext = desCBC.decrypt(new Buffer(ciphered,"utf8"));
console.log(plaintext.toString());

Another attempt using Crypto (also doesn't work)

console.log("Base64",post64);
console.log("RAW",de64.toString("binary"));
var iv = de64.toString("binary").slice(0,16);
var ciphered = de64.toString("binary").slice(16);

console.log("IV:",iv);
console.log(iv.length);
console.log("Ciphered:",ciphered);

var decipher = crypto.createDecipheriv(algorithm,password,new Buffer(iv,'hex'));
Matthew Auld
  • 388
  • 1
  • 3
  • 18

1 Answers1

0

Try use module crypto-js. It work fine for me!

aesDecryptDef(cipherData) {
    let CryptoJS = require("crypto-js"),
        key = CryptoJS.enc.Utf8.parse(this.AES_KEY),
        iv = CryptoJS.enc.Utf8.parse(this.AES_IV),
        decrypted = CryptoJS.AES.decrypt(cipherData, key, {
            iv: iv
        });
    return decrypted.toString(CryptoJS.enc.Utf8);
};
Anph
  • 163
  • 1
  • 14
  • See the issue is I have a randomly generator IV for each data that's saved for extra security. The IV is stored at the beginning of the encrypted data. – Matthew Auld Apr 21 '17 at 16:06