2016-11-29 7 views
0

私はpython3で自分のtor_hostnameをprivate_keyから生成しようとしています。 私はこのtutorial(java)を使って、達成したいものに変更しようとしましたが、ホスト名が生成されないようです。私は、エラーが最後の行でスライスのどこかにあると思うが、私はそれについてのドキュメントを見つけることができない。あなたのtor_hostnameからあなたのtor_policy_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のコードを使用して公開鍵を計算しました。そこから、私はタマネギのアドレスを得ることができました。それは本当に醜いとハッキーですが、間違いなくそれを行うためのより良い方法は、高速であり、非常に多くのライブラリを使用していない。しかし、それは動作します。

ちょうど16文字でハッシュをスライスし、その後、16バイトのダイジェストをスライスするために必要なあなたは、ほぼ右のそれを得た
0

、:

key_hash = b32(hashlib.sha1(pubkey.exportKey()[22:]).digest()[:16]) 
print(key_hash[:16].lower() + ".onion") 
関連する問題