2013-05-10 8 views
8

ich einen privaten erzeugt und einen öffentlichen Schlüssel mit den folgenden Befehlen:Wie in Python-RSA ein öffentlicher RSA-Schlüssel aus einer mit openssl erzeugten Datei geladen werden?

import os 
import rsa 

with open('private_key.pem') as privatefile: 
    keydata = privatefile.read() 
privkey = rsa.PrivateKey.load_pkcs1(keydata,'PEM') 

with open('public_key.pem') as publicfile: 
    pkeydata = publicfile.read() 

pubkey = rsa.PublicKey.load_pkcs1(pkeydata) 

random_text = os.urandom(8) 

#Generate signature 
signature = rsa.sign(random_text, privkey, 'MD5') 
print signature 

#Verify token 
try: 
    rsa.verify(random_text, signature, pubkey) 
except: 
    print "Verification failed" 

Mein Python-Skript schlägt fehl, wenn es:

openssl genrsa -out private_key.pem 512 
openssl rsa -in private_key.pem -pubout -out public_key.pem 

ich sie mit einem Python-Skript mit Python-RSA dann zu laden versucht versucht, den öffentlichen Schlüssel zu laden:

ValueError: No PEM start marker "-----BEGIN RSA PUBLIC KEY-----" found 
+1

ich glaube, das Problem ist das Format des öffentlichen Schlüssels ist. Wenn Sie genau hinsehen, lautet der Header des von openssl generierten öffentlichen Schlüssels: "----- BEGIN PUBLIC KEY -----". Das Format ist X509 SubjectPublicKeyInfo. Die von Ihnen verwendete Methode sucht nach dem PKCS1-Format mit einer Kopfzeile von "----- BEGIN RSA PUBLIC KEY -----". – gtrig

+0

Möchten Sie uns mitteilen, wie Sie X509 in PKCS1 foramt konvertieren? – fengxing

Antwort

3

Python-RSA verwendet das PEM RSAPublicKey Format und das PEM RSAPublicKey Format verwendet die Kopf- und Fußzeilen: openssl NOTES

----- BEGIN RSA PUBLIC KEY ----- ----- END öffentlichen RSA-Schlüssel -----

Ausgang der öffentliche Teil eines privaten Schlüssels in RSAPublicKey Format : openssl Beispiele

openssl rsa -in key.pem -RSAPublicKey_out -out pubkey.pem 
3

Wenn auf Python3, Sie müssen auch den Schlüssel im binär-Modus öffnen, zB:

with open('private_key.pem', 'rb') as privatefile: