是的我知道这个问题很老,但也许我的回答会使像我这样的人试图做类似的事情,并偶然发现这个问题。我想我已经明白了 - 我使用了一些代码和一些来自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中的代码计算公钥。从那里我可以得到洋葱地址。这真的很丑陋,而且确实有更好的方法可以做得更快,而且不会使用那么多的库。但它的工作。