2011-02-23 17 views
14

मैं अपने सी # प्रोजेक्ट में आरएसए (बाउंसी कैसल एपीआई) का उपयोग कर रहा हूं। मैं इस विधि के साथ कुंजीयुग्म उत्पन्न:बाउंसी कैसल, आरएसए: एक स्ट्रिंग प्रारूप में कुंजियों को बदलने

RsaKeyPairGenerator r = new RsaKeyPairGenerator(); 
r.Init(new KeyGenerationParameters(new SecureRandom(), 1024)); 
AsymmetricCipherKeyPair keys = r.GenerateKeyPair(); 

AsymmetricKeyParameter private_key = keys.Private; 
AsymmetricKeyParameter public_key = keys.Public; 

अब मैं उन्हें एक txt फ़ाइल में सहेजना चाहते हैं, लेकिन समस्या यह है कि मैं उन्हें एक स्ट्रिंग प्रारूप में रूपांतरित नहीं कर सकते हैं। मैंने एक और पोस्ट में पढ़ा है कि चाबियों का उपयोग करके क्रमबद्ध किया जाना चाहिए:

PrivateKeyInfo k = PrivateKeyInfoFactory.CreatePrivateKeyInfo(private_key); 
byte[] serializedKey = k.ToAsn1Object().GetDerEncoded(); 

क्या यह सही तरीका है? यदि हां, तो इसके बाद मुझे क्या करना चाहिए? बस उन्हें बाइट [] से स्ट्रिंग में परिवर्तित करें?

उत्तर

7

ठीक है, मुझे आरएसए-विशिष्ट पक्ष के बारे में पता नहीं है, लेकिन एक बार जब आपको एक अपारदर्शी बाइनरी स्ट्रिंग मिलती है (यानी इसमें कोई मनमाना डेटा हो सकता है) टेक्स्ट रूपांतरण के लिए सबसे अच्छी शर्त Convert.ToBase64String(byte[]) है जिसके साथ आप उलटा कर सकते हैं Convert.FromBase64String(string)

इस के लिए नहीं उपयोग Encoding.GetString(byte[]) और Encoding.GetBytes(string) करो - बाइनरी डेटा एक विशेष एन्कोडिंग में पाठ नहीं है, और नहीं माना जाना चाहिए। यदि आप इसे आजमाते हैं तो आप लगभग डेटा खोने के लिए बाध्य हैं।

+0

अपने त्वरित जवाब के लिए धन्यवाद। जैसा आपने कहा था मैंने किया और परिणामस्वरूप मुझे यह मिला ** MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ7s/B4XNHmNa9LwZ91z ... ** मुझे लगता है कि यह एक BigInteger नहीं होना चाहिए? क्योंकि आरएसए में हम संख्याओं का उपयोग करते हैं (पी, क्यू ...) – Skeenor

+0

विधि का नाम (GetDerEncoded) सुझाव देता है कि लौटाए गए डेटा में डीईआर एन्कोडेड प्रारूप में सभी आरएसए कुंजी पैरामीटर (पी, क्यू, ...) शामिल हैं। –

+0

@ रमी: क्या आपका लक्ष्य कुछ ऐसा है जो आप "रीहाइड्रेट" को एक निजी KeyInfo पर वापस कर सकते हैं? यदि ऐसा है, तो आपको पूर्णांक आदि को जानने की आवश्यकता नहीं है ... आप बस यह सुनिश्चित करना चाहते हैं कि आप एक बाइट सरणी (और उसके बाद एक स्ट्रिंग) को क्रमबद्ध कर सकते हैं और इसके विपरीत। –

18

तुम भी उन्हें PEM प्रारूप में स्टोर करने के लिए इस्तेमाल कर सकते हैं PemWriter:

TextWriter textWriter = new StringWriter(); 
PemWriter pemWriter = new PemWriter(textWriter); 
pemWriter.WriteObject(keys.Private); 
pemWriter.Writer.Flush(); 

string privateKey = textWriter.ToString(); 

अब privateKey कुछ इस तरह के होते हैं: यदि आप एक .net प्रमाण पत्र के लिए bouncycastle प्रमाणपत्र कन्वर्ट तो

-----BEGIN RSA PRIVATE KEY----- 
MIICXQIBAAKBgQDFhB3xI1AzSMsKvt7rZ7gp2o/vd49zON89iL1ENvKkph7oFXa2 
ew/hjzbAV33lHnFFlA/vA5SDCbggRyU1/SmjfuPJFEzFbgcPLuO1Sw6z+bWXiIFp 
QNCOTIw11c0fbwk+kB2y4E1OkLv5f9atlNlekb4wBn8bMbFYtu6LGWjkFQIDAQAB 
AoGANPoMteLM3hSGMSmkzOsS4Fb5CDe/SB5W8kA805ERX8wWuhUXtDYpukwZWVme 
MNgLdagS5f7F1KfEtROgDW0Lv4/T/FWAbpgh8O2CPKYDY4ZXl8tmRH9dtYn/824l 
veLxdgNjHwo5OMvuTSDMjC3tbg2UA3kmV4VAm5QotlRinUECQQDo4zvI5e81zWnS 
kNrUARX80t432MOZyr0RvAaVJfBNQpJl0H0xp5LKP74hvPVO9WdJvJ0M4Z4QrmGO 
bm2Hsfz5AkEA2R469YXxgPLDg/LvUQqfrl8Ji9+rip7eQP7iS/dt66NMS31/HymT 
+HscEZ3qGlnQuyyyRR2rGQdhdjU42HNy/QJBAKbPTF1DxSmGbovyUauU84jaCW17 
B++6dd6kDRr7x7mvO2lOAr50RwIy0h8cV6EsycTZIqy9VhigryP0GOQfKxECQA8T 
uVZpab7hnNAh45qGGVabhOcwrhHfPGHZEU/jK7/sRBUN7vD0CzF7IxTaGXKhAAyv 
auW/zKzdRVhXE858HeUCQQCGaaAg8GwM0qIS0nHRTLldu4hIGjKn7Sk0Z46Plfwr 
oqPCtuP4ehX85EIhqCcoFnG6Ttr6AxSgNMZvErVxDBiD 
-----END RSA PRIVATE KEY----- 
+0

यह उत्तर सही है, लेकिन 'स्ट्रिंग PrivateKey = pemWriter.ToString();' स्ट्रिंग PrivateKey = textWriter.ToString(); '' स्ट्रिंग की बजाय अंतिम पंक्ति को बदलें। – skw

1

। ऐसा करने के लिए कार्य bouncycastle lib में है (मुझे विश्वास है कि यह DotNetUtilities नामक एक कक्षा में है)। RSACryptoServiceProvider एक समारोह है:

ToXmlString(bool includePrivateKey). 

जो तुम अगर आप निजी कुंजी सभी घटकों से युक्त बेस 64 अलग से, प्रतिपादक, मापांक, और घ (निजी प्रतिपादक) के लिए धारावाहिक चाहते हो के साथ एक प्रमाण पत्र का एक्स प्रतिनिधित्व करता है।

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