C# Tutorials and offshore development in India
    Tutorials   Resources   Forum   Reviews   Communities   Interview   Jobs   Projects   Training   Your Ad Here    
Silverlight Games | Mentor | Code Converter | Articles | Code Factory | Computer Jokes | Members | Peer Appraisal | IT Companies | Bookmarks | Polls | Revenue Sharing | Lobby | Gift Shop |


Prizes & Awards
My Profile



Active Members
TodayLast 7 Days more...






Resources » Code Snippets » Encryption »

How to encript and decript a password


Posted Date: 30 Apr 2008    Resource Type: Code Snippets    Category: Encryption
Author: Jins PhilipMember Level: Gold    
Rating: 1 out of 5Points: 20



The following code snippet help u to encript and decript ur password
__________________________________________________________


using System;
using System.IO;
using System.Security.Cryptography;

namespace STSL_Common.Crypto
{
public class Cryptor
{
#region ---Encrypt---
// Encrypt a byte array into a byte array using a key and an IV
static string _Password = "";

public static string Password
{
get { return _Password; }
}
static Cryptor()
{
throw new NotImplementedException("Passsword not initialized");
Stream obj =
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("RegistryAccess.Key.txt");
byte[] Out = new byte[obj.Length];
obj.Read(Out, 0, Out.Length);
_Password = new System.Text.ASCIIEncoding().GetString(Out);
}

public static byte[] Encrypt(byte[] clearData, byte[] Key, byte[] IV)
{

// Create a MemoryStream that is going to accept the encrypted bytes

MemoryStream ms = new MemoryStream();



// Create a symmetric algorithm.

// We are going to use Rijndael because it is strong and available on all platforms.

// You can use other algorithms, to do so substitute the next line with something like

// TripleDES alg = TripleDES.Create();

Rijndael alg = Rijndael.Create();



// Now set the key and the IV.

// We need the IV (Initialization Vector) because the algorithm is operating in its default

// mode called CBC (Cipher Block Chaining). The IV is XORed with the first block (8 byte)

// of the data before it is encrypted, and then each encrypted block is XORed with the

// following block of plaintext. This is done to make encryption more secure.

// There is also a mode called ECB which does not need an IV, but it is much less secure.

alg.Key = Key;

alg.IV = IV;



// Create a CryptoStream through which we are going to be pumping our data.

// CryptoStreamMode.Write means that we are going to be writing data to the stream

// and the output will be written in the MemoryStream we have provided.

CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);



// Write the data and make it do the encryption

cs.Write(clearData, 0, clearData.Length);



// Close the crypto stream (or do FlushFinalBlock).

// This will tell it that we have done our encryption and there is no more data coming in,

// and it is now a good time to apply the padding and finalize the encryption process.

cs.Close();



// Now get the encrypted data from the MemoryStream.

// Some people make a mistake of using GetBuffer() here, which is not the right way.

byte[] encryptedData = ms.ToArray();



return encryptedData;

}


// Encrypt a string into a string using a password

// Uses Encrypt(byte[], byte[], byte[])
public static string Encrypt(string clearText)
{

// First we need to turn the input string into a byte array.

byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText);



// Then, we need to turn the password into Key and IV

// We are using salt to make it harder to guess our key using a dictionary attack -

// trying to guess a password by enumerating all possible words.

PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,

new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });



// Now get the key/IV and do the encryption using the function that accepts byte arrays.

// Using PasswordDeriveBytes object we are first getting 32 bytes for the Key

// (the default Rijndael key length is 256bit = 32bytes) and then 16 bytes for the IV.

// IV should always be the block size, which is by default 16 bytes (128 bit) for Rijndael.

// If you are using DES/TripleDES/RC2 the block size is 8 bytes and so should be the IV size.

// You can also read KeySize/BlockSize properties off the algorithm to find out the sizes.

byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16));



// Now we need to turn the resulting byte array into a string.

// A common mistake would be to use an Encoding class for that. It does not work

// because not all byte values can be represented by characters.

// We are going to be using Base64 encoding that is designed exactly for what we are

// trying to do.

return Convert.ToBase64String(encryptedData);



}
// Encrypt bytes into bytes using a password

// Uses Encrypt(byte[], byte[], byte[])
public static byte[] Encrypt(byte[] clearData)
{

// We need to turn the password into Key and IV.

// We are using salt to make it harder to guess our key using a dictionary attack -

// trying to guess a password by enumerating all possible words.

PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,

new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });



// Now get the key/IV and do the encryption using the function that accepts byte arrays.

// Using PasswordDeriveBytes object we are first getting 32 bytes for the Key

// (the default Rijndael key length is 256bit = 32bytes) and then 16 bytes for the IV.

