2016-11-29 2 views
0

Я пытаюсь сгенерировать свое имя хоста tor из моего private_key с помощью python3. Я использовал этот tutorial(java) и попытался изменить его на то, что хочу, но я не могу сгенерировать свое имя хоста. Я подозреваю, что ошибка лежит где-то в разрезе на последней строке, но я не могу найти документацию об этом.генерирует вам имя хоста из вашего tor private_key с python

from Crypto.PublicKey import RSA 
from base64 import b32encode as b32 
import hashlib 

privkey= open('privkey',"r") 
#print(key.read()) 
key = RSA.importKey(privkey.read()) 
pubkey = key.publickey() 
print(b32(hashlib.sha1(pubkey.exportKey()[22:).digest()[:10])) 

также, моя цель состоит в том, чтобы сделать это так же просто и понятно, как это возможно, и this answer кажется слишком сложным для меня.

ответ

0

aye Я знаю, что этот вопрос старый, но, возможно, мой ответ принесет пользу другим людям, как я, которые пытались сделать что-то подобное и наткнулись на этот вопрос. Думаю, я понял это - я использовал часть вашего кода и код из PyShallot, и он работает для меня.

import hashlib 
from hashlib import sha1 
import rsa 
from pyasn1.type import univ, namedtype 
from pyasn1.codec.der import encoder 
from base64 import b32encode 
from Crypto.PublicKey import RSA 

class RSAPublicKey(univ.Sequence): 
    componentType = namedtype.NamedTypes(
      namedtype.NamedType('modulus', univ.Integer()), 
      namedtype.NamedType('publicExponent', univ.Integer()) 
      ) 

pubkey, privkey = rsa.newkeys(1024) 
privkey = privkey.save_pkcs1(format='PEM') 
key = RSA.importKey(privkey) 
n = key.n 
e = key.e 
public_key = RSAPublicKey() 
public_key.setComponentByName('modulus', n) 
public_key.setComponentByName('publicExponent', e) 
pubkey = encoder.encode(public_key) 
onion = b32encode(sha1(pubkey).digest())[:16].lower()+'.onion' 
print str(onion) 
print str(privkey) 

Приведенный выше код печатает луковый адрес и соответствующий закрытый ключ. Кажется, что PyShallot работает, вычисляя открытый ключ и частный ключ по частям вместо использования библиотеки RSA. Я использовал модуль rsa для создания закрытого ключа и модуля Crypto для извлечения отдельных параметров RSA, а затем я использовал код из PyShallot для вычисления открытого ключа. Оттуда я мог бы получить луковый адрес. Это действительно уродливое и взломанное, и определенно лучший способ сделать это быстрее и не использует так много библиотек. Но это работает.

0

Вы почти получили это право, нужно было просто нарезать дайджеста в 16 байт, а затем нарежьте хэш в 16 символов:

key_hash = b32(hashlib.sha1(pubkey.exportKey()[22:]).digest()[:16]) 
print(key_hash[:16].lower() + ".onion") 
Смежные вопросы