2012-05-13 15 views
25

mam klucza publicznego RSA w formacie + PKCS PEM # 1 (chyba):Jak odczytać klucza publicznego RSA w PEM + PKCS # 1 format

-----BEGIN RSA PUBLIC KEY----- 
MIGJAoGBAJNrHWRFgWLqgzSmLBq2G89exgi/Jk1NWhbFB9gHc9MLORmP3BOCJS9k 
onzT/+Dk1hdZf00JGgZeuJGoXK9PX3CIKQKRQRHpi5e1vmOCrmHN5VMOxGO4d+zn 
JDEbNHODZR4HzsSdpQ9SGMSx7raJJedEIbr0IP6DgnWgiA7R1mUdAgMBAAE= 
-----END RSA PUBLIC KEY----- 

Chcę uzyskać SHA1 z jego kodowana ASN1 wersja w Pythonie. Pierwszym krokiem powinno być przeczytanie tego klucza, ale nie udało mi się to zrobić w PyCrypto:

>> from Crypto.PublicKey import RSA 
>> RSA.importKey(my_key) 
ValueError: RSA key format is not supported 

documentation of PyCrypto mówi PEM + PKCS # 1 jest obsługiwany, więc jestem zdezorientowany. Próbowałem też M2Crypto, ale okazało się, że M2Crypto nie obsługuje PKCS # 1, a jedynie X.509.

Odpowiedz

23

PyCrypto obsługuje PKCS # 1 w tym sensie, że można ją przeczytać w X.509 SubjectPublicKeyInfo obiekty zawierają klucza publicznego RSA zakodowany w PKCS # 1.

Zamiast tego dane zakodowane w kluczu to czysty obiekt RSAPublicKey (czyli sekwencja ASN.1 z dwoma modułami INTEGER, modułem i wykładnikiem publicznym).

Nadal można go przeczytać. Spróbuj czegoś takiego:

from Crypto.PublicKey import RSA 
from Crypto.Util import asn1 
from base64 import b64decode 

key64 = 'MIGJAoGBAJNrHWRFgWLqgzSmLBq2G89exgi/Jk1NWhbFB9gHc9MLORmP3BOCJS9k\ 
onzT/+Dk1hdZf00JGgZeuJGoXK9PX3CIKQKRQRHpi5e1vmOCrmHN5VMOxGO4d+znJDEbNHOD\ 
ZR4HzsSdpQ9SGMSx7raJJedEIbr0IP6DgnWgiA7R1mUdAgMBAAE=' 

keyDER = b64decode(key64) 
seq = asn1.DerSequence() 
seq.decode(keyDER) 
keyPub = RSA.construct((seq[0], seq[1])) 

Poczynając od wersji 2.6, PyCrypto można importować także RsaPublicKey obiekty ASN.1. Kod jest wtedy znacznie prostsze:

from Crypto.PublicKey import RSA 
from base64 import b64decode 

key64 = b'MIGJAoGBAJNrHWRFgWLqgzSmLBq2G89exgi/Jk1NWhbFB9gHc9MLORmP3BOCJS9k\ 
onzT/+Dk1hdZf00JGgZeuJGoXK9PX3CIKQKRQRHpi5e1vmOCrmHN5VMOxGO4d+znJDEbNHOD\ 
ZR4HzsSdpQ9SGMSx7raJJedEIbr0IP6DgnWgiA7R1mUdAgMBAAE=' 

keyDER = b64decode(key64) 
keyPub = RSA.importKey(keyDER) 
+3

To jest generowany poprzez PEM_write_bio_RSAPublicKey w OpenSSL. Uważam, że jest to poprawny klucz PEM i udało mi się go odczytać za pomocą python-rsa. –

+0

Począwszy od wersji 2.6, PyCrypto może importować również obiekty kluczy RsaPublic, więc powyższy kod nie jest już potrzebny. – SquareRootOfTwentyThree

+0

Używając Pythona 3, dekodowanie ASN1 zwraca bajty, podczas gdy 'construct' wymaga ints. Która kolejność bajtów jest używana? –

Powiązane problemy