Как безопасно создать IV для шифрования AES CBC? - PullRequest
10 голосов
/ 02 сентября 2011

Я работаю над некоторыми криптовалютами.

  • Я использую AES 256 с режимом CBC
  • Я использую OPENSSL

Мне известно следующеевещи (источник = Википедия):

вектор инициализации должен быть:

  • Уникальный: не должен повторяться для любого сообщения, зашифрованного данным ключом
  • Непредсказуемый:злоумышленник, наблюдающий любое количество сообщений и их IV, не должен располагать информацией, чтобы предсказать следующее с вероятностью успеха более 50% на бит (т. е. неотличимо от случайного)

Мой вопрос таков:Как безопасно генерировать IV с OPENSSL и PHP?Я знаю, что в lib mcrypt есть такая функциональность (http://fr2.php.net/manual/fr/function.mcrypt-create-iv.php)

. Я ничего не нашел для этого с OPENSSL (генерирование уникального и непредсказуемого IV).

Ответы [ 3 ]

9 голосов
/ 02 сентября 2011

Используйте openssl_random_pseudo_bytes (наиболее предпочтительно, когда второй параметр установлен на существующую переменную, которую вы должны затем проверить, чтобы она была установлена ​​на TRUE).Это создаст IV с соответствующими характеристиками случайности.

$wasItSecure = false;
$iv = openssl_random_pseudo_bytes(16, $wasItSecure);
if ($wasItSecure) {
    // We're good to go!
} else {
    // Insecure result. Fail closed, do not proceed.
}

В качестве альтернативы, PHP 7 предлагает random_bytes(), что намного проще.

2 голосов
/ 23 июля 2017

Просто удобнее использовать тот же материал, что и Томас sujested:

private function genIv()
{
    $efforts = 0;
    $maxEfforts = 50;
    $wasItSecure = false;

    do
    {
        $efforts+=1;
        $iv = openssl_random_pseudo_bytes(16, $wasItSecure);
        if($efforts == $maxEfforts){
            throw new Exception('Unable to genereate secure iv.');
            break;
        }
    } while (!$wasItSecure);

    return $iv;
}
2 голосов
/ 30 июня 2015

Вы можете использовать openssl_random_pseudo_bytes (len, & crypto_stron) .

Первый параметр - это требуемая длина в байтах.Если вы используете это для использования в одном из методов open ssl, вы можете использовать функцию openssl_cipher_iv_length (method) , чтобы получить правильную длину для используемого метода.

Второй параметр,& crypto_strong, позволяет передавать логическую переменную, для которой будет установлено значение true или false, в зависимости от того, был ли используемый алгоритм криптографически безопасным.Затем вы можете проверить эту переменную и обработать ее правильно, если переменная вернется в ложь.Это никогда не должно произойти, но если это произойдет, вы, вероятно, захотите знать.

Вот пример правильного использования:

$method = 'aes-256-cbc';
$ivlen = openssl_cipher_iv_length($method);
$isCryptoStrong = false; // Will be set to true by the function if the algorithm used was cryptographically secure
$iv = openssl_random_pseudo_bytes($ivlen, $isCryptoStrong);
if(!$isCryptoStrong)
    throw new Exception("Non-cryptographically strong algorithm used for iv generation. This IV is not safe to use.");

Для получения дополнительной информации см .:

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