- Generating RSA key pair
- Creating a CSR file
- Generating a Checksum
- Encrypting with private key
- Reading a certificate file
- Verifying a signature

So while I was googling for hints, I came across this free library called OpenSSL.NET which looked promising. Find the code below which I use to accomplish the above tasks.

This function generates an RSA key pair and returns a CryptoKey object. The length of the keys are hard-coded to be 2048.

/// <summary> /// Generates a 2048 bit RSA key pair. /// </summary> /// <returns>The key container</returns> public static CryptoKey GenerateRsaKeyPair() { using(var rsa = new RSA()) { rsa.GenerateKeys(2048, 0x10021, null, null); return new CryptoKey(rsa); } }

The following function takes in a RSA key and creates a CSR file. I have used a DTO to pass in the additional details needed for the CSR generation.

/// <summary> /// Generates a CSR file content according to the details given. /// </summary> /// <param name="csr">CSR details</param> /// /// <param name="key">RSA key</param> /// <returns>The CSR file content</returns> public static string GenerateCsr(CsrProperties csr, CryptoKey key) { using (var subject = new X509Name { Country = csr.CountryName, Organization = csr.OrganizationName, OrganizationUnit = csr.OrganizationalUnitName, SerialNumber = csr.SerialNumber, Common = csr.CommonName }) { using (var req = new X509Request(0, subject, key)) { return req.PEM; } } }

For Checksum generation, which is also knowing as generating the hash, I used the following code. The algorithm was SHA256.

/// <summary> /// Generates checksum using SHA256 algorithm. /// </summary> /// <param name="payLoad">Data to be used for hashing</param> /// <returns>The hash</returns> public static byte[] GenerateChecksum(byte[] payLoad) { using (var algo = new SHA256Managed()) { return algo.ComputeHash(payLoad); } }

To do RSA encryption, I used .NET's native cryptography methods.

/// <summary> /// Encrypts the data using RSA key. /// </summary> /// <param name="payLoad">Data to be encrypted</param> /// <param name="key">RSA key</param> /// <returns>The encrypted data</returns> public static byte[] Encrypt(byte[] payLoad, CryptoKey key) { using (var rsa = key.GetRSA()) { return rsa.PrivateEncrypt(payLoad, RSA.Padding.PKCS1); } }

Well that's about it for now. I will update this with more functions as I move on.

Cheers!