2012-08-09 13 views
5

के साथ मेमोरी से सार्वजनिक/निजी कुंजी पढ़ना मैं कुछ परियोजना को एन्क्रिप्ट/डिक्रिप्ट करने के लिए अपनी परियोजना में सार्वजनिक/निजी कुंजी का उपयोग कर रहा हूं।ओपनएसएसएल

मैं एक सर्वर पर एक सार्वजनिक कुंजी ("public.pem") होस्ट कर रहा हूं।

"public.pem" इस तरह दिखता है:

-----BEGIN PUBLIC KEY----- 
..... 
..... 
-----END PUBLIC KEY----- 

मैं एक ग्राहक के पक्ष कि यह सार्वजनिक कुंजी डाउनलोड करता है और डिस्क पर सहेजें और फिर उस फ़ाइल के लिए एक फ़ाइल वर्णनकर्ता साथ OpenSSL के PEM_read_RSA_PUBKEY() कॉल लिखा था। यह ऑपरेशन बहुत अच्छा काम करता है और परिणाम एक आरएसए ऑब्जेक्ट है जो एन्क्रिप्शन के लिए तैयार है।

मैं प्रत्येक बार डिस्क पर सार्वजनिक कुंजी लिखने से बचना चाहता हूं (क्योंकि मेरे पास पहले से ही स्मृति में बफर है)।

मैं डिस्क पर बफर को सहेजे बिना एक ही ऑपरेशन कैसे कर सकता हूं? मैंने एक फ़ंक्शन देखा: PEM_read_bio_RSAPublicKey() लेकिन मुझे यकीन नहीं है कि यह बीआईओ संरचना का उपयोग है। क्या मैं सही रास्ते पर हूं?

तो असली सवाल यह होगा: मैं आरएसए ऑब्जेक्ट को सीधे स्मृति से सार्वजनिक/निजी कुंजी कैसे पढ़ूं, न कि फ़ाइल डिस्क्रिप्टर से।

उत्तर

14

आप सही रास्ते पर हैं। BIO_new_mem_buf() के माध्यम से आपको बीआईओ बफर के माध्यम से पहले से ही स्मृति में पीईएम कुंजी को लपेटना होगा। दूसरे शब्दों में, कुछ की तरह:

BIO *bufio; 
RSA *rsa 

bufio = BIO_new_mem_buf((void*)pem_key_buffer, pem_key_buffer_len); 
PEM_read_bio_RSAPublicKey(bufio, &rsa, 0, NULL); 

एक ही दृष्टिकोण कोई RSA निजी कुंजी (PEM_read_bio_RSAPrivateKey के माध्यम से) के लिए मान्य है, लेकिन इस मामले में आप सबसे निश्चित रूप से पास वाक्यांश के लिए पूरा करने के लिए की जरूरत है। विवरण के लिए man page देखें।

+1

मैंने अभी उस विकल्प को आजमाया। एन्क्रिप्शन ठीक था, डिक्रिप्शन काम नहीं किया था। क्या सार्वजनिक कुंजी को निम्न की तरह होना चाहिए या जब मैं इसे क्लाइंट को भेजूं तो मुझे "BEGIN सार्वजनिक कुंजी" को पट्टी करने की आवश्यकता है? ----- BEGIN सार्वजनिक कुंजी ----- ..... ..... ----- अंत सार्वजनिक कुंजी ----- – user1144031

+0

मैन पेज लिंक टूटा हुआ है :(। किसी के पास अद्यतन लिंक है? – digawp

2

SquareRootOfTwentyTree की विधि मेरे लिए काम नहीं करती है। मेरा समाधान यहाँ है।

BIO* bio = BIO_new(BIO_s_mem()); 
int len = BIO_write(bio, pem_key_buffer, pem_key_buffer_len); 
EVP_PKEY* evp_key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL); 
RSA* rsa = EVP_PKEY_get1_RSA(evp_key); 
संबंधित मुद्दे