我为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";
}
}
但问题是它一遍又一遍地给出相同的序列,我在Stack上找到了一个使用srand()
的解决方案,但这似乎仅适用于rand()
。
对此的任何解决方案,也有更好的方法来生成nonce以生成不可预测的初始化向量。
答案 0 :(得分:1)
错误C2338:independent_bits_engine的模板参数无效:N4659 29.6.1.1 [rand.req.genl] / 1f需要unsigned short,unsigned int,unsigned long或unsigned long long之一
错误C2338注意:不允许使用char,signed char,unsigned char,int8_t和uint8_t
至少在Visual Studio 2017上,您无法在uint8_t
中使用independent_bits_engine
。我不知道您在何处以及如何编译它。
正如答案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
答案 1 :(得分:0)
您需要为引擎设定种子,否则将使用默认种子,每次都会为您提供相同的序列。这与srand
和rand
的使用情况相同。
尝试:
std::random_device rd;
bytes_randomizer br(rd());