random_bytes_engine генерирует один и тот же ключ снова и снова

#c

Вопрос:

По какой-то причине функция ниже продолжает генерировать один и тот же ключ снова и снова, несмотря ни на что. Почему это происходит? Как я могу это решить?

 uint8_t key[32];
encryption::generate_random_key(key);

...

template <size_t N>
void generate_random_key(uint8_t(amp;iv_buff)[N])
{
    using random_bytes_engine = std::independent_bits_engine<std::default_random_engine, CHAR_BIT, size_t>;
    random_bytes_engine rbe;

    std::generate(std::begin(iv_buff), std::end(iv_buff), [amp;rbe]() {
        return static_cast<uint8_t>(rbe());
    });
}
 

Комментарии:

1. Не std::string было бы здесь лучшего контейнера? Или, по крайней мере std::vector<uint8_t> ?

2. Вы не заполняете свой движок, поэтому он всегда создается с одним и тем же состоянием по умолчанию.

3. Создавать псевдоним для «движка случайных байтов» и использовать его один раз действительно бессмысленно.

4. Похоже, что так, я открыт для рекомендаций.

5. Как мне запустить двигатель?

Ответ №1:

Вы не запускаете движок, и он каждый раз выдает вам одно и то же из состояния по умолчанию. Однако для генерации ключа шифрования лучше использовать исключительно std::random_device или любую специализированную функцию из библиотек, таких как OpenSSL. В противном случае, если вас устраивает ключ, сгенерированный из псевдослучайных байтов, используйте std::random_device для генерации начального значения для генератора псевдослучайных байтов (например std::mt19937 ).

Комментарии:

1. Не могли бы вы написать с его помощью пример?

2. @nop Вы пробовали посмотреть документацию или какие-либо примеры?

3. @super, да, и я не знаю, как использовать его с std::generate, потому что мне нужно, чтобы я вернул ссылку на ключ после этого.

4. @nop В вашем использовании нет ничего плохого std::genereate . Вы просто не высеваете энгинг, как указано в комментариях и в этом ответе. Ссылка, которую я вам дал, ясно показывает, что вы можете запустить движок, передав значение конструктору или используя rbe.seed . Также любой пример, который вы найдете в Интернете, скажет вам об этом.

5. error C2039: 'generate': is not a member of 'std::random_device' pastebin.com/3KJ9rnxs