2016-11-29 61 views
0

我一直试图从我的private_key与python3生成我的tor主机名。 我用这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

是的我知道这个问题很老,但也许我的回答会使像我这样的人试图做类似的事情,并偶然发现这个问题。我想我已经明白了 - 我使用了一些代码和一些来自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")