用python从tor私钥生成torhostname

2024-05-13 19:43:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直试图用python3从我的私有密钥生成torhostname。 我使用了这个tutorial(java),并试图将其更改为我想要实现的目标,但我似乎无法生成我的主机名。我怀疑错误存在于最后一行的切片中,但我找不到任何有关它的文档。在

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对我来说似乎过于复杂。在


Tags: keyfromimport目标read密钥rsapython3
2条回答

是的,我知道这个问题很古老,但也许我的答案会让像我这样的人受益,因为他们正试图做一些类似的事情,却偶然发现了这个问题。我想我明白了-我用了你的一些代码和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)

上面的代码打印一个洋葱地址和相应的私钥。pysholot似乎是通过逐个计算公钥和私钥来工作的,而不是使用RSA库。我使用rsa模块生成私钥,使用Crypto模块提取各个rsa参数,然后使用pysholt的代码计算公钥。从那里我可以得到洋葱地址。它真的很难看而且很老套,而且肯定有一种更好的方法可以更快,而且不用那么多库。但它是有效的。在

您几乎是对的,只需将摘要切分为16个字节,然后将哈希切分为16个字符:

key_hash = b32(hashlib.sha1(pubkey.exportKey()[22:]).digest()[:16])
print(key_hash[:16].lower() + ".onion")

相关问题 更多 >