在c ++

时间:2018-05-25 13:02:08

标签: c++11 random byte aes cbc-mode

我为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以生成不可预测的初始化向量。

2 个答案:

答案 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)

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

尝试:

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