// IV should always be the block size, which is by default 16 bytes (128 bit) for Rijndael.

// If you are using DES/TripleDES/RC2 the block size is 8 bytes and so should be the IV size.

// You can also read KeySize/BlockSize properties off the algorithm to find out the sizes.

return Encrypt(clearData, pdb.GetBytes(32), pdb.GetBytes(16));



}
public static void Encrypt(string fileIn, string fileOut)
{

// First we are going to open the file streams

FileStream fsIn = new FileStream(fileIn, FileMode.Open, FileAccess.Read);

FileStream fsOut = new FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write);



// Then we are going to derive a Key and an IV from the Password and create an algorithm

PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,

new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });



Rijndael alg = Rijndael.Create();



alg.Key = pdb.GetBytes(32);

alg.IV = pdb.GetBytes(16);



// Now create a crypto stream through which we are going to be pumping data.

// Our fileOut is going to be receiving the encrypted bytes.

CryptoStream cs = new CryptoStream(fsOut, alg.CreateEncryptor(), CryptoStreamMode.Write);



// Now will will initialize a buffer and will be processing the input file in chunks.

// This is done to avoid reading the whole file (which can be huge) into memory.

int bufferLen = 4096;

byte[] buffer = new byte[bufferLen];

int bytesRead;



do
{

// read a chunk of data from the input file

bytesRead = fsIn.Read(buffer, 0, bufferLen);



// encrypt it

cs.Write(buffer, 0, bytesRead);



} while (bytesRead != 0);



// close everything

cs.Close(); // this will also close the unrelying fsOut stream

fsIn.Close();

}
public static void Encrypt(Stream StreamIn,string fileOut )
{
throw new NotImplementedException();
}
#endregion

#region ---Decrypt---
// Decrypt a byte array into a byte array using a key and an IV
public static byte[] Decrypt(byte[] cipherData, byte[] Key, byte[] IV)
{

// Create a MemoryStream that is going to accept the decrypted bytes

MemoryStream ms = new MemoryStream();



// Create a symmetric algorithm.

// We are going to use Rijndael because it is strong and available on all platforms.

// You can use other algorithms, to do so substitute the next line with something like

// TripleDES alg = TripleDES.Create();

Rijndael alg = Rijndael.Create();



// Now set the key and the IV.

// We need the IV (Initialization Vector) because the algorithm is operating in its default

// mode called CBC (Cipher Block Chaining). The IV is XORed with the first block (8 byte)

// of the data after it is decrypted, and then each decrypted block is XORed with the previous

// cipher block. This is done to make encryption more secure.

// There is also a mode called ECB which does not need an IV, but it is much less secure.

alg.Key = Key;

alg.IV = IV;



// Create a CryptoStream through which we are going to be pumping our data.

// CryptoStreamMode.Write means that we are going to be writing data to the stream

// and the output will be written in the MemoryStream we have provided.

CryptoStream cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write);



// Write the data and make it do the decryption

cs.Write(cipherData, 0, cipherData.Length);



// Close the crypto stream (or do FlushFinalBlock).

// This will tell it that we have done our decryption and there is no more data coming in,

// and it is now a good time to remove the padding and finalize the decryption process.

cs.Close();



// Now get the decrypted data from the MemoryStream.

// Some people make a mistake of using GetBuffer() here, which is not the right way.

byte[] decryptedData = ms.ToArray();



return decryptedData;

}
// Decrypt a string into a string using a password

// Uses Decrypt(byte[], byte[], byte[])
public static string Decrypt(string cipherText)
{

// First we need to turn the input string into a byte array.

// We presume that Base64 encoding was used

byte[] cipherBytes = Convert.FromBase64String(cipherText);



// Then, we need to turn the password into Key and IV

// We are using salt to make it harder to guess our key using a dictionary attack -

// trying to guess a password by enumerating all possible words.

PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,

new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });



// Now get the key/IV and do the decryption using the function that accepts byte arrays.

// Using PasswordDeriveBytes object we are first getting 32 bytes for the Key

// (the default Rijndael key length is 256bit = 32bytes) and then 16 bytes for the IV.

// IV should always be the block size, which is by default 16 bytes (128 bit) for Rijndael.

// If you are using DES/TripleDES/RC2 the block size is 8 bytes and so should be the IV size.

// You can also read KeySize/BlockSize properties off the algorithm to find out the sizes.

byte[] decryptedData = Decrypt(cipherBytes, pdb.GetBytes(32), pdb.GetBytes(16));



// Now we need to turn the resulting byte array into a string.

// A common mistake would be to use an Encoding class for that. It does not work

// because not all byte values can be represented by characters.

// We are going to be using Base64 encoding that is designed exactly for what we are

// trying to do.

