Повторяющиеся значения для генератора случайных байтов в c ++ - PullRequest
0 голосов
/ 25 мая 2018

Я сделал генератор случайных байтов для вектора инициализации реализации AES в режиме CBC,

#include <iostream>
#include <random>
#include <climits>
#include <algorithm>
#include <functional>
#include <stdio.h>

using bytes_randomizer =    std::independent_bits_engine<std::default_random_engine, CHAR_BIT, uint8_t>;

int main()
{
bytes_randomizer br;
char x[3];
uint8_t data[100];
std::generate(std::begin(data), std::end(data), std::ref(br));

for(int i = 0; i < 100; i++)
{
    sprintf(x, "%x", data[i]);
    std::cout << x << "\n";
}
}

Но проблема в том, что он дает одну и ту же последовательность снова и снова, я нашел решение для стека, котороеиспользовать srand(), но это, кажется, работает только для rand().

Любые решения для этого, также есть лучший способ генерировать nonce для генерации непредсказуемого вектора инициализации.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Ошибка C2338: недопустимый аргумент шаблона для independent_bits_engine: N4659 29.6.1.1 [rand.req.genl] / 1f требует одно из следующих: unsigned short, unsigned int, unsigned long или unsigned long long

Примечание об ошибке C2338: char, подписанный char, unsigned char, int8_t и uint8_t не допускаются

Вы не можете использовать uint8_t в independent_bits_engine, по крайней мере, в Visual Studio 2017. Я неНе знаю, где и как вам удалось его скомпилировать.

Как показывает ответ DeiDei , заполнение движка является важной частью для получения случайных значений.То же самое с rand().

srand(time(nullptr)); требуется для получения случайных значений с помощью rand().

. Вы можете использовать:

using bytes_randomizer = std::independent_bits_engine<std::default_random_engine, CHAR_BIT, unsigned long>;

std::random_device rd;
bytes_randomizer br(rd());

Некоторые примерывывод:

25
94
bd
6d
6c
a4
0 голосов
/ 25 мая 2018

Вам нужно запустить двигатель, иначе будет использовано начальное число по умолчанию, которое каждый раз будет давать вам одну и ту же последовательность.Это то же самое, что и использование srand и rand.

Попробуйте:

std::random_device rd;
bytes_randomizer br(rd());
...