Прежде всего: MCRYPT_RIJNDAEL_256 НЕ (!) AES-256-CBC, если вы хотите это шифрование, вы должны использовать MCRYPT_RIJNDAEL_128 с 265-битным 32-символьным ключом.
Это будет часть php
function decrypt($data, $key) {
if(32 !== strlen($key)) $key= hash('SHA256', $key, true);
$data = base64_decode($data);
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16));
$padding = ord($data[strlen($data) - 1]);
return substr($data, 0, -$padding);
}
Эта функция php включает заполнение, которое является важной частью, потому что если длина предоставленных данных не кратна ключу, вы получите что-то странное.
Для декодирования мы используемнекоторые из моих скриптов Node.js с эмулированным методом php str_repeat для iv:
var crypto = require('crypto');
function encrypt(data, key) {
key = key || new Buffer(Core.config.crypto.cryptokey, 'binary'),
cipher = crypto.createCipheriv('aes-256-cbc', key.toString('binary'), str_repeat('\0', 16));
cipher.update(data.toString(), 'utf8', 'base64');
return cipher.final('base64');
}
function str_repeat(input, multiplier) {
var y = '';
while (true) {
if (multiplier & 1) {
y += input;
}
multiplier >>= 1;
if (multiplier) {
input += input;
} else {
break;
}
}
return y;
}
ПРИМЕЧАНИЕ. Не рекомендуется использовать статический IV ( Вектор инициализации )!ПРИМЕЧАНИЕ. Часть JavaScript предназначена для Node.js, использующей криптографическую библиотеку.
Надеюсь, это сработает для вас.