michalsimon
4/28/2016 - 4:52 PM

RSA Algorithm Sample

RSA Algorithm Sample

public class RSASample
{
	public static void Run()
	{
		string keyContainerName = "MyKeyContainer";
		string clearText = "This is the data we want to encrypt!";
		var cspParams = new CspParameters();
		cspParams.KeyContainerName = keyContainerName;
		RSAParameters publicKey;
		RSAParameters privateKey;
		using (var rsa = new RSACryptoServiceProvider(cspParams))
		{
			rsa.PersistKeyInCsp = true;
			publicKey = rsa.ExportParameters(false);
			privateKey = rsa.ExportParameters(true);
			rsa.Clear();
		}

		byte[] encrypted = EncryptUsingRSAParam(clearText, publicKey);
		string decrypted = DecryptUsingRSAParam(encrypted, privateKey);
		Console.WriteLine("Asymmetric RSA");
		Console.WriteLine("Asymmetric RSA - Using RSA Params");
		Console.WriteLine("Encrypted:{0}", Convert.ToBase64String(encrypted));
		Console.WriteLine("Decrypted:{0}", decrypted);
		Console.WriteLine();
		Console.WriteLine("Asymmetric RSA - Using Persistent Key Container");
		encrypted = EncryptUsingContainer(clearText, keyContainerName);
		decrypted = DecryptUsingContainer(encrypted, keyContainerName);
		Console.WriteLine("Encrypted:{0}", Convert.ToBase64String(encrypted));
		Console.WriteLine("Decrypted:{0}", decrypted);
		Console.WriteLine();
	}

	static byte[] EncryptUsingRSAParam(string value, RSAParameters rsaKeyInfo)
	{
		using (var rsa = new RSACryptoServiceProvider())
		{
			rsa.ImportParameters(rsaKeyInfo);
			byte[] encodedData = Encoding.Default.GetBytes(value);
			byte[] encryptedData = rsa.Encrypt(encodedData, true);
			rsa.Clear();
			return encryptedData;
		}
	}

	static string DecryptUsingRSAParam(byte[] encryptedData, RSAParameters rsaKeyInfo)
	{
		using (var rsa = new RSACryptoServiceProvider())
		{
			rsa.ImportParameters(rsaKeyInfo);
			byte[] decryptedData = rsa.Decrypt(encryptedData, true);
			string decryptedValue = Encoding.Default.GetString(decryptedData);
			rsa.Clear();
			return decryptedValue;
		}
	}

	static byte[] EncryptUsingContainer(string value, string containerName)
	{
		var cspParams = new CspParameters();
		cspParams.KeyContainerName = containerName;
		using (var rsa = new RSACryptoServiceProvider(cspParams))
		{
			byte[] encodedData = System.Text.Encoding.Default.GetBytes(value);
			byte[] encryptedData = rsa.Encrypt(encodedData, true);
			rsa.Clear();
			return encryptedData;
		}
	}

	static string DecryptUsingContainer(byte[] encryptedData, string containerName)
	{
		var cspParams = new CspParameters();
		cspParams.KeyContainerName = containerName;
		using (var rsa = new RSACryptoServiceProvider(cspParams))
		{
			byte[] decryptedData = rsa.Decrypt(encryptedData, true);
			string decryptedValue = Encoding.Default.GetString(decryptedData);
			rsa.Clear();
			return decryptedValue;
		}
	}
}