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}");
}
}
}