2012-03-22 15 views
12

में पीईएम एन्कोडेड निजी आरएसए कुंजी लोड करें अक्सर बार, उपयोगकर्ता पीईएम एन्कोडेड आरएसए निजी कुंजी रखेगा। क्रिप्टो ++ की आवश्यकता है कि ये कुंजी लोड करने के लिए डीईआर प्रारूप में हों। मैं लोगों से कह दिया गया है मैन्युअल रूप से इस तरह openssl का उपयोग कर पहले से der करने के लिए अपने पीईएम फ़ाइलों को कनवर्ट करने:क्रिप्टो ++

openssl pkcs8 -in in_file.pem -out out_file.der -topk8 -nocrypt -outform der 

कि ठीक काम करता है, लेकिन कुछ लोग ऐसा न ही वे करना चाहते हैं के लिए कैसे समझ में नहीं आता। तो मैं कार्यक्रम के भीतर स्वचालित रूप से पीईएम फ़ाइलों को डीईआर फाइलों में कनवर्ट करना चाहता हूं।

क्या यह पीईएम से "----- BEGIN प्रमाण पत्र -----" और "----- अंत प्रमाण पत्र -----" को पट्टी करने जैसा आसान है या कुछ अन्य परिवर्तन आवश्यक है कुंआ? मुझे बताया गया है कि उन मार्करों के बीच यह सिर्फ बी 64 एन्कोडेड डीईआर है। यहाँ कुछ कोड है कि इस मुद्दे को दर्शाता है:

// load the private key 
CryptoPP::RSA::PrivateKey PK; 
CryptoPP::ByteQueue bytes; 

try 
{ 
    CryptoPP::FileSource File(rsa.c_str(), true, new CryptoPP::Base64Decoder()); 
    File.TransferTo(bytes); 
    bytes.MessageEnd(); 

    // This line Causes BERDecodeError when a PEM encoded file is used 
    PK.Load(bytes); 
} 

catch (CryptoPP::BERDecodeErr) 
{ 
    // Convert PEM to DER and try to load the key again 
} 

मैं प्रणाली openssl करने के लिए कॉल करने से बचने और क्रिप्टो में पूरी तरह से ++ ताकि उपयोगकर्ताओं को किसी भी प्रारूप और चीजों को प्रदान कर सकते हैं "बस काम" परिवर्तन करना चाहते हैं। किसी भी सलाह के लिए धन्यवाद।

+0

क्या आप एक मेमोरी डिकोडर की तलाश में हैं, या ऑन-डिस्क एक अच्छा भी है? –

+0

@OrgnlDave - Crypto ++ का उपयोग करने वाला कोई भी उदाहरण करेगा। – 01100110

+0

