在 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()
.
对此有任何解决方案,还有更好的方法来生成随机数以生成不可预测的初始化向量。
您需要为引擎设置种子,否则将使用默认种子,每次都会为您提供相同的序列。这与 srand
和 rand
的用法相同。
尝试:
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
我已经为 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()
.
对此有任何解决方案,还有更好的方法来生成随机数以生成不可预测的初始化向量。
您需要为引擎设置种子,否则将使用默认种子,每次都会为您提供相同的序列。这与 srand
和 rand
的用法相同。
尝试:
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