2016-08-22 8 views
1

Ich muss publickey von einem privaten Schlüssel ohne temporäre Speicherort lokal wie wir es in sshgen.So ich benutze this.Here iam übergeben meinen privaten Schlüssel als Eingabe so (während der Ausführung):Extract Publickey von Privatekey Eingabe mit Python

python codekey.py "-----BEGIN RSA PRIVATE KEY-----\nMIhhhhhhhhhhhhhhhh......Bidqt/YS3/0giWrtv+rMkJtv8n\nmirJ+16SZodI5gMuknvZG....................n-----END RSA PRIVATE KEY-----" 

Mein Code (codekey.py):

import sys 
import io 
from twisted.conch.ssh import keys 
k = sys.argv[1] 
rsa = keys.RSA.importKey(k) 
key = keys.Key(rsa) 
ssh_public = key.public().toString("openssh") 
print ssh_public 

Fehler:

 Traceback (most recent call last): 
    File "codekey.py", line 7, in <module> 
    rsa = keys.RSA.importKey(k) 
    File "/usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.py", line    638, in importKey 
    if lines[1].startswith(b('Proc-Type:4,ENCRYPTED')): 
     IndexError: list index out of range 

Dyanam ically muss ich Schlüsselwert übergeben, wie oben gezeigt, während das Ausführen meines Python-Skripts und von diesem wird es öffentlichen Schlüssel generieren. Wenn es möglich ist ?? Ich brauche nicht lokal zu speichern, da für priveleges und wichtige Wertpapiere, nicht hacken wollen.

+0

mit Blick auf den Quellcode, ist es nicht, wie die Form der privaten Schlüssel aussehen wird unterstützt. Außerdem sollten Sie conch.keys.Key.fromString() verwenden, um den Schlüssel zu importieren, sobald Sie ihn in einem akzeptablen Format haben. –

+0

Danke James, aber wo ich vermisse, weiß ich, dass ich einen Fehler in dieser Zeile rsa = keys.RSA.importKey (k) gemacht habe. Da ich meinen privaten Schlüssel als Eingabe bekommen muss, anstatt in die pem-Datei zu gelangen und einen extrahieren Öffentlicher Schlüssel von it.Ist es möglich ??? Wenn wir sshkeygen verwenden, speichert es Schlüssel lokal. Ich will das aus Sicherheitsgründen nicht. – Doefi

Antwort

2

Hier ist, wie Sie es tun können:

Wenn Sie bereits den privaten Schlüssel haben Sie grundsätzlich einen privaten Schlüssel Objekt mit ihm machen kann und dann extrahieren Sie einfach die öffentlichen Schlüssel von dessen Verwendung als:

public_key = private_key.publickey().exportKey('PEM') 

vorausgesetzt, dass private_key ist Ihr privates Schlüsselobjekt.

Falls Sie nicht über dieses Objekt haben, eine Möglichkeit, es aus der PEM zu erhalten codiert (PKCS # 1) private Schlüsseldatei (wie Sie in Ihrer Frage oben gegeben haben) würde wie folgt sein:

from Crypto.PublicKey import RSA 
from base64 import b64decode 
pem_key = b'your private key in PEM' 
key = b64decode(pem_key) 
keyPriv = RSA.importKey(key) 
# key now has all the components of the private 
print keyPriv.keydata 
modulusN = keyPriv.n 
pubExpE = keyPriv.e 
priExpD = keyPriv.d 
primeP = keyPriv.p 
primeQ = keyPriv.q 
private_key = RSA.construct((modulusN, pubExpE, priExpD, primeP, primeQ)) 

und dann, wenn Sie den privaten Schlüssel in der private_key objectdo die haben:

public_key = private_key.publickey().exportKey('PEM') 
+0

Wenn Sie Probleme haben, 'von Crypto.PublicKey importieren RSA 'zu importieren, versuchen Sie, pycrypto mit easy_install zu installieren: ' pip deinstallieren pycrypto easy_install pycrypto' – E235