Here is a class that handles symmetric encryption and decryption using the .NET Rijndael provider. This works well when passing data that you need to keep encrypted over a URL. Remember to UrlEncode the resulting Base64 string with Server.UrlEncode() if you plan on passing your encrypted string as part of the Query String. I tried to boil it down to its simplest form.
You can download a sample solution:
http://download.binaryocean.com/SymmetricEncryptionSolution.zip
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// Simple symmetric encryption using the .NET Rijndael provider
/// </summary>
public class SymmetricEncryption
{
public SymmetricEncryption()
{
}
public SymmetricEncryption(string password)
{
GenerateKey(password);
}
public string Password
{
set { GenerateKey(value); }
}
private byte[] Key;
private byte[] Vector;
private void GenerateKey(string password)
{
SHA384Managed sha = new SHA384Managed();
byte[] b = sha.ComputeHash(new ASCIIEncoding().GetBytes(password));
Key = new byte[32];
Vector = new byte[16];
Array.Copy(b, 0, Key, 0, 32);
Array.Copy(b, 32, Vector, 0, 16);
}
public string Encrypt(string plainText, string password)
{
GenerateKey(password);
return Encrypt(plainText);
}
public string Encrypt(string plainText)
{
if (Key == null)
{
throw new InvalidOperationException("Password must be provided or set.");
}
byte[] data = new ASCIIEncoding().GetBytes(plainText);
RijndaelManaged crypto = new RijndaelManaged();
ICryptoTransform encryptor = crypto.CreateEncryptor(Key, Vector);
MemoryStream memoryStream = new MemoryStream();
CryptoStream crptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
crptoStream.Write(data, 0, data.Length);
crptoStream.FlushFinalBlock();
crptoStream.Close();
memoryStream.Close();
return Convert.ToBase64String(memoryStream.ToArray());
}
public string Decrypt(string encryptedText, string password)
{
GenerateKey(password);
return Decrypt(encryptedText);
}
public string Decrypt(string encryptedText)
{
if (Key == null)
{
throw new InvalidOperationException("Password must be provided or set.");
}
byte[] cipher = Convert.FromBase64String(encryptedText);
RijndaelManaged crypto = new RijndaelManaged();
ICryptoTransform encryptor = crypto.CreateDecryptor(Key, Vector);
MemoryStream memoryStream = new MemoryStream(cipher);
CryptoStream crptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Read);
byte[] data = new byte[cipher.Length];
int dataLength = crptoStream.Read(data, 0, data.Length);
memoryStream.Close();
crptoStream.Close();
return (new ASCIIEncoding()).GetString(data, 0, dataLength);
}
}