byte[] p = ASCIIEncoding.ASCII.GetBytes(password);
byte[] p = new Byte[8]
我需要定义数组的大小并同时保留第一行代码。 我写这两个时都会出错,因为p数组定义了两次。我怎么能这样做?
这是整个代码
public string hasher(string password, string id)
{
try
{
byte[] p = ASCIIEncoding.ASCII.GetBytes(password);
byte[] a6 = ASCIIEncoding.ASCII.GetBytes(id);
byte totVector = 0;
for (int i = 0; i < 8; i++)
{
totVector = (byte)(totVector + p[i]);
}
byte[] a_concat = new byte[2];
a_concat[0] = (byte)((p[6] * totVector) % 256);
a_concat[1] = (byte)((p[7] * totVector) % 256);
byte[] a = new byte[8];
for (int i = 0; i < 6; i++)
{
a[i] = a6[i];
}
a[6] = a_concat[0];
a[7] = a_concat[1];
byte[] h = new byte[8];
string hashedUserPassword = "";
for (int i = 0; i < 8; i++)
{
if (i == 0 || i == 2) h[i] = (byte)((p[i] << 1) ^ a[i]);
else if (i == 3 || i == 5) h[i] = (byte)((p[i] >> 2) ^ a[i]);
else h[i] = (byte)(p[i] ^ a[i]);
hashedUserPassword += h[i].ToString("X2");
}
return hashedUserPassword;
}
catch
{
return "error";
}
}
答案 0 :(得分:2)
主要问题就在这里:
for (int i = 0; i < 8; i++)
{
totVector = (byte)(totVector + p[i]);
}
最简单的解决方法是,如果阵列没有那么多项,则不要尝试进行8次迭代。所以先计算长度:
int len = Math.Min(p.Length, 8); // limit to no more than the length
for (int i = 0; i < len; i++)
{
totVector = (byte)(totVector + p[i]);
}
答案 1 :(得分:0)
当您将字符串编码为ASCII
时,这是有道理的。
byte[] p = ASCIIEncoding.ASCII.GetBytes(
password.Substring(0, password.Length > 8 ? 8 : password.Length));
答案 2 :(得分:0)
我将从几个问题开始......
password
是你可以这样做:
byte[] p = ASCIIEncoding.ASCII.GetBytes(String.Format("{0,-8}",password));
如果小于8个字符,则会将password
截断为8个字符,并使用空格填充尾垫。