2012-05-13 80 views
25

我在PEM格式+ PKCS#1(我猜),一個RSA公鑰RSA公鑰:如何讀取PEM + PKCS#1格式

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

我想要得到的SHA1摘要其在Python中的ASN1編碼版本。第一步應該是閱讀的關鍵,但我沒能做到這一點在PyCrypto:

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

documentation of PyCrypto說PEM + PKCS#1是支持的,所以我很困惑。 我也試過M2Crypto,但事實證明,M2Crypto不支持PKCS#1,但只支持X.509。

回答

23

PyCrypto支持PKCS#在這個意義上,它可以在X.509讀取包含PKCS#1編碼的RSA公鑰SubjectPublicKeyInfo對象1

而是,您的密鑰中編碼的數據是純粹的RSAPublicKey對象(即具有兩個INTEGER,模數和公開指數的ASN.1 SEQUENCE)。

雖然你仍然可以閱讀它。嘗試是這樣的:

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

從2.6版本開始,PyCrypto也可以導入RsaPublicKey ASN.1對象。 代碼更加簡單:

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

它是通過OpenSSL中的PEM_write_bio_RSAPublicKey生成的。我相信這是一個有效的PEM密鑰,我設法使用python-rsa來讀取它。 –

+0

從版本2.6開始,PyCrypto可以導入RsaPublic對象,所以上面的代碼不再需要。 – SquareRootOfTwentyThree

+0

使用Python 3,ASN1解碼返回字節,而'construct'需要整數。使用哪個字節順序? –

相關問題