ARCHIVE NOTICE

My website can still be found at industrialcuriosity.com, but I have not been posting on this blog as I've been primarily focused on therightstuff.medium.com - please head over there and take a look!

Wednesday 4 October 2017

C# / OpenSSH RSA Encryption made easy

[EDIT: please see C# / OPENSSH RSA ENCRYPTION MADE EVEN EASIER]

The struggle to uncover the secrets of importing from and export to OpenSSH keys with Microsoft's .NET RSACryptoServiceProvider is real. It's possible but not practical to do this without BouncyCastle, which may or may not be well-documented (navigating their website is far from a joyful experience), but after trawling the web and playing around I've created the following gists that should be of assistance to anyone who needs to do this in a straightforward manner.
And if you want to share RSA keys between JavaScript and .NET platforms, well, you're going to need to do this.
Import and export RSA Keys between C# and PEM format using BouncyCastle
And just because the actual encryption and decryption are always annoying:
Simple RSA Encryption to and Decryption from Base64 encoded strings in C#

2 comments:

  1. Hi guy!
    When i run method "runTests()", i have a problem
    "
    System.InvalidCastException: 'Unable to cast object of type 'Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters' to type 'Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair'.'

    "
    in method:
    public static RSACryptoServiceProvider ImportPublicKey(string pem)
    {
    var reader = new StringReader(pem);
    PemReader pr = new PemReader(reader);
    AsymmetricCipherKeyPair publicKey = (AsymmetricCipherKeyPair)pr.ReadObject();
    RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaKeyParameters)publicKey.Public);

    RSACryptoServiceProvider csp = new RSACryptoServiceProvider();// cspParams);
    csp.ImportParameters(rsaParams);
    return csp;
    }
    Line: AsymmetricCipherKeyPair publicKey = (AsymmetricCipherKeyPair)pr.ReadObject();

    can you help fix it1
    Thank so much!

    ReplyDelete
    Replies
    1. Hi - your code is different to the gists, in particular your ImportPublicKey is using AsymmetricCipherKeyPair (which I use for ImportPrivateKey) whereas the gists use AsymmetricKeyParameter. Hope that helps!

      Delete