2009-12-06 11 views
0

Fondamentalement, je construis un petit outil de suivi à des fins expérimentales. Je suis allé assez loin, et je travaille maintenant sur la partie d'annonce.Calcul info_hash de chaîne de requête urlencoded

Ce que je ne peux vraiment pas comprendre comment je dois décoder la chaîne de requête info_hash fournie.

De la spécification, il est un urlencoded SHA1 de 20 octets hachage, qui m'a fait écrire ce code,

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

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

Ce qui donne 'temp' la valeur suivante,

5D3F3F3F3F5E3F3F3F153FE4033683F55693468 

Les premiers et derniers caractères sont corrects. Ceci est la première info_hash,

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

Et voici ce à la fois uTorrent et mon propre tracker me donne comme info_hash lors de sa génération à partir du fichier torrent,

5D96B6F6845EEADAC515C40E403368B955693468 

Qu'est-ce que je fais mal?

Répondre

0

urldecode retourne une chaîne, mais un hachage SHA1 n'a pas de sens si elle est interprétée comme une chaîne (ANSI).
Vous devez décoder la chaîne d'entrée directement à un tableau d'octets, sans aller-retour à une chaîne.

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" 
+0

Merci! L'exemple fonctionne comme un charme, bien que lors du remplacement de la chaîne codée en dur avec la chaîne de requête info_hash, il obtient tout foiré. var s = context.Request.QueryString ["info_hash"] Donne-moi une chaîne de charabia, pas la valeur de chaîne de la chaîne de requête. – Viktor

+0

Jamais l'esprit, je suis allé avec la route context.Request.Query à la place. Je suppose que je vais devoir l'analyser à partir de là. Je vous remercie! – Viktor