在 C++ 中的随机字节生成器中重复值

Repeating values for in a random bytes generator in c++

我已经为 CBC 模式 AES 实现的初始化向量制作了一个随机字节生成器,

#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() 的 on Stack 解决方案,但这似乎只适用于 rand().

对此有任何解决方案,还有更好的方法来生成随机数以生成不可预测的初始化向量。

您需要为引擎设置种子,否则将使用默认种子,每次都会为您提供相同的序列。这与 srandrand 的用法相同。

尝试:

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

Error C2338: invalid template argument for independent_bits_engine: N4659 29.6.1.1 [rand.req.genl]/1f requires one of unsigned short, unsigned int, unsigned long, or unsigned long long

Error C2338 note: char, signed char, unsigned char, int8_t, and uint8_t are not allowed

你不能在 independent_bits_engine 中使用 uint8_t,至少在 Visual Studio 2017 年是这样。我不知道你在哪里以及如何编译它。

正如答案 所暗示的那样,为引擎播种是获取随机值的重要部分。 rand().

也一样 使用 rand().

需要

srand(time(nullptr)); 来获取随机值

您可以使用:

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