スマートフォンで真の乱数/ビットを生成する方法を探しています。
カスタム TRNG を作成するのは難しいようで、多くの人が、広くテストされ、承認されている既存の TRNG を信頼することを提案しています。
しかし、写真からのカスタム TRNG を入力として使用するJericho Commsを見つけました。
これはどれほど安全で、強力で、信頼できるでしょうか? 本当に乱数/ビットを生成する有効な方法でしょうか?
スマートフォンのカメラは、JPEG 圧縮と低品質のため、この目的には最適ではないことはわかっていますが、これを省略した場合、提案されたアルゴリズムはどの程度正しいのでしょうか?
ドキュメントを貼り付けます:
このプロセスでは、完全なアルゴリズムについて説明します。
ユーザーの写真をメモリに読み込み、RGB 値の連続配列に保存します。 各ピクセルの赤、緑、青 (RGB) の整数値を取得します。これは、各色に対して 0 から 255 までの数値を返します。 連続して繰り返される黒 (0, 0, 0) ピクセル、白 (255, 255, 255) ピクセル、およびまったく同じピクセル色を削除します。これにより、露出不足のピクセル、露出過度のピクセル、およびエントロピーがほとんどない写真のセクションが削除されます。通常、ハードウェアに障害が発生したり、写真の一部が露出不足/露出過剰でない限り、隣接するピクセルがまったく同じ色になることは非常にまれです。通常、高品質の写真では、隣接するピクセルに少なくとも非常にわずかな色の変化があります。この手順により、これらの低エントロピー領域が削除されます。 RGB 値のセットごとに 1 ビットの入力エントロピーを推定します (24 ビット ピクセルごとに 1 ビット)。これは非常に控えめな見積もりです。ユーザーは、TRNG 設定でこれをピクセルあたり 3 ビットに増やすことができます。これにより、各色の最下位ビットのエントロピーが考慮されます。 512 個の RGB 値を収集して、512 ビットの推定エントロピー入力を取得します。 512 個の RGB 値を 16 進数表現に変換し、512 ビット出力で暗号化ハッシュに入力します。ユーザーは使用するハッシュを選択でき、プログラムは Skein または Keccak [c=2d] のいずれかを許可します。どちらも、NIST ハッシュ関数コンペティションの非常に強力なファイナリスト アルゴリズムです。この 512 ビットのハッシュ出力を一時シードとして次のハッシュに格納します。 ループを開始します。
- 新しいハッシュに十分な新しい入力エントロピーがあることを確認するか、ループから抜け出します。
- 以前から一時的なシードを取得します。
- 新しい入力エントロピーとして 512 個の RGB 値 (512 ビット) の新しいセットを取得します。
- シードと入力エントロピーを連結し、ハッシュ (シード || 入力エントロピー) を使用してそれらをハッシュします。
- ハッシュ出力の最初の 256 ビットを出力ランダム データに追加します。
- ハッシュ出力の最後の 256 ビットになるように一時シードを更新します。
- ループの先頭に戻ります。
プログラムは、この収集されたエントロピーを使用して疑似乱数ジェネレーターをシードし、無制限の量の乱数データを提供しないことに注意することが重要です。このプログラムは、真の乱数ジェネレーターになることを目指しているため、高品質のランダム性のみが必要であり、一様にランダムな各ビットは、平文の 1 ビットを暗号化するためだけに使用する必要があります。エントロピーを拡張するほとんどの疑似乱数ジェネレーターまたは CSPRNG でさえ、出力に微妙なバイアスを生じさせ、NSA または他の政府がメッセージの一部またはすべてを解読できるようになると想定されています。このプログラムの目的は、利用可能なエントロピーをより多くのビットに拡張することを避けることです。