
Sometimes you may need to use encryption and decryption class in your C# project. Here is a simple class you can use for above purpose feel free to use it and feedback with improvement. This class use Advance Encryption Standers. and RijndaelManaged method.
/*******************************************************************
File: Crypter.cs
Author: Nayana Adassuriya
Description: Uses to encrypt or decrypt any string by symettric way (AES,RijndaelManaged)
Language: C#
Limitations: Encription key genaration hashes are hardcoded in the class.
If some one knows these hashes, they can crate programe to decript the encripted strings.
Thread Safe: no
Extendable: yes
Platform Depend: Windows,.NET 3.5
Project: None
*******************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace StorageService
{
internal class Crypter
{
//Data members
private static byte[] m_salt = Encoding.ASCII.GetBytes("41fb5b5ae4d57c5ee528adb00e5e8e74");
private static string m_encrypt_key = "200911381f7899d2482ab61fe8d15684469b17fc690";
/************************************************************************
Purpose : This is the method uses to encrypt plan strings.
Parameters : plan_test: text that need to be encrypted
Returns : encrypted string
Exception : If any exception while getting values from xml, pass to the upper level
Algorithm : C# manage code
Output : None
Notes : User can encrypt multiple times recursively if more security needs. If that
need to decrypt same number of rounds accordingly
*************************************************************************/
internal static string aesEncrypt(string plan_test)
{
string output = null;
RijndaelManaged aes_alg = null;
try
{
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(m_encrypt_key, m_salt);
aes_alg = new RijndaelManaged();
aes_alg.Key = key.GetBytes(aes_alg.KeySize / 8);
ICryptoTransform encryptor = aes_alg.CreateEncryptor(aes_alg.Key, aes_alg.IV);
using (MemoryStream encrypt_ms = new MemoryStream())
{
encrypt_ms.Write(BitConverter.GetBytes(aes_alg.IV.Length), 0, sizeof(int));
encrypt_ms.Write(aes_alg.IV, 0, aes_alg.IV.Length);
using (CryptoStream encrypt_cs = new CryptoStream(encrypt_ms, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter encrypt_sw = new StreamWriter(encrypt_cs))
{
encrypt_sw.Write(plan_test);
}
}
output = Convert.ToBase64String(encrypt_ms.ToArray());
}
}
catch (Exception e)
{
throw e;
}
finally
{
if (aes_alg != null)
{
aes_alg.Clear();
}
}
return output;
}
/************************************************************************
Purpose : This is the method uses to decrypt the encrypted strings.
Parameters : cipher_text: decrypted string need to decrypt to plan text
Returns : Plan text after decrypted
Exception : If any exception while getting values from xml, pass to the upper level
Algorithm : C# manage code
Output : None
Notes : User can encrypt multiple times recursively if more security needs. If
that need to decrypt same number of rounds accordingly.
*************************************************************************/
internal static string aesDecrypt(string cipher_text)
{
RijndaelManaged aes_alg = null;
string plain_text = null;
try
{
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(m_encrypt_key, m_salt);
byte[] bytes = Convert.FromBase64String(cipher_text);
using (MemoryStream decrypt_ms = new MemoryStream(bytes))
{
aes_alg = new RijndaelManaged();
aes_alg.Key = key.GetBytes(aes_alg.KeySize / 8);
aes_alg.IV = ReadByteArray(decrypt_ms);
ICryptoTransform decryptor = aes_alg.CreateDecryptor(aes_alg.Key, aes_alg.IV);
using (CryptoStream decrypt_cs = new CryptoStream(decrypt_ms, decryptor, CryptoStreamMode.Read))
{
using (StreamReader decrypt_sr = new StreamReader(decrypt_cs))
plain_text = decrypt_sr.ReadToEnd();
}
}
}
catch (Exception e)
{
throw e;
}
finally
{
if (aes_alg != null)
aes_alg.Clear();
}
return plain_text;
}
/************************************************************************
Purpose : Use to read first few bytes from cipher string( this helps to generate
the same key used in encrypt method again)
Parameters : stream: stream that use to read the cipher text bytes from memory.
Returns : return byte array filled with first few bytes of the cipher string.
Exception : If any exception while getting values from xml, pass to the upper level
Algorithm : C# manage code
Output : None
Notes : None
*************************************************************************/
private static byte[] ReadByteArray(Stream stream)
{
byte[] buffer;
byte[] row_length = new byte[sizeof(int)];
try
{
if (stream.Read(row_length, 0, row_length.Length) != row_length.Length)
{
throw new SystemException("encrypted string not contain properly formatted byte array");
}
int temp = BitConverter.ToInt32(row_length, 0);
buffer = new byte[temp];
if (stream.Read(buffer, 0, buffer.Length) != buffer.Length)
{
throw new SystemException("Did not read encrypted string properly");
}
}
catch (Exception e)
{
throw e;
}
return buffer;
}
}
}