2016-08-12 9 views
2

C++では、random_deviceを使って真の乱数(ハードウェアがサポートしている場合)を生成することができます。私はCでOne-time Padアルゴリズムの実装を書いています.Cで本当の乱数を生成する方法はありますか?スピードといくつかの理由で私はCで書いています。私がPRNGを使用すると、安全ではありません。Cでrandom_device相当のものがあります

char *KeyGenerate(unsigned long long StringLength) 
{ 
    std::random_device TrueRandomNumberGenerator; 
    char *Key = (char *) malloc(StringLength + 1); 

    for(unsigned long long I = 0; I < StringLength; I++) 
    { 
     Key[I] = TrueRandomNumberGenerator(); 
    } 
    Key[StringLength] = '\0'; 

    return Key; 
} 
+0

'arc4random'(利用可能な場合)は、暗号的に安全な乱数を生成します。 – user3386109

+0

Linuxでは、 '/ dev/random'に多かれ少なかれ実際の"ランダムデバイス "を読み込むことができます。 – PSkocik

+0

実際には、/ dev/randomの代わりに/ dev/urandomを使用することをお勧めします:http://stackoverflow.com/a/3709644/90511 – hugomg

答えて

3

C標準ライブラリは非常に非常に小さいです。真の乱数を取得するには、OS固有のAPIを使用する必要があります。

Linuxシステムでは、/dev/urandomファイルから暗号強度の強いランダムなストリームのストリームを取得できます。

+0

もっとポータブルな方法がありますか? –

+2

/dev/urandomはBSDとMacOSでも動作します。あなたのコードがウィンドウ上で動作する必要があるなら、あなたは乱数以外の多くの問題があると思います。移植性のためにライブラリを使用していますか? – hugomg

+0

実際はコンソールアプリケーションだけです。私は標準のCライブラリのみを使用します。 Windowsは問題ではありません。 –

0

CはPRNG(擬似乱数ジェネレータ)を使用しているため、真の乱数を実際に得ることはできません。

あなたのコードは、ランダムな数字の束を生成しているので、あなたは単に可能性:

srand(time(NULL)); 
int r = rand(); 

srand(time(NULL));

は、forループの上に行くところ。あなたが一度シードしてから乱数を生成するこの方法では、

+1

rand()関数は、予測可能な乱数を生成します。 OPは、暗号安全に安全な乱数を求めていると具体的に言いました。 – hugomg

+0

私はこの答えにとても不満です。真の乱数*を得るよう求められたが、これは完全に失敗する(この文脈では危険である)。 (私もupvotesを理解することはできません) – sascha

+0

@サスカOPはあなたがCで本当の乱数を生成することができるかと尋ねました。彼のポストのなかには、暗号的に安全な乱数については触れられていませんでした。 – FreeStyle4

1

のように、/dev/urandomを読む必要があります。 Windows上での代替これはPythonで行われているものであるCryptGenRandom

使用することです、私は信じている - APIは、Linux上の/dev/urandomベースのコードを呼び出しますが、Windows上でCryptGenRandom

OS Xについて十分にわかりません