#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