編集する質問をより具体的にするには:
プログラムは、/dev/urandom
クラウドのUbuntu LTS VMで少なくとも1 MB /秒の速度で暗号化が強力な高品質の乱数を読み取ることができますか?それとも考慮すべきトラップはありますか?
オリジナル:
複数の条件を満たしながら乱数を提供するコンポーネントを作成する必要があります。
- 統計的に独立して直線的に分布した数値を生成し、業界標準の統計ランダム性テストに合格する必要があります。
- アルゴリズムは「暗号的に強力」と見なされるべきです。
- 十分に速くなければなりません。
- ターゲットシステムは、クラウドに仮想化されたUbuntu LTSです。
/dev/urandom
物理(ハードウェア)RNG(例:これ)またはCSPRNGコードを書いてください。私が収集した情報(下記参照)によると、これが有効なアプローチであるようですが、欠けているものがないことを確認したいと思います。
~によるとLinux乱数ジェネレータの文書化と分析セクション8.2:
テストの結果、/dev/randomとdev/urandomの乱数を生成する出力関数が、理想的な乱数ジェネレータの特性を表すデータを生成することがわかりました。したがって、乱数のエントロピーを減らす実装エラーは見つかりませんでした。
これは最初の要件を満たすようです。Wikipediaに引用された情報によると、Linuxカーネルは以下を使用します。正確に20データを生成するアルゴリズムは
/dev/urandom
次から始まります。バージョン 4.8。このアルゴリズムは一般に「暗号的に安全な」と見なされます。
これは2番目の要件を満たすようです。利用可能なUbuntuシステムはありませんが、
{ timeout --foreground 1s cat /dev/urandom; } | wc -c
M1 Macで動作していますが、約200 MB / sと報告されていますが、これは私の要件に十分速いです。同じように実行オンライン2.5倍速くなりました。
小さなC ++プログラムは、read()
40 KBのバッファを繰り返し埋めるために低レベルの呼び出しを使用して/dev/urandom
約1 GB / sの速度を達成しました。getrandom()
Macではテストできませんでしたが、Gotboltで素早くチェックすると、どちらの方法も同じバッファサイズでほぼ同じパフォーマンスを発揮することがわかりました。
これは3番目の要件を満たすようです。これ記事これは、速度の向上がカーネルバージョン5.17(および5.18の追加の改善)で行われたことを示しています。これはすでにUbuntu 22.04.2LTS(カーネルバージョン5.19を使用)にあることを意味します。
私が逃した注意がありますか?