2012-07-05 25 views
8

का उपयोग कर मैं .pem फ़ाइल में पढ़ने के लिए सी # का उपयोग करने की कोशिश कर रहा हूं जिसमें केवल एक आरएसए सार्वजनिक कुंजी है। मेरे पास निजी कुंजी की जानकारी नहीं है, न ही मेरे आवेदन की आवश्यकता है। फ़ाइल myprivatekey.pem फ़ाइलपढ़ना पीईएम आरएसए पब्लिक कुंजी केवल बाउंसी कैसल

-----BEGIN PUBLIC KEY----- साथ शुरू होता है और -----END PUBLIC KEY----- साथ समाप्त होता है।

Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair keyPair; 

    using (var reader = File.OpenText(@"c:\keys\myprivatekey.pem")) 
     keyPair = (Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair)new Org.BouncyCastle.OpenSsl.PemReader(reader).ReadObject(); 

कोड संदेश

प्रकार 'Org.BouncyCastle.Crypto.Parameters.DsaPublicKeyParameters की वस्तु कास्ट करने में असमर्थ के साथ एक InvalidCastException फेंकता है हालांकि:

मेरे वर्तमान कोड इस प्रकार है ' ' Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair 'टाइप करने के लिए।

कोई निजी कुंजी जानकारी उपलब्ध होने पर, मैं केवल सार्वजनिक कुंजी पढ़ने के लिए बाउंसी कैसल के PemReader का उपयोग कैसे कर सकता हूं?

+2

एक एकल सार्वजनिक कुंजी एक महत्वपूर्ण जोड़ी नहीं है। एक कुंजी जोड़ी एक सार्वजनिक कुंजी * और * एक निजी कुंजी है। –

उत्तर

14

निम्नलिखित कोड केवल एक फ़ाइल नाम दिया गया सार्वजनिक कुंजी पढ़ेगा। किसी भी उत्पादन कोड के लिए अपवाद हैंडलिंग बदला जाना चाहिए। यह विधि AsymetricKeyParameter देता है।

public Org.BouncyCastle.Crypto.AsymmetricKeyParameter ReadAsymmetricKeyParameter(string pemFilename) 
{ 
    var fileStream = System.IO.File.OpenText (pemFilename); 
    var pemReader = new Org.BouncyCastle.OpenSsl.PemReader (fileStream); 
    var KeyParameter = (Org.BouncyCastle.Crypto.AsymmetricKeyParameter)pemReader.ReadObject(); 
    return KeyParameter; 
} 
+0

क्या इसका उपयोग निजी कुंजी को पढ़ने के लिए भी किया जा सकता है? फिर सिफर फ़ंक्शन में केवल झूठी हो जाएं जैसे: cipher.Init (false, privatekey)। मैंने भाग्य के बिना यह कोशिश की। – c0d3Junk13

2

c0d3Junk13 के जवाब में, मैं एक पीईएम निजी कुंजी के लिए एक ही मुद्दा था और यह मेरे समाधान सी # BouncyCastle संस्करण 1.7 और विजुअल स्टूडियो 2013 डेस्कटॉप एक्सप्रेस का उपयोग खोजने के लिए सभी दोपहर ले लिया। BouncyCastle.Crypto.dll

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Collections; 
using System.IO; 
using Org.BouncyCastle.Asn1.X509; 
using Org.BouncyCastle.Asn1.Pkcs; 
using Org.BouncyCastle.Crypto.Digests; 
using Org.BouncyCastle.Crypto.Parameters; 
using Org.BouncyCastle.Crypto.Signers; 
using Org.BouncyCastle.X509; 
using Org.BouncyCastle.Math; 
using Org.BouncyCastle.Math.EC; 
using Org.BouncyCastle.Utilities.Collections; 
using Org.BouncyCastle.Utilities.Encoders; 
using Org.BouncyCastle.Crypto; 
using Org.BouncyCastle.Crypto.Engines; 
using Org.BouncyCastle.OpenSsl; 

/* 
    For an Active Directory generated pem, strip out everything in pem file before line: 
    "-----BEGIN PRIVATE KEY-----" and re-save. 
*/ 
string privateKeyFileName = @"C:\CertificateTest\CS\bccrypto-net-1.7-bin\private_key3.pem"; 

TextReader reader = File.OpenText(privateKeyFileName); 

Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters key; 

using (reader = File.OpenText(privateKeyFileName)) 
{ 
    key = (Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters)new PemReader(reader).ReadObject(); 
} 

cipher.Init(false, key); 

//Decrypting the input bytes 

byte[] decipheredBytes = cipher.ProcessBlock(cipheredBytes, 0, cipheredBytes.Length); 

MessageBox.Show(Encoding.UTF8.GetString(decipheredBytes)); 
1

करने के लिए परियोजना संदर्भ जोड़ने के लिए मत भूलना यहाँ एक संभव समाधान है कि RSACryptoServiceProvider में सार्वजनिक और निजी दोनों पीईएम फ़ाइलें पढ़ता है:

public class PemReaderB 
{ 
    public static RSACryptoServiceProvider GetRSAProviderFromPem(String pemstr) 
    { 
     CspParameters cspParameters = new CspParameters(); 
     cspParameters.KeyContainerName = "MyKeyContainer"; 
     RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParameters); 

     Func<RSACryptoServiceProvider, RsaKeyParameters, RSACryptoServiceProvider> MakePublicRCSP = (RSACryptoServiceProvider rcsp, RsaKeyParameters rkp) => 
     { 
      RSAParameters rsaParameters = DotNetUtilities.ToRSAParameters(rkp); 
      rcsp.ImportParameters(rsaParameters); 
      return rsaKey; 
     }; 

     Func<RSACryptoServiceProvider, RsaPrivateCrtKeyParameters, RSACryptoServiceProvider> MakePrivateRCSP = (RSACryptoServiceProvider rcsp, RsaPrivateCrtKeyParameters rkp) => 
     { 
      RSAParameters rsaParameters = DotNetUtilities.ToRSAParameters(rkp); 
      rcsp.ImportParameters(rsaParameters); 
      return rsaKey; 
     }; 

     PemReader reader = new PemReader(new StringReader(pemstr)); 
     object kp = reader.ReadObject(); 

     // If object has Private/Public property, we have a Private PEM 
     return (kp.GetType().GetProperty("Private") != null) ? MakePrivateRCSP(rsaKey, (RsaPrivateCrtKeyParameters)(((AsymmetricCipherKeyPair)kp).Private)) : MakePublicRCSP(rsaKey, (RsaKeyParameters)kp); 
    } 

    public static RSACryptoServiceProvider GetRSAProviderFromPemFile(String pemfile) 
    { 
     return GetRSAProviderFromPem(File.ReadAllText(pemfile).Trim()); 
    } 
} 

आशा इस कोई मदद करता है।

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

  • कोई संबंधित समस्या नहीं^_^