Last active
March 19, 2023 15:14
-
-
Save rojan/9545706 to your computer and use it in GitHub Desktop.
Encrypt in nodejs and decrypt in php or vice versa
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var crypto = require('crypto'); | |
var key = 'MySecretKey12345'; | |
var iv = '1234567890123456'; | |
var cipher = crypto.createCipheriv('aes-128-cbc', key, iv); | |
var decipher = crypto.createDecipheriv('aes-128-cbc', key, iv); | |
var text = 'plain text'; | |
var encrypted = cipher.update(text, 'utf8', 'binary'); | |
encrypted += cipher.final('binary'); | |
hexVal = new Buffer(encrypted, 'binary'); | |
newEncrypted = hexVal.toString('hex'); | |
console.log('Encrypted: ', newEncrypted); | |
var decrypted = decipher.update(newEncrypted, 'hex', 'binary'); | |
decrypted += decipher.final('binary'); | |
console.log('Decrypted: ', decrypted); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class Crypto | |
{ | |
private $encryptKey = 'MySecretKey12345'; | |
private $iv = '1234567890123456'; | |
private $blocksize = 16; | |
public function decrypt($data) | |
{ | |
return $this->unpad(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, | |
$this->encryptKey, | |
hex2bin($data), | |
MCRYPT_MODE_CBC, $this->iv), $this->blocksize); | |
} | |
public function encrypt($data) | |
{ | |
//don't use default php padding which is '\0' | |
$pad = $this->blocksize - (strlen($data) % $this->blocksize); | |
$data = $data . str_repeat(chr($pad), $pad); | |
return bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, | |
$this->encryptKey, | |
$data, MCRYPT_MODE_CBC, $this->iv)); | |
} | |
private function unpad($str, $blocksize) | |
{ | |
$len = mb_strlen($str); | |
$pad = ord( $str[$len - 1] ); | |
if ($pad && $pad < $blocksize) { | |
$pm = preg_match('/' . chr($pad) . '{' . $pad . '}$/', $str); | |
if( $pm ) { | |
return mb_substr($str, 0, $len - $pad); | |
} | |
} | |
return $str; | |
} | |
} | |
$crypto = new Crypto(); | |
$text = 'plain text'; | |
$encrypted = $crypto->encrypt($text); | |
//$encrypted = '9eb6c9052d1de4474fb52d829360d5af'; | |
echo "Encrypted: ".$encrypted."\n"; | |
$decrypted = $crypto->decrypt($encrypted); | |
echo "Decrypted: $decrypted\n"; |
WOn't work in php 7.2, since mcrypt was removed
@vip3r011use any php library/example for aes-128-cbc
method, eg: https://gist.github.com/odan/138dbd41a0c5ef43cbf529b03d814d7c
Is this works fine with public key private key encrypt decrypt
I created an updated Gist for use in Web(browsers), Node.JS, command line and PHP 7
https://gist.github.com/Lawlez/88e04e3541cc0608c953a118b86bfc1a
I'm still working on a solution that allows me to use any implementation (Node / PHP / openssl) for encryption and get the web version to decrypt it successfully. currently, I'm still facing issues when trying to decrypt a string in node or web that was encrypted using openssl CLI.
hope it helps
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Dear Rojan, thanks for that fantastic script.
I'm afraid the JS script does not work with utf-8 strings such as "ÖÄÜßöäü".
They might be encoded properly (not sure) but when decoded they end up something like this "����ö"
I gave a try encoding it using the node.js uft8 lib but that failed.
I removed the 'utf8' argument from line #8 that worked for the string "ÖÄÜßöäü" but e.g. not for a more complex JSON-String like that
'{"name":"ÖÄÜßöäü", ort:"pöäsd asdölkj sadfj asdflkj"}'
it gave me this error on the console:
EDIT: I changed the "binary" arguments for decryption to "utf8" and it worked well with special characters.