A Simple Decrypt Function

1:41 AM
First Add This Namespaces
using System;
using System.Collections.Generic;
using System.Text;
using System.Security;
using System.Security.Cryptography;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.IO;
using System.Windows.Forms;

Now The Function:

public void Decrypt(string inputfile,string outputfile,string passPhrase,string saltValue,string hashAlgorithm,int passwordIterations,string initVector,int keySize)
       {
           // Convert strings defining encryption key characteristics into byte
           // arrays. Let us assume that strings only contain ASCII codes.
           // If strings include Unicode characters, use Unicode, UTF7, or UTF8
           // encoding.
           byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
           byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);

           // Convert our ciphertext into a byte array.
           byte[] cipherTextBytes = ReadByteArrayFromFile(inputfile);

           // First, we must create a password, from which the key will be 
           // derived. This password will be generated from the specified 
           // passphrase and salt value. The password will be created using
           // the specified hash algorithm. Password creation can be done in
           // several iterations.
           PasswordDeriveBytes password = new PasswordDeriveBytes(
                                                           passPhrase,
                                                           saltValueBytes,
                                                           hashAlgorithm,
                                                           passwordIterations);

           // Use the password to generate pseudo-random bytes for the encryption
           // key. Specify the size of the key in bytes (instead of bits).
           byte[] keyBytes = password.GetBytes(keySize / 8);

           // Create uninitialized Rijndael encryption object.
           RijndaelManaged symmetricKey = new RijndaelManaged();

           // It is reasonable to set encryption mode to Cipher Block Chaining
           // (CBC). Use default options for other symmetric key parameters.
           symmetricKey.Mode = CipherMode.CBC;

           // Generate decryptor from the existing key bytes and initialization 
           // vector. Key size will be defined based on the number of the key 
           // bytes.
           ICryptoTransform decryptor = symmetricKey.CreateDecryptor(
                                                            keyBytes,
                                                            initVectorBytes);

           // Define memory stream which will be used to hold encrypted data.
           MemoryStream memoryStream = new MemoryStream(cipherTextBytes);

           // Define cryptographic stream (always use Read mode for encryption).
           CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                         decryptor,
                                                         CryptoStreamMode.Read);

           // Since at this point we don't know what the size of decrypted data
           // will be, allocate the buffer long enough to hold ciphertext;
           // plaintext is never longer than ciphertext.
           byte[] plainTextBytes = new byte[cipherTextBytes.Length];

           // Start decrypting.
           int decryptedByteCount = cryptoStream.Read(plainTextBytes,
                                                      0,
                                                      plainTextBytes.Length);

           // Close both streams.
           memoryStream.Close();
           cryptoStream.Close();


           File.WriteAllBytes(outputfile,plainTextBytes);

           // Convert decrypted data into a string. 
           // Let us assume that the original plaintext string was UTF8-encoded.
           //string plainText = Encoding.UTF8.GetString(plainTextBytes,
                                                      //0,
                                                      //decryptedByteCount);

           // Return decrypted string.   
           //return plainText;
       }

0 comments:

Post a Comment