Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Cryptography in C#

0.00/5 (No votes)
14 Apr 2004 1  
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();
    }
  }

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here