[解決済み] C言語で/dev/randomやurandomを使用するには?
質問
私は
/dev/random
または
/dev/urandom
をCで処理するにはどうしたらいいのでしょうか?C言語でどのように処理すればいいのかわかりません。もし知っている人がいれば教えてください。ありがとうございます。
どのように解決するのですか?
一般に、ランダムなデータを取得するためにファイルを開くことは避けたほうがよいでしょう。
最近のLinuxディストリビューションでは
getrandom
システムコールを使って暗号化された乱数を取得することができ、失敗することはありません。
もし
GRND_RANDOM
は
ではない
がフラグとして指定されておらず、読み出し量が最大256バイトであること。
2017年10月現在、OpenBSD、Darwin、Linux(で
-lbsd
) の実装をすべて持つようになりました。
arc4random
を実装することができるようになりました。そのため、非常に魅力的な選択肢となっています。
char myRandomData[50];
arc4random_buf(myRandomData, sizeof myRandomData); // done!
そうでなければ、ランダムデバイスをファイルのように使用することができます。そこから読み込むと、ランダムなデータが得られます。私が使っている
open
/
read
ここで、しかし
fopen
/
fread
も同じように動作します。
int randomData = open("/dev/urandom", O_RDONLY);
if (randomData < 0)
{
// something went wrong
}
else
{
char myRandomData[50];
ssize_t result = read(randomData, myRandomData, sizeof myRandomData);
if (result < 0)
{
// something went wrong
}
}
ファイルディスクリプタを閉じる前に、さらに多くのランダムバイトを読み込むことができます。システムコールがシグナルによって中断されない限り、/dev/urandom は決してブロックせず、常に要求されただけのバイトを埋めます。これは暗号学的に安全であると考えられており、あなたが使用するランダムデバイスであるべきです。
/dev/random はより繊細です。ほとんどのプラットフォームでは、要求されたよりも少ないバイト数で返すことができ、十分なバイト数がない場合はブロックされることがあります。これは、エラー処理をより複雑にしています。
int randomData = open("/dev/random", O_RDONLY);
if (randomData < 0)
{
// something went wrong
}
else
{
char myRandomData[50];
size_t randomDataLen = 0;
while (randomDataLen < sizeof myRandomData)
{
ssize_t result = read(randomData, myRandomData + randomDataLen, (sizeof myRandomData) - randomDataLen);
if (result < 0)
{
// something went wrong
}
randomDataLen += result;
}
close(randomData);
}
関連
-
警告:代入がキャストなしで整数からポインタを作成する場合の修正方法に関する警告
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] JavaScriptでランダムな文字列/文字を生成する
-
[解決済み] JavaScriptで特定の範囲のランダムな整数を生成する?
-
[解決済み] 乱数(int)を生成する方法を教えてください。
-
[解決済み] JavaScriptで2つの数値の間の乱数を生成する
-
[解決済み] 英数字のランダムな文字列を生成する方法
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
initializer element is not constant "というエラーが表示されるのですが?
-
[解決済み] MIPSのネストされたForループと配列の使用
-
[解決済み] Linux Socket write() によるBad File Descriptor C
-
[解決済み] CコードでEOFを表現する?
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] C関数から文字列を返す
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?