2012-05-13 36 views
25

Tôi có một khóa công khai RSA trong PEM định dạng + PKCS # 1 (tôi đoán):Làm thế nào để đọc một khóa công khai RSA trong PEM + PKCS # 1 định dạng

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

Tôi muốn nhận được SHA1 của phiên bản mã hóa ASN1 của nó bằng Python. Bước đầu tiên nên đọc phím này, nhưng tôi không thể làm điều đó trong PyCrypto:

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

các documentation of PyCrypto nói PEM + PKCS # 1 được hỗ trợ, vì vậy tôi đang bối rối. Tôi cũng đã thử M2Crypto, nhưng nó chỉ ra rằng M2Crypto không hỗ trợ PKCS # 1 nhưng chỉ X.509.

Trả lời

23

PyCrypto hỗ trợ PKCS # 1 theo nghĩa là nó có thể đọc trong X.509 SubjectPublicKeyInfo đối tượng mà chứa một khóa công khai RSA mã hóa trong PKCS # 1.

Thay vào đó, dữ liệu được mã hóa trong khóa của bạn là một đối tượng thuần túy RSAPublicKey (nghĩa là, một ASN.1 SEQUENCE với hai INTEGER, mô-đun và số mũ công khai).

Bạn vẫn có thể đọc nó. Hãy thử một cái gì đó như:

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])) 

Bắt đầu từ phiên bản 2.6, PyCrypto có thể nhập cũng RsaPublicKey đối tượng ASN.1. Mã này sau đó đơn giản hơn nhiều:

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

Nó được tạo thông qua PEM_write_bio_RSAPublicKey trong OpenSSL. Tôi tin rằng đó là một khóa PEM hợp lệ, và tôi đã đọc nó bằng python-rsa. –

+0

Bắt đầu từ phiên bản 2.6, PyCrypto cũng có thể nhập các đối tượng khóa RsaPublic để mã ở trên không cần thiết nữa. – SquareRootOfTwentyThree

+0

Sử dụng Python 3, giải mã ASN1 trả về byte, trong khi 'construct' cần ints. Thứ tự byte nào được sử dụng? –

Các vấn đề liên quan