1

可変長の文字列から固定長のバイトシーケンスを作成したい。これをアーカイブする最良の方法は何ですか。すべてのバイトはできるだけ異なる必要があります。

コードは私自身の研究に使用されており、生産的なものではありません。

これは、バイトを生成するための私の最初のアプローチです。

static byte[] GenerateBytes(string password, Int32 strength)
{
    Byte[] result = new byte[strength];
    Byte[] pwBytes = Encoding.ASCII.GetBytes(password);
    Int32 prime = GetLowerPrime(pwBytes.Length);
    
    // Offset count to avoid values
    Int32 count = prime;
    Int32 sum = 0;
    for (int i = 0; i < result.Length; i++) {
        sum += (result[i] = pwBytes[(count++ % pwBytes.Length)]);
    }
    
    count += prime;
    Int32 pcount = prime;
    for (int i = 0; i < result.Length * 7; i++) {
        result[(i % result.Length)] ^= (Byte)(pwBytes[(count++ % pwBytes.Length)] ^ ((pcount += pwBytes[(count % pwBytes.Length)]) % 255));
    }
    
    return result;
}

そして、256 / 128 / 64 生成されたバイトでいくつかのサンプルを生成し、一意のバイトをカウントしました。

Password "Short":                170  103  60
Password "LongerX":              173  101  55
Password "Really Long":          169  100  57
Password "Unbelivable Safe!0§$": 162  101  56
Password "MCV":                  119  113  61
Password "AAA":                  50   51   50
Password "BBB":                  67   67   52
Password "AAAAAA":               48   48   48

プライムセレクターを少し変更してみました。これにより、短いキーでの生成が改善されますが、長いキーには部分的に影響があります。また、バイトの統計をいくつか追跡しました。生成され、各バイト値は 9 ~ 30 回使用されます。

結果についてどう思いますか?バイトの生成を改善するにはどうすればよいですか?

4

2 に答える 2

2

あなたは車輪を再発明しているようです。パスワードからキーを作成する必要がある場合は、ハッシュ関数を使用するか、標準のパスワードベースのキー派生関数の 1 つを使用するのが最善の方法です。PBKDF2 を検索します。

于 2012-11-08T16:47:23.930 に答える
2

理論的な関心以外に実際の実用的な用途がない独自のソリューションを本当に展開したい場合は (これは宿題の質問のように聞こえるため)、ランダムなバイトの 1 回限りのパッドから始めて、最初の数バイトで pwd を XOR します。バイト、短い pwd に対してかなり高いエントロピーが得られるはずです。

于 2012-11-08T16:52:39.927 に答える