.NET Private Key Rsa Encryption

20,358

Solution 1

You should be aware of the Bouncycastle C# library. There are in particular two very useful classes: Org.BouncyCastle.OpenSsl.PemReader which will convert from the openssl style key you have to a bouncycastle key object, and Org.BouncyCastle.Security.DotNetUtilities, which will convert a bouncycastle key to a .NET RSAParameters object.

Here is a tiny bit of untested code that shows how to use it

using System;
using System.IO;
using System.Security.Cryptography;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto.Parameters;

namespace RSAOpensslToDotNet
{
    class Program
    {
        static void Main(string[] args)
        {
            StreamReader sr = new StreamReader("../../privatekey.pem");
            PemReader pr = new PemReader(sr);
            AsymmetricCipherKeyPair KeyPair = (AsymmetricCipherKeyPair)pr.ReadObject();
            RSAParameters rsa = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)KeyPair.Private);
        }
    }
}

Solution 2

I guess that is what are you looking for:

    // Import ASymmetric RSA Key from a system file.
    public static RSAParameters ImportRSAKey(String fileName)
    {

        // Create a stream to a the specified system file.
        Stream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

        // Extract/Deserialize the key from the file.
        IFormatter soapFormatter = new SoapFormatter();            
        RSAParameters rsaParameter = 
           (RSAParameters) soapFormatter.Deserialize(fileStream);

        // Close the file stream.
        fileStream.Close();

        return rsaParameter;

    }

To generate a new key, you can use RSACryptoServiceProvider.ExportParameters method.


Refer to the following:

RSAParameters Structure

Share:
20,358

Related videos on Youtube

Steve Kiss
Author by

Steve Kiss

Updated on July 09, 2022

Comments

  • Steve Kiss
    Steve Kiss almost 2 years

    I need to encrypt a string using an RSA 1.5 algorithm. I have been provided with a private key. However, I cannot for the life of me figure out how to add this key to the class. It seems as tho the key needs to be of type RSAParameter stuct. However this requires a set of values I have not been given such as Modulus, Exponent, P, Q, etc.. All I have is the private key. Can anyone help?

    • Steve Kiss
      Steve Kiss about 13 years
      The key I have been provided looks like -----BEGIN RSA PRIVATE KEY-----MIIadfdafCXdfawIBAAKBgQCIgynd6pvlCF= -----END RSA PRIVATE KEY----- -----BEGIN PUBLIC KEY-----jaz+wadfadIDAQAB -----END PUBLIC KEY----- This is all I have..
  • Steve Kiss
    Steve Kiss about 13 years
    Thank you!! This is exactly what I needed.
  • MattyP
    MattyP almost 12 years
    I've been looking in a lot of places for exactly this... Thanks!
  • C0D3
    C0D3 about 11 years
    I need this exact thing to be done in Java. When I use the pr.readObject() it is returning PEMKeyPair and throwing an exception when I cast it to AsymmetricCipherKeyPair. I cannot figure out why for the life of me. Please help!
  • mikerobi
    mikerobi over 9 years
    Raises an InvalidCastException for me.
  • President James K. Polk
    President James K. Polk over 9 years
    @mikerobi: Are you sure your keyfile contains a private key?
  • monty
    monty over 4 years
    for those using Bouncy Castle under Linux/Docker: github.com/bcgit/bc-csharp/issues/160