65.9K
CodeProject is changing. Read more.
Home

Cryptography in C#

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.24/5 (37 votes)

Apr 15, 2004

1 min read

viewsIcon

238534

downloadIcon

9983

An article on cryptography in C#

Introduction

No so long ago, I faced a problem to keep passwords in my application. Passwords in my application were stored on hard drive in XML file, but in text mode, so anyone who has such rights to open this file, could view my passwords. So I decided to solve this problem by using cryptography and store only cipher of the passwords on hard drive. I did not need huge and complex algorithms like RSA or another open-key solutions, all I needed was just a simple class with two methods CryptoClass.Encrypt and CryptoClass.Decrypt. So look through MSDN library and search through Internet, but all information I found was a much more theoretical then practice. Also I found some examples at CodeProject, but one of them is about Web-Services security, and was too hard for my needs and another was an example in VB.NET in which I’m not so familiar with. After all that, I decided to write this simple cryptography class in C#. The way my class is different then other classes? Well I think it is pretty simple and good for use in small projects, and also maybe it will be useful for beginners. I commented code through each line, so I think these explanations would be enough.

Using the code

All you need to using this code in your projects is to compile code to dll, add a reference to you project from this dll and just create a new instance of crypto class in you project code, like:

Cryptography.Cryption Cryption = new Cryptography.Cryption(
  "Your key","Your vector");

Code Listing

public sealed class Cryption
  {
//members of the Cryption 
//algorithm type in my case it’s RijndaelManaged
    private RijndaelManaged Algorithm;
//memory stream
    private MemoryStream memStream;
//ICryptoTransform interface
    private ICryptoTransform EncryptorDecryptor;
//CryptoStream
    private CryptoStream crStream;
//Stream writer and Stream reader
    private StreamWriter strWriter;
    private StreamReader strReader;
//internal members
    private string m_key;
    private string m_iv;
//the Key and the Inicialization Vector
    private byte[] key;
    private byte[] iv;
//password view
    private string pwd_str;
    private byte[] pwd_byte;
//Constructor
    public Cryption(string key_val, string iv_val)
    {
      key = new byte[32];
      iv = new byte[32];

      int i;
      m_key = key_val;
      m_iv = iv_val;
//key calculation, depends on first constructor parameter
      for(i=0;i < m_key.Length;i++)
      {
        key[i] = Convert.ToByte(m_key[i]);
      }
//IV calculation, depends on second constructor parameter
      for(i=0;i < m_iv.Length;i++)
      {
        iv[i] = Convert.ToByte(m_iv[i]);
      }

    }
//Encrypt method implementation
    public string Encrypt(string s)
    {
//new instance of algorithm creation
      Algorithm = new RijndaelManaged();

//setting algorithm bit size
      Algorithm.BlockSize = 256;
      Algorithm.KeySize = 256;

//creating new instance of Memory stream
      memStream = new MemoryStream();

//creating new instance of the Encryptor
      EncryptorDecryptor = Algorithm.CreateEncryptor(key,iv);

//creating new instance of CryptoStream
      crStream = new CryptoStream(memStream, EncryptorDecryptor, 
      CryptoStreamMode.Write);

//creating new instance of Stream Writer
      strWriter = new StreamWriter(crStream);

//cipher input string
      strWriter.Write(s);

//clearing buffer for currnet writer and writing any 
//buffered data to //the underlying device
      strWriter.Flush();
      crStream.FlushFinalBlock();

//storing cipher string as byte array 
      pwd_byte = new byte[memStream.Length];
      memStream.Position = 0;
      memStream.Read(pwd_byte,0,(int)pwd_byte.Length);

//storing cipher string as Unicode string
      pwd_str = new UnicodeEncoding().GetString(pwd_byte);

      return pwd_str;
    }

//Decrypt method implementation 
    public string Decrypt(string s)
    {
//new instance of algorithm creation
      Algorithm = new RijndaelManaged();

//setting algorithm bit size
      Algorithm.BlockSize = 256;
      Algorithm.KeySize = 256;

//creating new Memory stream as stream for input string      
MemoryStream memStream = new MemoryStream(
   new UnicodeEncoding().GetBytes(s));

//Decryptor creating 
      ICryptoTransform EncryptorDecryptor = 
          Algorithm.CreateDecryptor(key,iv);

//setting memory stream position
      memStream.Position = 0;

//creating new instance of Crupto stream
      CryptoStream crStream = new CryptoStream(
          memStream,EncryptorDecryptor,CryptoStreamMode.Read);

//reading stream
      strReader = new StreamReader(crStream);

//returnig decrypted string
      return strReader.ReadToEnd();
    }
  }