2017-11-10 7 views
0

標準のANSI CランタイムといくつかのPOSIX関数しかないプラットフォームにいくつかのソフトウェアを移植する必要があります。ソフトウェアは、/dev/urandomからの読み取りによって、ZIPファイルをパスワードで暗号化するための乱数を生成します。 Windowsでは、CryptGenRandom()を使用して乱数を生成します。私のターゲットプラットフォームでは両方の機能が利用できないので、代替案を見つける必要があります。/dev/urandomから非Unixプラットフォームへの移植

私はlengthランダムバイトでbufferを埋めるために、この思い付いた:

bool zip_random(zip_uint8_t *buffer, zip_uint16_t length) 
{ 
    srand(time(NULL)); 
    while(length--) *buffer++ = rand() % 256; 
    return true; 
} 

これは仕事をしていませんが、関数は暗号化コンテキストで使用されているので、それが良いアイデアだ場合、私は知りません古いsrandおよびrand機能を使用してください。だからこそ私のアプローチが受け入れられるのか、それとももっと良い解決策があるのか​​という質問をしたいのです。

+0

[This](https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful)が面白いかもしれません。 – chrk

+4

暗号化に 'srand()'と 'time()'を使うのは災害です。正しく仕事をするのは難しいでしょう。プラットフォームは何ですか?実際に利用可能なものがない場合は、EGD(エントロピー収集デーモン)などを探す必要があります。またはシュナイダーのFortuna PRNGです。自分自身を発明しようとしないでください。それはランダムではありません –

+0

@ジョナサンリーフラー:それは私が恐れている:)プラットフォームはAmigaOSですので、ここでは多くの選択肢はありません... – Andreas

答えて

0

randは、実際のセキュリティを必要とするものには使用しないでください。生成ランダムシーケンスの品質およびいくつかの実施 について何らの保証を痛ましい非ランダム下位有する配列を産生することが知られていないC11 standard

の7.22.2.1からランド約

脚注がありますビット。 のアプリケーションでは、必要に応じて十分であることがわかっているジェネレータを使用する必要があります。

+0

脚注はsrandとは関係ありません。それはランドを指す。 – user515430

+0

これをランドに変更しました。それを指摘してくれてありがとう。 – user8920414

関連する問題