производительность mcrypt

Я шифрую некоторые данные и получаю сильно различающиеся результаты во времени работы скрипта между системами.

При запуске моего алгоритма на машине с Win7 шифрование завершается за 3-8 тысяч секунд.

Тот же код в Linux (блоки Ubuntu11 и Debian6) занимает от 7 до 35 СЕКУНД.

Это не совсем приемлемо для моих нужд, и мне было интересно, может ли какой-нибудь добрый человек пролить свет.

Соответствующий код ниже:

<?php

class MyEncryption
{
    public function __construct( $keyData )
    {
        $this->_encryptInit( $keyData );
    }

    private function _encryptInit( $keyData )
    {
        $this->ch = mcrypt_module_open('rijndael-256', '', MCRYPT_MODE_ECB , '');

        $vector  = mcrypt_create_iv (mcrypt_enc_get_iv_size( $this->ch ), MCRYPT_DEV_RANDOM );
        $keySize = mcrypt_enc_get_key_size( $this->ch );

        $key = substr( hash('SHA512', $keyData . $keySize ), 0, $keySize );

        mcrypt_generic_init( $this->ch, $key, $vector );
    }

    private function _encryptClose()
    {
        mcrypt_generic_deinit( $this->ch );
        mcrypt_module_close( $this->ch );
    }

    public function encryptData( $data )
    {
        $safeData = mcrypt_generic( $this->ch, $data );

        $this->_encryptClose();

        return $safeData;
    }

    public function decryptData( $safeData )
    {
        $data =  mdecrypt_generic( $this->ch, $safeData );

        $this->_encryptClose();

        return $data;
    }
}

при запуске этого кода я вижу несоответствия:

<?php

echo microtime(). ' -- Start || '.PHP_EOL;
$enc = new MyEncryption( 'astring' );
echo microtime(). ' -- Init || '.PHP_EOL;
$data = array( 'dob'=>'1970-01-01','creditcardno'=>'4000123412345678' );
$safeData = $enc->encryptData( json_encode( $data ) );
echo microtime(). ' -- Encrypted || '.PHP_EOL;
echo ' == ' . $safeData . ' == '.PHP_EOL;

$dec = new MyEncryption( 'astring' );
echo microtime(). ' -- Init2 || '.PHP_EOL;
$data = json_decode( $dec->decryptData( trim( $safeData ) ) );
echo microtime(). ' -- Decrypted || '.PHP_EOL;
echo ' == ' . $data . ' == '.PHP_EOL;

Любые указатели будут с благодарностью приветствоваться.


person Ian Wood    schedule 14.02.2012    source источник


Ответы (1)


Решение найдено!!

Немного странно, но я понимаю, почему это так.

Это метод, используемый для генерации случайных данных на основе MCRYPT_DEV_RANDOM.

ответ (или, по крайней мере, то, что сработало для меня) находится в этой статье

Вместо короткого рассказа используйте MCRYPT_DEV_URANDOM.

MCRYPT_DEV_RANDOM для блоков *nix до тех пор, пока не будет доступно достаточно данных в пуле энтропии. URANDOM делает его своим, если его нет.

person Ian Wood    schedule 14.02.2012