私はこの興味深い一口/dev/urandom
に出くわしたときよりも速い代替手段を探していました:
非常に優れた非ランダムだがほぼランダムなビットを生成するための1つの優れたトリックは、/ dev / randomのエントロピーを使用して高速対称ストリーム暗号(私のお気に入りはblowfish)をシードし、その出力をそれを必要とするアプリケーションにリダイレクトすることです。
これは初心者のテクニックではありませんが、2行または3行のシェルスクリプトといくつかのクリエイティブなパイプを使用して簡単にセットアップできます。
さらなる調査により、セキュリティに関するシュナイアーからのこのコメントが得られました。
「エントロピーを注入」する場合、それを行う方法はいくつかありますが、より良い方法の1つは、高速ストリーム暗号全体に「拡散」し、非決定論的サンプリングシステムと結合することです。
私が間違っている場合は訂正してください。ただし、ランダムビットを生成するこの方法は/dev/urandom
、速度とセキュリティの点で単純に優れているようです。
だから、これが実際のコードについての私の見解です:
time dd if=/dev/zero bs=1M count=400 | openssl bf-ofb -pass pass:`cat /dev/urandom | tr -dc [:graph:] | head -c56` > /dev/null
この速度テストは400MBのゼロを取り、疑似ランダムで印刷可能な文字で作られた448ビットのキーを使用してblowfishを使用して暗号化します。これが私のネットブックの出力です:
400+0レコードイン400+0レコードアウト419430400バイト(419 MB)コピー、14.0068秒、29.9MB/秒
実際の0m14.025sユーザー0m12.909ssys0m2.004s
それは素晴らしいことです!しかし、それはどのくらいランダムですか?結果を次の場所にパイプしてみましょうent
:
エントロピー=バイトあたり8.000000ビット。
最適な圧縮により、この419430416バイトファイルのサイズが0%削減されます。
419430416サンプルのカイ2乗分布は250.92であり、ランダムにこの値を50.00パーセント超えることがあります。
データバイトの算術平均値は127.5091(127.5 =ランダム)です。Piのモンテカルロ値は3.141204882(エラー0.01パーセント)です。シリアル相関係数は-0.000005です(完全に無相関= 0.0)。
よさそうだ。ただし、私のコードには明らかな欠陥がいくつかあります。
/dev/urandom
初期エントロピーソースに使用します。- 印刷可能な文字のみが使用されるため、キー強度は448ビットと同等ではありません。
- エントロピーを「拡散」するために、暗号を定期的に再シードする必要があります。
それで、私は自分が正しい方向に進んでいるかどうか疑問に思いました。そして、誰かがこれらの欠陥のいずれかを修正する方法を知っているなら、それは素晴らしいことです。また、、、、、またはDBAN以外の場合は、ディスクを安全にワイプするために使用するものを共有していただけ/dev/urandom
ますか?sfill
badblocks
ありがとうございました!
編集:ストリーム暗号としてblowfishを使用するようにコードを更新しました。