Я очень давно не писал статьи по php, со времен ... да уж не помню. Но чем-то хочется поделиться, тем не менее. Сразу скажу - исходные тексты писал не я, но тестировал на своей машине. Речь пойдет о шифровании 128 бит из ноды в пхп и наоборот PHP: /** * Encrypt and decrypt data from server to server. * * @package * @subpackage app\components\crypt * @see https://gist.github.com/rojan/9545706 * @author rojan */ class Crypto implements CryptInterface{ /** * Encryption key * * @var string */ private $encryptKey; /** * Initialization vector * * @var string */ private $iv; /** * Blocksize * * @var int */ private $blocksize = 16; /** * Setting up encrypt key and initialization vector. * * @param string $encryptKey Ecrypt key * @param string $iv Initialization vector * @return void */ public function setCredentials(string $encryptKey, string $iv){ $this->encryptKey = $encryptKey; $this->iv = $iv; } /** * Returns decrypted data. * * @param string $data Encrypted data * @return string */ public function decrypt(string $data) : string{ return $this->unpad(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->encryptKey, hex2bin($data), MCRYPT_MODE_CBC, $this->iv), $this->blocksize); } /** * Returns encrypted data. * * @param string $data Plain data * @return string */ public function encrypt(string $data) : string{ //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)); } /** * Unpad the data. * * @param string $str Data string * @param int $blocksize Size of the block * @return string */ private function unpad(string $str, int $blocksize) : string{ $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; } } это, разумеется, мой класс для шифрования, основанный на решении уважаемого rojan. - CryptInterface можно удалить в любое время. в ответе в node, к сожалению, не могу выложить свой код из ноды, могу только приложить решение от rojan. Код (Javascript): 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); Тут у меня возникла проблема. Нода отдает шифрование с несколькими лишними байтами справа. Лечить пришлось так (лечение отвратительное, сразу говорю. но - лично у меня других данных не предполагается, вы можете всегда изменить паттерн под свои нужды) PHP: public static function normalizeJSON(string $string) : string{ return preg_replace('/[^a-zA-Z0-9\-\_\{\}:\",\[\]\(\)\\/\.\@&; ]/ui', '', $string); } с 256 бит шифрованием отдельная головная боль, если кому-то будет интересно, выложу позже, с описанием либ под linux.