Click here to Skip to main content
Click here to Skip to main content
Go to top

Cryptography in C#

, 14 Apr 2004
Rate this:
Please Sign up or sign in to vote.
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

Share

About the Author

Alex Getman
Web Developer
Ukraine Ukraine

Comments and Discussions

 
QuestionNot Working On Decrypt Pinmembercrazy_louisth8-Jan-14 18:03 
GeneralHelp me to resolve this problem PinmemberCryptogrpahy16-Mar-09 12:32 
GeneralA more elegant code PinmemberElmue29-Jan-08 7:18 
GeneralNice class, but you forgot to mention something... PinmemberDarkwinter4-Dec-07 0:12 
NewsTwo other related encryption articles in CodeProject ... PinmemberTony Selke27-Sep-07 7:10 
GeneralThe decryption using the above logic fails!!!! PinmemberRageesh7-Apr-06 11:57 
GeneralMaybe you have changed the code in some way? The code works fine at my PC PinmemberAlex Getman3-May-06 2:53 
GeneralRe: The decryption using the above logic fails!!!! [modified] Pinmemberspamshit26-Jun-06 5:42 
GeneralRe: The decryption using the above logic fails!!!! PinmemberAlex Getman5-Jul-06 20:39 
GeneralRe: The decryption using the above logic fails!!!! Pinmemberdamicolo19-Sep-06 23:00 
GeneralRe: The decryption using the above logic fails!!!! PinmemberNick Lucas16-Jan-07 4:53 
GeneralRe: The decryption using the above logic fails!!!! Pinmemberwinnypolo2-Oct-07 4:32 
GeneralThanks PinmemberD@vid.drx3-Feb-06 5:33 
GeneralThanks man... Pinmembergrimsonblade8-Sep-05 7:23 
GeneralProblem with web application..... Pinmembertaithien9-Aug-05 23:47 
Generalnice simple app, but ... PinmemberLordas4-Jul-04 22:57 
GeneralRe: nice simple app, but ... PinmemberCarlos Groba23-Feb-06 22:05 
Generalmsdn on cryptography... Pinmemberrugha19-Apr-04 22:16 
Generalwhere to store the key PinmemberCorinna John15-Apr-04 3:03 
GeneralPasswords and cryptography PinmemberPecuchet15-Apr-04 2:55 
GeneralOne-liner encryption for the lazy... PinmemberMicrosoftBob15-Apr-04 10:14 
GeneralRe: One-liner encryption for the lazy... PinsussAnonymous16-Apr-04 2:03 
GeneralRe: One-liner encryption for the lazy... PinmemberMicrosoftBob16-Apr-04 2:25 
GeneralRe: One-liner encryption for the lazy... PinsussAnonymous16-Apr-04 2:03 
GeneralRe: Passwords and cryptography Pinmemberandrew_g16-Apr-04 6:07 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web04 | 2.8.140926.1 | Last Updated 15 Apr 2004
Article Copyright 2004 by Alex Getman
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid