Click here to Skip to main content
Click here to Skip to main content

Cryptography in C#

By , 14 Apr 2004
 

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

About the Author

Alex Getman
Web Developer
Ukraine Ukraine
Member

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralHelp me to resolve this problemmemberCryptogrpahy16 Mar '09 - 12:32 
GeneralA more elegant codememberElmue29 Jan '08 - 7:18 
GeneralNice class, but you forgot to mention something...memberDarkwinter4 Dec '07 - 0:12 
NewsTwo other related encryption articles in CodeProject ...memberTony Selke27 Sep '07 - 7:10 
GeneralThe decryption using the above logic fails!!!!memberRageesh7 Apr '06 - 11:57 
GeneralMaybe you have changed the code in some way? The code works fine at my PCmemberAlex Getman3 May '06 - 2:53 
GeneralRe: The decryption using the above logic fails!!!! [modified]memberspamshit26 Jun '06 - 5:42 
GeneralRe: The decryption using the above logic fails!!!!memberAlex Getman5 Jul '06 - 20:39 
GeneralRe: The decryption using the above logic fails!!!!memberdamicolo19 Sep '06 - 23:00 
GeneralRe: The decryption using the above logic fails!!!!memberNick Lucas16 Jan '07 - 4:53 
GeneralRe: The decryption using the above logic fails!!!!memberwinnypolo2 Oct '07 - 4:32 
GeneralThanksmemberD@vid.drx3 Feb '06 - 5:33 
GeneralThanks man...membergrimsonblade8 Sep '05 - 7:23 
GeneralProblem with web application.....membertaithien9 Aug '05 - 23:47 
Generalnice simple app, but ...memberLordas4 Jul '04 - 22:57 
GeneralRe: nice simple app, but ...memberCarlos Groba23 Feb '06 - 22:05 
Generalmsdn on cryptography...memberrugha19 Apr '04 - 22:16 
Generalwhere to store the keymemberCorinna John15 Apr '04 - 3:03 
GeneralPasswords and cryptographymemberPecuchet15 Apr '04 - 2:55 
GeneralOne-liner encryption for the lazy...memberMicrosoftBob15 Apr '04 - 10:14 
GeneralRe: One-liner encryption for the lazy...sussAnonymous16 Apr '04 - 2:03 
GeneralRe: One-liner encryption for the lazy...memberMicrosoftBob16 Apr '04 - 2:25 
GeneralRe: One-liner encryption for the lazy...sussAnonymous16 Apr '04 - 2:03 
GeneralRe: Passwords and cryptographymemberandrew_g16 Apr '04 - 6:07 
GeneralRe: Passwords and cryptographymemberPecuchet16 Apr '04 - 6:32 

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

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 15 Apr 2004
Article Copyright 2004 by Alex Getman
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid