2010-07-15 13 views
12

के बीच मैं .NET वर्ग RSACryptoServiceProvider का उपयोग किया है एक कुंजी युग्म पाने के लिए:इंटरोऑपरेबिलिटी RSACryptoServiceProvider और openssl

using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) 
{ 
    File.WriteAllText ("PublicKeyOnly.xml", rsa.ToXmlString (false)); 
    File.WriteAllText ("PublicPrivate.xml", rsa.ToXmlString (true)); 
} 

अब, मैं OpenSSH के साथ इस का उपयोग करना चाहते हैं, लेकिन कुंजी प्रारूप एक जैसे कुछ भी नहीं लग रहा है। क्या कोई जानता है कि सार्वजनिक और निजी कुंजी दोनों फ़ाइलों को ओपनएसएसएच का उपयोग कैसे कर सकता है?

धन्यवाद!

+2

http://stackoverflow.com/questions/497428/how-do-i-import-an-rsa-public -कि-से-नेट-इन-ओपनएसएल ऐसा लगता है कि इसे काम करना चाहिए, नहीं? –

उत्तर

2

OpenSSL and RSACryptoServiceProvider के प्रयोग पर इस ब्लॉग पोस्ट में कहा गया है कि यह संभव है, लेकिन लेखक Chilkat RSA लाइब्रेरी का उपयोग अंत में सी # के भीतर से OpenSSL के साथ interoperate समाप्त हो गया। पीईएम प्रारूप .NET दुनिया में समर्थित नहीं है, इसलिए आप इस लाइब्रेरी का उपयोग जावासाइंस से OpenSSLKey.cs कहला सकते हैं;

OpenSSL: हालांकि, के रूप में ब्लॉग पोस्ट के लेखक का उल्लेख है कि वे इस (quoted) की वजह से समस्या नहीं थी केवल एक ही ब्लॉक के भीतर फिट कि डेटा के छोटे टुकड़े पर हस्ताक्षर कर सकते हैं। डेटा पैड और हस्ताक्षरित है। रिवर्स को "सत्यापित करें" कहा जाता है और उस मामले में डेटा "हस्ताक्षरित" होता है और फिर अनपढ़ किया जाता है और मूल डेटा लौटाया जाता है।

[विंडोज]: डेटा की किसी भी राशि पर हस्ताक्षर कर सकते हैं। साइन * विधियों में पहले डेटा हैश है और फिर हैश गद्देदार है और हस्ताक्षरित है। सत्यापन * विधियों की अपेक्षा तीन इनपुट: मूल डेटा, हैश एल्गोरिदम नाम, और हस्ताक्षर डेटा। मूल डेटा हैश किया गया है और मूल डेटा के हैश की तुलना में के हस्ताक्षर/अनपैडिंग का परिणाम है।

तो मैं आपको चिल्काट आरएसए लाइब्रेरी के साथ जाने की सलाह देता हूं।

+1

नहीं, मुझे लगता है कि ओपनएसएसएल किसी भी मात्रा में डेटा पर हस्ताक्षर कर सकता है .. आप EVP_SignInit, शून्य या कई EVP_SignUpdate और एक EVP_SignFinal के संयोजन का उपयोग करते हैं। ओपनएसएसएल देशी रैपर के शीर्ष पर ICryptoTransform और अन्य .NET Crypto इंटरफेस को लागू करना बहुत मुश्किल नहीं है जैसे Sourceforge पर openssl-net। – maxwellb

8

मुझे वास्तव में RSACryptoServiceProvider के साथ ओपनेंस इंटरऑपरेबिलिटी प्राप्त करने की आवश्यकता है, ताकि मैं एक सॉफ्टवेयर लाइसेंस कुंजी सिस्टम (Ref) लागू कर सकूं।

मुझे ओपनएसएल का उपयोग करके लिनक्स में निजी और सार्वजनिक कुंजी बनाने में सक्षम होना चाहिए ताकि बाद में उन्हें PHP वेब एप्लिकेशन में लाइसेंस प्रबंधन के लिए उपयोग किया जा सके। फिर भी, उन्हें वीबी.Net प्रशंसा में आरएसए हस्ताक्षर लाइसेंस सिस्टम के आधार के रूप में भी उपयोग करें।

खोज के एक सप्ताह बाद, मुझे अंत में पता चला कि यह पूरी तरह से संभव है, इसलिए मैंने सोचा कि मैं इसे साझा करूंगा।

लिनक्स (या कोई अन्य उपयोगी ओएस) पर प्रारंभ करें और एक निजी कुंजी (priv.pem), एक सार्वजनिक कुंजी (public.pem), एक प्रमाणपत्र (प्रमाणपत्र.crt), एक व्यक्तिगत सूचना एक्सचेंज फ़ाइल बनाने के लिए openssl का उपयोग करें (certificate.pfx)। सीएन और ईमेल एड्रेस फ़ील्ड के बारे में चिंता न करें, प्रमाण पत्र और पीएफएक्स फ़ाइलों को केवल सार्वजनिक या निजी कुंजी को RSACryptoServiceProvider ऑब्जेक्ट में प्राप्त करने के लिए वाहन के रूप में उपयोग किया जा रहा है।

Dim cert As New X509Certificate2("certificate.pfx", "", X509KeyStorageFlags.Exportable) 
Dim rsaProvider As RSACryptoServiceProvider = DirectCast(cert.PrivateKey, RSACryptoServiceProvider) 

आप निजी कुंजी या सार्वजनिक कुंजी की जरूरत है इस कोशिश:

msgbox(rsaProvider.ToXmlString(True)) 'Private key in XML format 
msgbox(rsaProvider.ToXmlString(False)) 'Public key in XML format 

में सार्वजनिक कुंजी प्राप्त करने के लिए

openssl genrsa -out private.pem 1024 
openssl rsa -in private.pem -out public.pem -pubout 
openssl req -nodes -x509 -days 3650 -subj '/CN=www.example.com/[email protected]' -new -key private.pem -out certificate.crt 
openssl pkcs12 -export -out certificate.pfx -inkey private.pem -in certificate.crt 

अब कोड में निजी कुंजी प्राप्त करने के लिए कोड:

Dim cert As New X509Certificate2("certificate.crt") 
Dim rsaProvider As RSACryptoServiceProvider = DirectCast(cert.PublicKey.Key, RSACryptoServiceProvider) 

यदि आप नी घ सार्वजनिक कुंजी इस प्रयास करें:

msgbox(rsaProvider.ToXmlString(False)) 'Public key in XML format 

आने के लिए अधिक .....