Попробуйте так:
JS:
/**
* Зашифровать сообщение AES ключом
*
* @param string шифруемое сообщение
* @param key ключ, 8 символов от 0 до F
* @return string зашифрованное сообщение
*/
function encrypt (string, key){
var mykey = CryptoJS.enc.Hex.parse(key+key+key+key);
var iv = CryptoJS.enc.Hex.parse('00000000000000000000000000000000');
string='_crc_'+string+String.fromCharCode(0);
var len=string.length;
var ost=len%16;
for (var i=0;i<ost-1;i++)
string=string+String.fromCharCode(getRandomInt(65,90));
var encrypted = CryptoJS.AES.encrypt(
string,
mykey,
{
keySize: 128 / 8,
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);
var encr=encrypted.ciphertext.toString(CryptoJS.enc.Hex);
return encr;
}
/**
* Расшифровать сообщение AES ключом
*
* @param crypted зашифрованные данные
* @param key ключ, 8 символов от 0 до F
* @return string расшифрованное сообщение
*/
function decrypt(crypted, key) {
try {
var mykey = CryptoJS.enc.Hex.parse(key+key+key+key);
var iv = CryptoJS.enc.Hex.parse('00000000000000000000000000000000');
var ciphertext = CryptoJS.enc.Hex.parse(crypted);
var encrypted = new Object();
encrypted.ciphertext = ciphertext;
var decrypted = CryptoJS.AES.decrypt(
encrypted,
mykey,
{
keySize: 128 / 8,
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);
var decr=CryptoJS.enc.Utf8.stringify(decrypted);
var decr2 = "";
var endIndex = 0;
for (var i = 0; i<decr.length; i++) {
if (decr.charCodeAt(i)==0) {
endIndex=i;
break;
}
}
decr2=decr.substr(0, endIndex);
if (decr2.indexOf('_crc_') !== 0) throw new Error();
return decr2.substr(5);
} catch (e) {
throw "Ошибка расшифровки ответа сервера";
}
}
PHP:
function encrypt ($string, $key) {
//проверяем, чтобы длина ключа была 8 символов
if (mb_strlen($key,'utf-8') !== 8)
throw new Exception ("Длина ключа должна быть 8 символов");
//устанавливаем тип алгоритма
$keySize = MCRYPT_RIJNDAEL_128;
$mode = MCRYPT_MODE_CBC;
//формируем полный ключ, полный ключ состоит из повторяющихся четыре раза ключа, итого 32 байта
$fullkeystring=$key.$key.$key.$key;
//преобразуем ключ из строки в байтовый массив
$mykey=pack("H*",strtoupper($fullkeystring));
//IV используем нулевой
$iv=pack("H*",'00000000000000000000000000000000');
//добавляем к сообщению заголовок, по которому потом будем определять, расшифровалось или нет, в конец записываем 0
$string='_crc_'.$string.chr(0);
//дополняем строку до границы разным мусором
$len=strlen($string);
$ost=$len % 16;
for ($i=0;$i<$ost-1;$i++)
$string=$string.chr(rand(65, 90));
//шифруем
$ciphertext = mcrypt_encrypt($keySize, $mykey, $string, $mode, $iv);
//преобразуем байтовый массив в строку содержащую шестнадцатеричный код, и возвращаем ее
return strtoupper(bin2hex($ciphertext));
}
function decrypt ($crypted, $Key) {
//проверяем, чтобы длина ключа была 8 символов
if (mb_strlen($Key,'utf-8') !== 8)
throw new Exception ("Неверная длина ключа");
//устанавливаем тип алгоритма
$keySize = MCRYPT_RIJNDAEL_128;
$mode = MCRYPT_MODE_CBC;
//формируем полный ключ, полный ключ состоит из повторяющихся четыре раза ключа, итого 32 байта
$fullkeystring=$Key.$Key.$Key.$Key;
//преобразуем ключ из строки в байтовый массив
$mykey=pack("H*",strtoupper($fullkeystring));
//IV используем нулевой
$iv=pack("H*",'00000000000000000000000000000000');
//преобразуем строку к верхнему регистру, а затем из шестнадцатеричного кода преобразуем в массив байтов
$BinMessage=pack("H*",strtoupper($crypted));
//дешифруем сообщение
$decrypt=mcrypt_decrypt($keySize, $mykey, $BinMessage, $mode, $iv);
//обрезаем пробелы
$result = trim($decrypt);
//проверяем, корректно ли расшифровалось, или нет
if (strpos($result,'_crc_') !== false && strpos($result,'_crc_') === 0) {
//убираем лишний мусор содержащейся в конце строки
if (strpos($result, chr(0))>0)
$result = substr($result, 0, strpos($result, chr(0)));
return substr ($result, 5); //если все нормально, возвращаем строку
}
else throw new Exception ("Неверный ключ шифрования");
}