2012-05-13 10 views
25

मैं में PEM प्रारूप + PKCS # 1 (मुझे लगता है) एक RSA सार्वजनिक कुंजी है पढ़ने के लिए:कैसे में पीईएम + PKCS # एक RSA सार्वजनिक कुंजी 1 प्रारूप

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

मैं के SHA1 डाइजेस्ट प्राप्त करना चाहते हैं पायथन में इसका एएसएन 1 एन्कोडेड संस्करण। पहला कदम इस कुंजी को पढ़ने में होना चाहिए, लेकिन मैं PyCrypto में ऐसा करने में विफल रहा:

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

documentation of PyCrypto कहते पीईएम + PKCS # 1 समर्थित है, तो मैं उलझन में हूँ। मैंने M2Crypto भी कोशिश की है, लेकिन यह पता चला है कि M2Crypto PKCS # 1 का समर्थन नहीं करता है, लेकिन केवल X.50 9।

उत्तर

23

PyCrypto का समर्थन करता है PKCS # 1 भावना है कि यह 509 में SubjectPublicKeyInfo वस्तुओं कि एक आरएसए सार्वजनिक रूप से PKCS # 1 इनकोडिंग कुंजी समाहित पढ़ सकते में

इसके बजाए, आपकी कुंजी में एन्कोड किया गया डेटा शुद्ध RSAPublicKey ऑब्जेक्ट है (यानी, दो INTEGERs, मॉड्यूलस और सार्वजनिक एक्सपोनेंट के साथ एक ASN.1 अनुक्रम है)।

हालांकि आप इसे अभी भी पढ़ सकते हैं। की तरह कुछ का प्रयास करें: संस्करण 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 के माध्यम से उत्पन्न होता है। मेरा मानना ​​है कि यह एक वैध पीईएम कुंजी है, और मैं इसे पायथन-आरएसए का उपयोग करके पढ़ने में कामयाब रहा। –

+0

संस्करण 2.6 से शुरू हो रहा है, PyCrypto भी सार्वजनिक कुंजी ऑब्जेक्ट्स आयात कर सकता है ताकि ऊपर दिया गया कोड अब आवश्यक नहीं है। – SquareRootOfTwentyThree

+0

पायथन 3 का उपयोग करके, एएसएन 1 डीकोड बाइट्स लौटाता है, जबकि 'निर्माण' की आवश्यकता होती है। कौन सा बाइट ऑर्डर का उपयोग किया जाता है? –

संबंधित मुद्दे