Интеграция php mcrypt в javascript
Я пытаюсь использовать JavaScript для кодирования данных с помощью библиотек AES-256-CBC и php mcrypt для декодирования, и наоборот.
Мне известно о проблемной природе javascript и о том, что ключ видят все, но я использую javascript - инструмент для написания сценариев для не-веб-среды - поэтому не беспокоюсь об этом.
Я нашел пиддер https://sourceforge.net/projects/pidcrypt/
и зашифровал некоторые данные с демо-страницы, затем попытался расшифровать их с помощью php, но что-то не так, и я не могу найти, что... Я использую один и тот же ключ с обоих концов, 32-байтовую строку
любые указатели будут оценены
~~~
$encrypted = "string after pidder encryption";
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_256,'',MCRYPT_MODE_CBC,'');
$iv_size = mcrypt_enc_get_iv_size($cipher);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
mcrypt_generic_init($cipher, $key, $iv);
$encrypted = base64_decode($encrypted);
echo "after b64decode: " . $encrypted . "\n\n\n";
$encrypted = mdecrypt_generic($cipher, $encrypted);
echo "decrypt:" . $encrypted;
~~~
5 ответов
Попробуйте MCRYPT_RIJNDAEL_128 с 32-байтовым ключом для AES-256.
AES - это 128-битный блочный шифр, который поддерживает 128-, 192- и 256-битные ключи. Rijndael-256 - это 256-битный блочный шифр и AES. AES - это спецификация 128-битного блока для Rijndael.
Ваш код является последовательным, честно говоря, я не пытался его исправить, но у меня есть функция, которая хорошо работает и может помочь вам.
/**
* Encrypt Token
*
* @param unknown $text
*/
private function rijndaelEncrypt($text) {
$iv_size = mcrypt_get_iv_size ( MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB );
$iv = mcrypt_create_iv ( $iv_size, MCRYPT_RAND );
$key = 'your key';
return base64_encode ( mcrypt_encrypt ( MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv ) );
}
/**
* Decrypt
*
* @param unknown $text
*/
private function rijndaelDecrypt($text) {
$iv_size = mcrypt_get_iv_size ( MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB );
$iv = mcrypt_create_iv ( $iv_size, MCRYPT_RAND );
$key = 'your key';
// I used trim to remove trailing spaces
return trim ( mcrypt_decrypt ( MCRYPT_RIJNDAEL_256, $key, base64_decode ( $text ), MCRYPT_MODE_ECB, $iv ) );
}
См. http://us3.php.net/manual/en/function.mcrypt-encrypt.php
Javascript Mcrypt хорошо работает с PHP mcrypt. Вы можете использовать это вместо пиддера.
Pidder использует функцию получения ключа, чтобы получить ключ от пароля (я думаю, это должен быть HMAC-SHA1), но вы, кажется, используете простой пароль в качестве ключа.
Прежде всего: 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's 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, использующей криптографическую библиотеку.
Я надеюсь, что это работает для вас.