从UrlEncoded查询字符串计算info_hash

时间:2009-12-06 16:32:17

标签: c# tracker info-hash

基本上,我正在构建一个用于实验目的的小型跟踪器。我已经走得很远了,现在正在宣布宣布部分。

我真正想知道的是我应该如何解码所提供的info_hash查询字符串。

从规范来看,它是一个 urlencoded 20字节SHA1哈希,这使我编写了这段代码,

byte[] foo = Encoding.Default.GetBytes(HttpUtility.UrlDecode(infoHash));
string temp = "";

foreach (byte b in foo)
{
    temp += b.ToString("X");
}

为'temp'提供以下值,

5D3F3F3F3F5E3F3F3F153FE4033683F55693468

第一个和最后几个字符是正确的。这是原始的info_hash,

%5d%96%b6%f6%84%5e%ea%da%c5%15%c4%0e%403h%b9Ui4h

这就是uTorrent和我自己的跟踪器在从torrent文件生成时为我提供info_hash的内容,

5D96B6F6845EEADAC515C40E403368B955693468

我做错了什么?

2 个答案:

答案 0 :(得分:0)

UrlDecode返回一个字符串,但如果解释为(ANSI)字符串,则SHA1哈希没有意义 您需要将输入字符串直接解码为字节数组,而不是将字符串转换为字符串。

var s = "%5d%96%b6%f6%84%5e%ea%da%c5%15%c4%0e%403h%b9Ui4h";

var ms = new MemoryStream();
for (var i = 0; i < s.Length; i++)
{
    if (s[i] == '%')
    {
        ms.WriteByte(
            byte.Parse(s.Substring(i + 1, 2), NumberStyles.AllowHexSpecifier));
        i += 2;
    }
    else if (s[i] < 128)
    {
        ms.WriteByte((byte)s[i]);
    }
}

byte[] infoHash = ms.ToArray();
string temp = BitConverter.ToString(infoHash);
// "5D-96-B6-F6-84-5E-EA-DA-C5-15-C4-0E-40-33-68-B9-55-69-34-68"

答案 1 :(得分:0)