php mcrypt для интеграции с javascript - PullRequest
8 голосов
/ 20 июня 2011

Я пытаюсь использовать javascript для кодирования данных с помощью библиотек AES-256-CBC и php mcrypt для декодирования, и наоборот.

Мне известно о проблемной природе javascript и о том, что кто-то видитключ, но я использую javascript инструмент создания сценариев для не-веб-среды - так что не беспокойтесь об этом.

Я нашел pidder 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 ]

1 голос
/ 17 февраля 2014

Попробуйте MCRYPT_RIJNDAEL_128 с 32-байтовым ключом для AES-256.

AES - это 128-битный блочный шифр, который поддерживает 128-, 192- и 256-битные ключи.Rijndael-256 - это 256-битный блочный шифр и AES.AES - это спецификация 128-битного блока для Rijndael.

0 голосов
/ 02 апреля 2014

Прежде всего: 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, использующей криптографическую библиотеку.

Надеюсь, это сработает для вас.

0 голосов
/ 11 марта 2014

Ваш код последовательный, честно говоря, я не пытался его исправить, но у меня есть функция, которая хорошо работает и может вам помочь.

    /**
 * 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

0 голосов
/ 25 ноября 2012

Javascript Mcrypt хорошо работает с PHP mcrypt.Вы можете использовать это вместо пиддера.

0 голосов
/ 20 июня 2011

Pidder использует функцию получения ключа, чтобы получить ключ от пароля (я думаю, это должен быть HMAC-SHA1), но вы, похоже, используете простой пароль в качестве ключа.

...