2012-11-03 2 views
1

: http://wiki.theory.org/BitTorrentSpecification잘못된 info_hash (자바 비트 토런트 클라이언트)

info_hash는 다음 메타 정보 파일에서 정보를 키 값의 20 바이트 SHA1 해시를 urlencoded를. 위의 정보 키의 정의가 주어지면 값은 bencoded 사전이됩니다.

토런트 맵은 다른 사전 인 "정보"키를 얻습니다. 해시를 계산하고 URL 인코딩합니다. 하지만 트래커에 보내려고 할 때 항상 잘못된 info_hash 메시지가 표시됩니다.

out = new ObjectOutputStream(bos); 
out.writeObject(torrentMap.get("info")); 

뭘 해싱 될거야 것은 값의 자바 바이너리 직렬화 형식입니다 :

public String GetInfo_hash() { 
    String info_hash = ""; 

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ObjectOutput out = null; 
    try { 
     out = new ObjectOutputStream(bos); 
     out.writeObject(torrentMap.get("info")); 
     byte[] bytes = bos.toByteArray();  //Map => byte[] 

     MessageDigest md = MessageDigest.getInstance("SHA1"); 
     info_hash = urlencode(md.digest(bytes)); //Hashing and URLEncoding 

     out.close(); 
     bos.close(); 

    } catch (Exception ex) {  } 

    return info_hash; 
} 

private String urlencode(byte[] bs) { 
    StringBuffer sb = new StringBuffer(bs.length * 3); 
    for (int i = 0; i < bs.length; i++) { 
     int c = bs[i] & 0xFF; 
     sb.append('%'); 
     if (c < 16) { 
      sb.append('0'); 
     } 
     sb.append(Integer.toHexString(c)); 
    } 
    return sb.toString(); 
} 

답변

0

이 거의 확실히 문제 :

내 코드입니다 torrentMap.get("info"). 나는 모든 BitTorrent 프로그램이 그것을 알기위한 것이라고 믿는 것을 매우 어렵게 느낀다.

사양에서 "정보"키의 가치를 알기는 어렵지만 바이트 배열로 바꾸는 다른 방법을 찾아야합니다. 문자열이라면 잘 지정된 인코딩 (예 : UTF-8)을 기대할 수 있습니다. 이미 이진 데이터 인 경우 해당 바이트 배열을 직접 사용하십시오.

EDIT : 실제로는 값이 "bencoded dictionary"가 될 것 같습니다. 귀하의 견적에 따라 문자열로 보입니다. 문자열을 해독하기 전에 (예를 들어, ASCII가 아닌 값을 포함하는 것처럼 들릴 수 있습니다.) 해싱하기 전에 문자열을 인코딩 할 의도가 있습니다. 샘플 문자열이 모두 ASCII 인 경우 String.getBytes(...)의 인코딩 이름으로 "ASCII"와 "UTF-8"을 사용하면 어쨌든 동일한 결과를 얻을 수 있습니다 ...

+0

** torrentMap.get ("info") **는 Object를 반환하고 HashMap에 캐스팅 할 수 있습니다. 당신이 말한대로 내가 방법을 변경 : ** 반환 urlencode (torrentMap.get ("info"). toString(). getBytes (Charset.forName ("UTF-8"))); **하지만 여전히 제공 나 뭔가 잘못 됐어. ( – Simone

+0

@ Simone : 글쎄, * HashMap이라면, 문자열을 bencoding 형식으로 가져와야한다. 왜냐하면 그것이 해시 될 것이기 때문이다. 자신의 BT API를 처음부터 수정하거나 기존 API를 적용 할 수 있습니다. * 그러나 * bencoding 지원이 필요합니다. –

+0

Snark 클라이언트를 다운로드하고 모든 것을 해결했습니다. ^^ – Simone

관련 문제