8

組み込み Linux システムの /dev/random デバイスのエントロピー プールに追加したいノイズを生成するデバイスがあります。

/dev/randomの man ページを読んでいますが、RNDADDENTROPY ioctl 呼び出しに渡す構造がよくわかりません。

   RNDADDENTROPY
          Add some additional entropy to the input pool, incrementing
          the entropy count.  This differs from writing to /dev/random
          or /dev/urandom, which only adds some data but does not
          increment the entropy count.  The following structure is used:

              struct rand_pool_info {
                  int    entropy_count;
                  int    buf_size;
                  __u32  buf[0];
              };

          Here entropy_count is the value added to (or subtracted from)
          the entropy count, and buf is the buffer of size buf_size
          which gets added to the entropy pool.

この構造にはentropy_count、追加するビット数がありますか? これが常にそうではないのはなぜですか(バイト単位であるとbuf_size * 8仮定して)?buf_size

さらに、bufサイズがゼロの配列はなぜですか? それに値を割り当てるにはどうすればよいですか?

ここで助けてくれてありがとう!

4

3 に答える 3

4

エントロピー プールのストックにハードウェア RNG を使用しています。私の構造体は静的なサイズで、次のようになります (私のカーネルの random.h は少し異なります。自分の構造体で見つけたものをコピーして、配列のサイズを好きなだけ増やしてください)。

#define BUFSIZE 256
/* WARNING - this struct must match random.h's struct rand_pool_info */
typedef struct {
    int bit_count;               /* number of bits of entropy in data */
    int byte_count;              /* number of bytes of data in array */
    unsigned char buf[BUFSIZ];
} entropy_t;

buf に渡すものは何でもハッシュされ、エントロピープールをかき混ぜます。/dev/urandom を使用している場合、bit_count に何を渡すかは問題ではありません。/dev/urandom は bit_count がゼロであることを無視し、処理を続行するためです。

bit_count が行うことは、/dev/random がブロックするポイントを押し出し、何かが物理 RNG ソースからさらにエントロピーを追加するのを待つことです。したがって、bit_count を推測しても問題ありません。低いと推測すると、最悪の場合、/dev/random がそうでない場合よりも早くブロックされることになります。高いと推測した場合、/dev/random は、ブロックする前に、そうでない場合よりも少し長く /dev/urandom のように動作します。

エントロピーソースの「品質」に基づいて推測できます。人間が入力する文字のように少ない場合は、1 バイトあたり 1 または 2 に設定できます。専用ハードウェア RNG から読み取った値のように高い場合は、1 バイトあたり 8 ビットに設定できます。

于 2013-09-21T01:07:15.227 に答える
1

データが完全にランダムである場合、entropy_count提供するバッファ内のビット数が適切であると思います。ただし、ランダム性の多くの (ほとんどの?) ソースは完全ではないため、バッファ サイズとエントロピーの量を個別のパラメータとして保持することは理にかなっています。

bufサイズがゼロであると宣言されることは、標準の C イディオムです。取引は、実際に a を割り当てるときにrand_pool_infoを行い、次にメンバーmalloc(sizeof(rand_pool_info) + size_of_desired_buf)を使用してバッファーを参照するということです。buf注:一部のC コンパイラでは、実際には「伸縮性がある」ことを明示的に宣言するbuf[*]代わりに宣言できます。buf[0]buf

于 2013-06-15T00:47:09.540 に答える
0

バッファ内のバイト数はデータのエントロピーに相関しますが、エントロピーはそのデータまたはその長さだけから計算することはできません。

確かに、データが優れた、予測不可能で均等に分散されたハードウェア ランダム ノイズ ジェネレーターからのものである場合、エントロピー (ビット単位) はバッファーのサイズ (バイト単位) の 8 倍になります。

しかし、ビットが均等に分散されていないか、何らかの形で予測可能である場合、エントロピーは小さくなります。

https://en.wikipedia.org/wiki/Entropy_(information_theory)を参照してください。

それが役立つことを願っています。

于 2016-10-03T09:58:12.807 に答える