2013-05-10 12 views
8

Ho generato una privata e una chiave pubblica con i seguenti comandi:Come caricare in Python-RSA una chiave RSA pubblica da un file generato con openssl?

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

Allora ho provato a caricarli con uno script python utilizzando Python-RSA:

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" 

Il mio script python fallisce quando si cerca di caricare la chiave pubblica:

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

Credo che il problema è il formato della chiave pubblica. Se si guarda da vicino, l'intestazione sulla chiave pubblica generata da openssl è "----- BEGIN PUBLIC KEY -----". Il formato è X509 SubjectPublicKeyInfo. Il metodo che stai utilizzando sta cercando il formato PKCS1 con un'intestazione di "----- BEGIN RSA PUBLIC KEY -----". – gtrig

+0

Ci diresti come convertire X509 in forkt PKCS1? – fengxing

risposta

3

Python-RSA utilizza il formato PEM RSAPublicKey e il formato PEM RSAPublicKey utilizza le righe di intestazione e piè di pagina: openssl NOTES

----- BEGIN RSA PUBBLICA CHIAVE ----- ----- END RSA PUBBLICA CHIAVE -----

uscita la parte pubblica di una chiave privata in formato RSAPublicKey : ESEMPI OpenSSL

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

Se il python3, È inoltre necessario aprire la chiave in modalità binaria, per esempio:

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