Click here to Skip to main content
15,881,600 members
Articles / Programming Languages / C#
Article

Cryptography in C#

Rate me:
Please Sign up or sign in to vote.
4.24/5 (42 votes)
14 Apr 20041 min read 235K   10K   51   27
An article on cryptography in C#

Image 1

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:

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

Code Listing

C#
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


Written By
Web Developer
Ukraine Ukraine

Comments and Discussions

 
GeneralMy vote of 1 Pin
Pedro Lima7-Sep-16 7:43
Pedro Lima7-Sep-16 7:43 
code is not optimized or formated at all
QuestionNot Working On Decrypt Pin
crazy_louisth8-Jan-14 18:03
crazy_louisth8-Jan-14 18:03 
GeneralHelp me to resolve this problem Pin
Cryptogrpahy16-Mar-09 12:32
Cryptogrpahy16-Mar-09 12:32 
GeneralA more elegant code Pin
Elmue29-Jan-08 7:18
Elmue29-Jan-08 7:18 
GeneralNice class, but you forgot to mention something... Pin
Darkwinter4-Dec-07 0:12
Darkwinter4-Dec-07 0:12 
NewsTwo other related encryption articles in CodeProject ... Pin
Tony Selke27-Sep-07 7:10
Tony Selke27-Sep-07 7:10 
GeneralThe decryption using the above logic fails!!!! Pin
Rageesh7-Apr-06 11:57
Rageesh7-Apr-06 11:57 
GeneralMaybe you have changed the code in some way? The code works fine at my PC Pin
Alex Getman3-May-06 2:53
Alex Getman3-May-06 2:53 
GeneralRe: The decryption using the above logic fails!!!! [modified] Pin
spamshit26-Jun-06 5:42
spamshit26-Jun-06 5:42 
GeneralRe: The decryption using the above logic fails!!!! Pin
Alex Getman5-Jul-06 20:39
Alex Getman5-Jul-06 20:39 
GeneralRe: The decryption using the above logic fails!!!! Pin
damicolo19-Sep-06 23:00
damicolo19-Sep-06 23:00 
GeneralRe: The decryption using the above logic fails!!!! Pin
Nick Lucas16-Jan-07 4:53
Nick Lucas16-Jan-07 4:53 
GeneralRe: The decryption using the above logic fails!!!! Pin
winnypolo2-Oct-07 4:32
winnypolo2-Oct-07 4:32 
GeneralThanks Pin
D@vid.drx3-Feb-06 5:33
D@vid.drx3-Feb-06 5:33 
GeneralThanks man... Pin
grimsonblade8-Sep-05 7:23
grimsonblade8-Sep-05 7:23 
GeneralProblem with web application..... Pin
taithien9-Aug-05 23:47
taithien9-Aug-05 23:47 
Generalnice simple app, but ... Pin
Lordas4-Jul-04 22:57
Lordas4-Jul-04 22:57 
GeneralRe: nice simple app, but ... Pin
Carlos Groba23-Feb-06 22:05
Carlos Groba23-Feb-06 22:05 
Generalmsdn on cryptography... Pin
rugha19-Apr-04 22:16
rugha19-Apr-04 22:16 
Generalwhere to store the key Pin
Corinna John15-Apr-04 3:03
Corinna John15-Apr-04 3:03 
GeneralPasswords and cryptography Pin
Pecuchet15-Apr-04 2:55
Pecuchet15-Apr-04 2:55 
GeneralOne-liner encryption for the lazy... Pin
MicrosoftBob15-Apr-04 10:14
MicrosoftBob15-Apr-04 10:14 
GeneralRe: One-liner encryption for the lazy... Pin
Anonymous16-Apr-04 2:03
Anonymous16-Apr-04 2:03 
GeneralRe: One-liner encryption for the lazy... Pin
MicrosoftBob16-Apr-04 2:25
MicrosoftBob16-Apr-04 2:25 
GeneralRe: One-liner encryption for the lazy... Pin
Anonymous16-Apr-04 2:03
Anonymous16-Apr-04 2:03 

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

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