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

你似乎在重新发明轮子。如果您需要从密码中生成密钥,请使用散列函数,或者,最好的方法 - 标准的基于密码的密钥派生函数之一。搜索 PBKDF2。

于 2012-11-08T16:47:23.930 回答
2

好吧,如果您真的想推出自己的解决方案,除了理论兴趣之外没有真正的实际用途,(因为这听起来像一个家庭作业问题)只需从一次性填充随机字节开始,然后将 pwd 与前几个 XOR字节,应该为短密码提供相当高的熵。

于 2012-11-08T16:52:39.927 回答