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 для вычисления открытого ключа. Оттуда я мог бы получить луковый адрес. Это действительно уродливое и взломанное, и определенно лучший способ сделать это быстрее и не использует так много библиотек. Но это работает.