@ 01100110 - क्रिप्टो ++ में अब एड-ऑन के रूप में यह समर्थन है। क्रिप्टो ++ विकी पर [पीईएम पैक] (http://www.cryptopp.com/wiki/PEM_Pack) देखें। – jww

उत्तर

7

हां, यह बेस 64 के साथ एन्कोडेड एक डीईआर स्ट्रीम है। नोट हालांकि, आरएसए कुंजी प्रारूप के मामले में, BEGIN और END मार्कर दोनों को स्ट्रिप करने के अलावा, आपको BEGIN मार्कर और एन्कोडेड डेटा के बीच डाले गए किसी भी झंडे को भी पट्टी करने की आवश्यकता है। केवल शेष भाग सफलतापूर्वक बेस 64 डीकोड किया जा सकता है। ऐसा प्रतीत होता है कि आप पूर्ण प्रमाणपत्र फ़ाइल को डीकोडर को खिलाते हैं और उसे फिक्सिंग की आवश्यकता होती है।

+0

मैं उत्तर की सराहना करता हूं। मैं openssl को std :: सिस्टम कॉल के साथ रूपांतरण कर सकता हूं। यह ठीक काम करता है, लेकिन यह एक हैक है। मैं पूरी तरह से क्रिप्टो ++ में पीईएम से डीईआर में रूपांतरण करना चाहता हूं। – 01100110

+0

उस उत्तर के लिए stackoverflow orLcount, +1 में आपका स्वागत है। –

+0

मैं क्रिप्टो ++ में कोई विशेषज्ञ नहीं हूं, लेकिन ऐसा लगता है कि लाइब्रेरी पीईएम एन्कोडेड प्रमाणपत्रों को सीधे लोड करने का समर्थन नहीं करती है। आपको उस कार्यक्षमता को जोड़ने की जरूरत है। या तो अपने 'आरएसए' चर पर सीधे std :: स्ट्रिंग सुविधाओं का उपयोग करके प्रारंभ/अंत मार्करों को अलग करके, या 'CryptoPP :: BufferedTransformation' लिखकर जो एक ही काम करता है। – orLcount

2

मुझे पता है कि यह एक पुराना सवाल है लेकिन अन्य को यह उपयोगी लगता है। एक बार जब आप मार्कर को पट्टी कर लेते हैं तो आपको 'आंतरिक' कुंजी सामग्री के साथ छोड़ दिया जाता है। http://www.cryptopp.com/wiki/Keys_and_Formats#BER_and_DER_Encoding के अनुसार आप इसे लोड करने के लिए BERDecodePrivateKey का उपयोग कर सकते हैं। तो, एक openssl महत्वपूर्ण यह है कि इसके मार्कर छीन आप की तरह

bool LoadKey(RandomNumberGenerator& rng, const std::string& file, 
    RSA::PrivateKey& key) 
{ 
    ByteQueue q; 
    FileSource KeyFile(file.c_str(), true, new Base64Decoder); 
    KeyFile.TransferTo(q); 
    key.BERDecodePrivateKey(q,false,0); // last 2 params unused 
    return key.Validate(rng, 2); 
} 
1

कुछ कर सकते हैं पड़ा है लोड करने के लिए ... मैं कार्यक्रम के भीतर अपने आप फ़ाइलें der करने के लिए पीईएम फ़ाइलें कनवर्ट करना चाहते हैं।

जुलाई 2014 में, PEM Pack क्रिप्टो ++ लाइब्रेरी के लिए प्रदान किया गया था। पीईएम पैक संदेश एन्क्रिप्शन का आंशिक कार्यान्वयन है जो आपको एन्क्रिप्टेड निजी कुंजी सहित पीईएम एन्कोडेड कुंजी और पैरामीटर पढ़ने और लिखने की अनुमति देता है। अतिरिक्त फाइलों में आरएसए, डीएसए, ईसी, ईसीडीएसए कुंजी और डिफी-हेलमैन पैरामीटर के लिए समर्थन शामिल है।

लाइब्रेरी में यह ऐड-ऑन है, और लाइब्रेरी का हिस्सा उचित नहीं है। आप एक ज़िप डाउनलोड करते हैं और पुस्तकालय में पांच स्रोत फाइलें जोड़ते हैं। फिर आप लाइब्रेरी बनाते हैं (Crypto ++ स्वचालित रूप से उन्हें उठाता है)। ज़िप में पांच अतिरिक्त स्रोत फ़ाइलें हैं, ओपनएसएसएल का उपयोग करके टेस्ट कुंजियां बनाने के लिए एक स्क्रिप्ट, एक सी ++ प्रोग्राम को पढ़ने और लिखने का परीक्षण करने के लिए, और ओपनएसएसएल का उपयोग करके क्रिप्टो ++ द्वारा लिखी गई कुंजी को सत्यापित करने के लिए एक स्क्रिप्ट।

यहाँ कैसे आप इसका इस्तेमाल होता है: कुंजी एन्क्रिप्टेड है

CryptoPP::RSA::PrivateKey pk; 
CryptoPP::FileSource file("<rsa-key-file.pem>", true); 

CryptoPP::PEM_Load(file, pk); 

CryptoPP::AutoSeededRandomPool prng; 
bool = pk.Validate(prng, 3); 
if (! valid) 
    throw ... 

है, तो आप निम्न तरीके से इसे लोड होता है। PEM Pack फिर से लागू करने के OpenSSL के EVP_BytesToKey, तो कुंजी व्युत्पत्ति काम करेंगे और आप Interop कर सकते हैं:

CryptoPP::RSA::PrivateKey pk; 
CryptoPP::FileSource file("<rsa-key-file.pem>", true); 

std::string pass = "<super secret password>"; 
CryptoPP::PEM_Load(file, pk, pass.data(), pass.size()); 

CryptoPP::AutoSeededRandomPool prng; 
bool = pk.Validate(prng, 3); 
if (! valid) 
    throw ... 

वहाँ भी एक PEM_Save है, ताकि आप क्रिप्टो से सीधे कुंजी लिख सकते हैं ++।

// Generate it or load it from somewhere 
CryptoPP::RSA::PrivateKey pk = ...; 
CryptoPP::FileSink file("<rsa-key-file.pem>", true); 

CryptoPP::PEM_Save(file, pk); 

और PEM_Save एक एन्क्रिप्टेड कुंजी के लिए (या आप एन्क्रिप्ट करने का इरादा कुंजी): उदाहरण के लिए:

// Generate it or load it from somewhere 
CryptoPP::RSA::PrivateKey pk = ...; 
CryptoPP::FileSink file("<rsa-key-file.pem>", true); 

std::string pass = "<super secret password>"; 
CryptoPP::PEM_Save(file, pk, "AES-128-CBC", pass.data(), pass.size()); 

PEM_Load करता नहीं अपने एन्कोडेड क्योंकि समझाया शीर्षक में एक एल्गोरिथ्म की जरूरत है। PEM_Save को एल्गोरिदम की आवश्यकता है क्योंकि कोई डिफ़ॉल्ट एल्गोरिदम नहीं है।

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