bugfix> c++11 > 投稿

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() でのみ機能するようです 。

これに対する解決策は、予測不可能な初期化ベクトルを生成するためのノンスを生成するより良い方法もあります。

回答 2 件
  • 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

    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
    
    

  • エンジンをシードする必要があります。そうしないと、デフォルトのシードが使用され、毎回同じシーケンスが提供されます。これは srand の使用法と同じです  および rand

    試してください:

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

あなたの答え