2012-05-13 5 views
25

1 형식으로 읽는 방법 :PEM + PKCS #에서 RSA 공개 키 내가 PEM 형식 + PKCS # 1 (내 생각)의 RSA 공개 키를 가지고

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

내가의 SHA1 다이제스트를 얻고 싶은를 그것의 ASN1은 Python으로 인코딩 된 버전입니다. 첫 번째 단계는이 키를 읽을 수 있어야한다,하지만 난 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)입니다.

그래도 읽을 수 있습니다. 같은 시도 : 버전 2.6에서 시작

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

을 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

파이썬 3을 사용하면 ASN1 디코드는 바이트를 반환하지만'construct'에는 int가 필요합니다. 어떤 바이트 순서가 사용됩니까? –