return System.Text.Encoding.Unicode.GetString(decryptedData);



}
// Decrypt bytes into bytes using a password

// Uses Decrypt(byte[], byte[], byte[])
public static byte[] Decrypt(byte[] cipherData)
{

// We need to turn the password into Key and IV.

// We are using salt to make it harder to guess our key using a dictionary attack -

// trying to guess a password by enumerating all possible words.

PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,

new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });



// Now get the key/IV and do the Decryption using the function that accepts byte arrays.

// Using PasswordDeriveBytes object we are first getting 32 bytes for the Key

// (the default Rijndael key length is 256bit = 32bytes) and then 16 bytes for the IV.

// IV should always be the block size, which is by default 16 bytes (128 bit) for Rijndael.

// If you are using DES/TripleDES/RC2 the block size is 8 bytes and so should be the IV size.

// You can also read KeySize/BlockSize properties off the algorithm to find out the sizes.

return Decrypt(cipherData, pdb.GetBytes(32), pdb.GetBytes(16));



}
// Decrypt a file into another file using a password
public static void Decrypt(string fileIn, string fileOut)
{

// First we are going to open the file streams

FileStream fsIn = new FileStream(fileIn, FileMode.Open, FileAccess.Read);

FileStream fsOut = new FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write);



// Then we are going to derive a Key and an IV from the Password and create an algorithm

PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,

new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });



Rijndael alg = Rijndael.Create();



alg.Key = pdb.GetBytes(32);

alg.IV = pdb.GetBytes(16);



// Now create a crypto stream through which we are going to be pumping data.

// Our fileOut is going to be receiving the Decrypted bytes.

CryptoStream cs = new CryptoStream(fsOut, alg.CreateDecryptor(), CryptoStreamMode.Write);



// Now will will initialize a buffer and will be processing the input file in chunks.

// This is done to avoid reading the whole file (which can be huge) into memory.

int bufferLen = 4096;

byte[] buffer = new byte[bufferLen];

int bytesRead;



do
{

// read a chunk of data from the input file

bytesRead = fsIn.Read(buffer, 0, bufferLen);



// Decrypt it

cs.Write(buffer, 0, bytesRead);



} while (bytesRead != 0);



// close everything

cs.Close(); // this will also close the unrelying fsOut stream

fsIn.Close();
}
public static void Decrypt(string fileIn, Stream fsOut)
{

// First we are going to open the file streams

FileStream fsIn = new FileStream(fileIn, FileMode.Open, FileAccess.Read);



// Then we are going to derive a Key and an IV from the Password and create an algorithm

PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,

new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });



Rijndael alg = Rijndael.Create();



alg.Key = pdb.GetBytes(32);

alg.IV = pdb.GetBytes(16);



// Now create a crypto stream through which we are going to be pumping data.

// Our fileOut is going to be receiving the Decrypted bytes.

CryptoStream cs = new CryptoStream(fsOut, alg.CreateDecryptor(), CryptoStreamMode.Write);



// Now will will initialize a buffer and will be processing the input file in chunks.

// This is done to avoid reading the whole file (which can be huge) into memory.

int bufferLen = 4096;

byte[] buffer = new byte[bufferLen];

int bytesRead;



do
{

// read a chunk of data from the input file

bytesRead = fsIn.Read(buffer, 0, bufferLen);



// Decrypt it

cs.Write(buffer, 0, bytesRead);



} while (bytesRead != 0);



// close everything

//cs.Close(); // this will also close the unrelying fsOut stream

fsIn.Close();

}
#endregion
}
}




Responses

Author: Kapil Dhawan    17 Jun 2008Member Level: Gold   Points : 2
Hello
Nice piece of code
Thanks for sharing your knowledge with us.
I hope to see more good code from your side
This code will help lots of guys
Thanks to you
Regards,
Kapil








Author: Raj Kumar Prajapati    27 Aug 2008Member Level: Bronze   Points : 1
Hello
Nice piece of code ,I USE IT ALMOST WORK
Thanks for sharing your knowledge with us.
I hope to see more good code from your side
This code will help lots of guys
Thanks to you
RegardS
RAJ PRAJAPATI



Feedbacks      
Popular Tags   What are tags ?   Search Tags  
Sign In to add tags.
(No tags found.)

Post Feedback


This is a strictly moderated forum. Only approved messages will appear in the site. Please use 'Spell Check' in Google toolbar before you submit.
You must Sign In to post a response.
Next Resource: How to encrypt a string using c#
Previous Resource: Encrypting Selected node in a XML file
Return to Discussion Resource Index
Post New Resource
Category: Encryption


Post resources and earn money!
 
Related Resources



dotNet Slackers

About Us    Contact Us    Privacy Policy    Terms Of Use