Что такое альтернатива mcrypt_get_block и как ее использовать - PullRequest
1 голос
/ 28 мая 2019

У меня есть старый плагин WordPress, созданный с использованием фреймворка Symfony и использующий mcrypt_get_block_size('tripledes', 'ecb'). Тем не менее, я только что обновил php на своем сервере до версии 7.3, и теперь я получаю Fatal error: Call to undefined function HealthShieldForm\mcrypt_encrypt().

Я прочитал несколько статей, где они предлагают использовать openssl_encrypt(). К сожалению, я не знаю, с чего начать с точки зрения замены функций друг на друга, и уверен, что получаю те же результаты.

Мой текущий код такой:

private function encrypt($data)
    {
        //Pad for PKCS7
        $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
        $len = strlen($data);
        $pad = $blockSize - ($len % $blockSize);
        $data .= str_repeat(chr($pad), $pad);

        //Encrypt data
        $encData = mcrypt_encrypt('tripledes', $this->key, $data, 'ecb');

        return base64_encode($encData);
    }

    private function decrypt($data)
    {
        $data = base64_decode($data);

        $data = mcrypt_decrypt('tripledes', $this->key, $data, 'ecb');

        $block = mcrypt_get_block_size('tripledes', 'ecb');
        $len = strlen($data);
        $pad = ord($data[$len - 1]);

        return substr($data, 0, strlen($data) - $pad);
    }

UPDATE

Я адаптировал пример Питера для отражения в моем коде:

function encrypt($data)
    {
        $ciphertext = openssl_encrypt($data, 'des-ede3-ecb', $this->key, OPENSSL_RAW_DATA);
        return base64_encode($ciphertext);
    }

    function decrypt($data)
    {
        $ciphertext = base64_decode($data);
        $plaintext = openssl_decrypt($ciphertext, 'des-ede3-ecb', $this->key, OPENSSL_RAW_DATA);
        return $plaintext;
    }

Однако теперь я получаю эту ошибку: Warning: openssl_encrypt(): Unknown cipher algorithm

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Прежде всего, это может быть прекрасной возможностью для обновления вашего крипто. Triple DES, как правило, хорошо, но в основном используется только потому, что его можно очень эффективно реализовать на аппаратном уровне (например, на смарт-картах). Для серверов и ПК и тому подобного AES имеет равные, если не лучшие характеристики производительности (современные процессоры имеют специальные инструкции для AES из-за его повсеместного использования в TLS).

Не используйте ECB, если можете помочь, независимо от того, какой блочный шифр вы выберете. Через него можно увидеть пингвинов .

Если вы можете выбирать, используйте libsodium и выберите одну из конструкций AEAD (документы PHP практически не существуют, но вы можете довольно легко соотнести официальную документы с соответствующими функциями-оболочками в PHP).

In может только рекомендовать против использования OpenSSL (он имеет бесчисленные острые края; даже не скажет вам, например, слишком ли ваш ключ слишком короткий), но в случае, если вы настаиваете на прокате с ним:

OpenSSL не имеет функции, которая возвращает размер блока для данного шифра. Однако вам это здесь также не нужно, потому что openssl_encrypt применяет PKCS # 7 по умолчанию:

function encrypt(string $plaintext, string $key): string 
{
    $ciphertext = openssl_encrypt($plaintext, 'des-ede3-ecb', $key, OPENSSL_RAW_DATA);
    return base64_encode($ciphertext);
}

function decrypt(string $ciphertext64, string $key): string 
{
    $ciphertext = base64_decode($ciphertext64)
    $plaintext = openssl_decrypt($ciphertext, 'des-ede3-ecb', $key, OPENSSL_RAW_DATA);
    return $plaintext;
}
0 голосов
/ 28 мая 2019

Вы используете ECB с заполнением PKCS # 5/7 (явно не упоминается, но это заполнение, которое применяется вручную). Этот отступ является значением по умолчанию для OpenSSL, поэтому вам просто нужно использовать 'des-ede3' без OPENSSL_RAW_DATA и OPENSSL_ZERO_PADDING в качестве параметров.

Единственная другая проблема, которую я вижу, это если ключ слишком маленький или большой. В этом случае библиотека mcrypt будет заполняться нулевыми байтами или сокращать самые правые байты. Поэтому вам может потребоваться сделать это самостоятельно, если шифрование / дешифрование не удастся.

Удачи, и постарайтесь отойти от этого ужасного протокола и кода как можно скорее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...