最初に任意のバイト配列でシードするPRNG(疑似ランダム性)を探しています。
聞いたことありますか?
(paxdiabloが提案するようにXORを使用する代わりに)任意の長さのシードをハッシュすると、衝突が非常に起こりにくくなります。つまり、ハッシュ衝突の確率と同じになります。SHA1/ 2などでは、これは実際には不可能です。
次に、ハッシュシードを私のお気に入りのメルセンヌツイスターなどのまともなPRNGへの入力として使用できます。
アップデート
ここで利用可能なメルセンヌツイスターの実装は、すでに任意の長さのキーを受け入れているようです: http ://code.msdn.microsoft.com/MersenneTwister/Release/ProjectReleases.aspx?ReleaseId=529
更新2
SHA2の衝突がどれほど起こりそうにないかを分析するには、 http ://en.wikipedia.org/wiki/SHA_hash_functions#SHA-2を引用して、誰かが衝突を見つけるのにどれほど苦労しなければならないかを確認してください。
ラウンド数を減らしたSHA-2に対する2つの中間の原像攻撃があります。最初のものは、2^253.5の時間計算量と2^16のスペース複雑さで64ラウンドのうち41ラウンドのSHA-256を攻撃し、時間2^511.5とスペース2^3で80ラウンドのうち46ラウンドのSHA-512を攻撃します。 。2つ目は、時間計算量2^251.7と空間計算量2^12の42ラウンドSHA-256と、時間計算量2^502と空間2^22の42ラウンドSHA-512を攻撃します。
任意のシーケンスを適切な長さのタイプにXORしてみませんか(必要に応じて、それ自体の一部をパディングします)。たとえば、シード「paxdiablo」が必要で、PRNGに4バイトのシードがある場合:
paxd 0x70617864
iabl 0x6961626c
opax 0x6f706178
----------
0x76707b70 or 0x707b7076 (Intel-endian).
シードが人工的に見えることを私は知っています(そしてそれはキーがアルファ文字から選択されているためです)。フレーズが同様の範囲から来る可能性が高い場所を本当に区別したい場合は、0xdeadbeef
または0xa55a1248
:のような微分器を使用して再度XORします。
paxd 0x70617864 0x70617864
iabl 0x6961626c 0x6961626c
opax 0x6f706178 0x6f706178
0xdeadbeef 0xa55a1248
---------- ----------
0xa8ddc59f 0xd32a6938
2番目のバイトは、類似したバイトを異なる範囲に移動しやすくなるため、2番目の方が好きです(微分器のバイトの上位ビットは異なる)。