我想创建一个具有固定长度的字节序列,该字符串具有可变长度的字符串。存档的最佳方式是什么?所有字节应尽可能不同。
这是我生成字节的第一种方法:
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次。
答案 0 :(得分:2)
你似乎正在重新发明轮子。如果您需要从密码中创建密钥,请使用散列函数,或者最好的方法 - 基于密码的标准密钥派生函数之一。搜索PBKDF2。
答案 1 :(得分:2)
好吧,如果你真的想要推出自己没有实际用途的解决方案,除了理论上的兴趣,(因为这听起来像是一个家庭作业问题),只需从一个随机字节的一次性填充开始,并且与pwd进行异或。前几个字节,应该为短pwds提供合理的高熵。