Friday, September 4, 2009

Using Triple DES, creating Keys and IV

Many a times I come with across doing encryption/decryption stuff. Just learned about TripleDES which is now being recommended as one of the best encryption algo. Long time back I dealt with issue of generating Key and using 3DES with this key. I was not able to find out a complete solution anywhere on web. Ahh but ppl came around asking again for this .. hopefully you will find this useful.

I am creating a web site application (so not a MOSS post this time) which will encrypt, decrypt and generate MachineKey using your private key. This machine key is needed if you dont want your clear text private key to be stored/communicate over net.

This is VS2008 web site cs file code snippet below

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Security.Cryptography;
using System.Text;
public partial class KeyFor3DES : System.Web.UI.Page
{
private string Key = "MyNameIsAmitabhWankhede";
private readonly byte[] IVector = new byte[8] { 55, 26, 80, 63, 100, 82, 46, 120 };
protected void Page_Load(object sender, EventArgs e)
{
string inpstring = "This is some secured data which needs to be encrypted";
Response.Write(Encrypt(inpstring));
Response.Write("
");
Response.Write(Decrypt(Encrypt(inpstring)));
Response.Write("
");
TripleDESCryptoServiceProvider myKey = GetKey(Key);
Response.Write("
");
Response.Write(CreateMachineKeyFor3DES(48, myKey.Key));
}
private string Encrypt(string inputString)
{
byte[] buffer = Encoding.ASCII.GetBytes(inputString);
TripleDESCryptoServiceProvider tripleDes = GetKey(Key);
ICryptoTransform ITransform = tripleDes.CreateEncryptor();
return Convert.ToBase64String(ITransform.TransformFinalBlock(buffer, 0, buffer.Length));
}
private string Decrypt(string inputString)
{
byte[] buffer = Convert.FromBase64String(inputString);
TripleDESCryptoServiceProvider tripleDes = GetKey(Key);
ICryptoTransform ITransform = tripleDes.CreateDecryptor();
return Encoding.ASCII.GetString(ITransform.TransformFinalBlock(buffer, 0, buffer.Length));
}
private TripleDESCryptoServiceProvider GetKey(string pKey)
{
TripleDESCryptoServiceProvider tripleDes = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();
tripleDes.Key = MD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(pKey));
tripleDes.IV = IVector;
return tripleDes;
}

public string CreateMachineKeyFor3DES(int length, byte[] randomBytes)
{
//byte[] randomBytes = new byte[length / 2];
RNGCryptoServiceProvider rngProvider = new RNGCryptoServiceProvider();
//Fill the bytearray with random bytes
rngProvider.GetBytes(randomBytes);
//Stringbuilder to hold result once convertd to hexadecimal
StringBuilder strBldrMacKey = new StringBuilder(length);
//loop thru the random byte and append each value to strin builder
for (int i = 0; i < randomBytes.Length; i++)
{
strBldrMacKey.Append(string.Format("{0:X2}",randomBytes[i]));
}
return strBldrMacKey.ToString();
}
}

No comments:

Post a Comment