using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace RsaDemo { public class RsaUtilities { public static void CreatePublicAndPrivateKeys() { using (var csp = new RSACryptoServiceProvider()) { //Generate Key //True:Public and Private Key, False: Just Public Key csp.ExportParameters(true); //Write Private Key var publicKey = csp.ToXmlString(true); File.WriteAllText("private", publicKey); Console.WriteLine("Private key generated and saved to disk as 'private'"); //Write Public Key var privateKey = csp.ToXmlString(false); File.WriteAllText("public", publicKey); Console.WriteLine("Public key generated and saved to disk as 'public'"); } } private static string m_PublicKeyXml = string.Empty; public static string PublicKeyXml { get { if (string.IsNullOrWhiteSpace(m_PublicKeyXml)) { if (!File.Exists("public")) throw new FileNotFoundException("public key not found for encrypting", "public"); else m_PublicKeyXml = File.ReadAllText("public"); } return m_PublicKeyXml; } } private static string m_PrivateKeyXml = string.Empty; public static string PrivateKeyXml { get { if (string.IsNullOrWhiteSpace(m_PrivateKeyXml)) { if (!File.Exists("private")) throw new FileNotFoundException("private key not found for encrypting", "private"); else m_PrivateKeyXml = File.ReadAllText("private"); } return m_PrivateKeyXml; } } public static string Encrypt(string plainText) { byte[] encryptedByteArray; using (var csp = new RSACryptoServiceProvider()) { csp.FromXmlString(PublicKeyXml); encryptedByteArray = csp.Encrypt(Encoding.UTF8.GetBytes(plainText), false); } return Convert.ToBase64String(encryptedByteArray); } public static string Decrypt(string encryptedText) { using (var csp = new RSACryptoServiceProvider()) { csp.FromXmlString(PrivateKeyXml); var encryptedByteArray = Convert.FromBase64String(encryptedText); var decryptedByteArray = csp.Decrypt(encryptedByteArray, false); return Encoding.UTF8.GetString(decryptedByteArray); } } } class Program { static void Main(string[] args) { // RsaUtilities.CreatePublicAndPrivateKeys(); string plainText = "foobar"; Console.WriteLine($"Plain Text: {plainText}"); string encryptedText = RsaUtilities.Encrypt(plainText); Console.WriteLine($"Encrypted Text: {encryptedText}"); string decryptedText = RsaUtilities.Decrypt(encryptedText); Console.WriteLine($"Decrypted Text: {decryptedText}"); } } }