Advertisement
tuldok89

Encrypt / Decrypt

Dec 16th, 2013
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.36 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Security.Cryptography;
  5. using System.Security;
  6. using System.IO;
  7.  
  8. namespace Tuldok
  9. {
  10.     public enum Algorithm
  11.     {
  12.         AES,
  13.         DES,
  14.         RC2,
  15.         TripleDES,
  16.     }
  17.  
  18.     public class Encryptor
  19.     {
  20.         SymmetricAlgorithm m_cipher;
  21.         Algorithm m_algorithm;
  22.         const int c_bufferSize = 4096;
  23.  
  24.         /// <summary>
  25.         /// Constructor
  26.         /// </summary>
  27.         /// <param name="algorithm">The cipher to use</param>
  28.         public Encryptor(Algorithm algorithm)
  29.         {
  30.             m_algorithm = algorithm;
  31.             switch (algorithm)
  32.             {
  33.                 case Algorithm.AES:
  34.                     m_cipher = new AesCryptoServiceProvider();
  35.                     break;
  36.                 case Algorithm.DES:
  37.                     m_cipher = new DESCryptoServiceProvider();
  38.                     break;
  39.                 case Algorithm.RC2:
  40.                     m_cipher = new RC2CryptoServiceProvider();
  41.                     break;
  42.                 case Algorithm.TripleDES:
  43.                     m_cipher = new TripleDESCryptoServiceProvider();
  44.                     break;
  45.             }
  46.             m_cipher.Mode = CipherMode.CBC;
  47.         }
  48.  
  49.         /// <summary>
  50.         /// Default constructor. Will use AES.
  51.         /// </summary>
  52.         public Encryptor()
  53.         {
  54.             m_cipher = new AesCryptoServiceProvider();
  55.             m_algorithm = Algorithm.AES;
  56.         }
  57.  
  58.         ~Encryptor()
  59.         {
  60.             m_cipher = null;
  61.         }
  62.  
  63.         /// <summary>
  64.         /// Encrypt a file
  65.         /// </summary>
  66.         /// <param name="inStrFilename">Input filename</param>
  67.         /// <param name="outStrFilename">Output filename</param>
  68.         /// <param name="password">Password</param>
  69.         public void EncryptFile(string inStrFilename, string outStrFilename, string password)
  70.         {
  71.             m_cipher.GenerateIV(); // generate a random initialization vector
  72.             m_cipher.Padding = PaddingMode.None;
  73.            
  74.             var keygen = new Rfc2898DeriveBytes(password, m_cipher.IV);
  75.             var key = keygen.GetBytes(m_cipher.KeySize / 8); // derive a key from the password
  76.             m_cipher.Key = key;
  77.  
  78.             var inFile = new FileStream(inStrFilename, FileMode.Open);
  79.             var outFile = new FileStream(outStrFilename, FileMode.Create);
  80.             var in_buffer = new byte[c_bufferSize];
  81.             var out_buffer = new byte[c_bufferSize];
  82.             int bytesRead;
  83.             var cryptor = m_cipher.CreateEncryptor();
  84.  
  85.             outFile.WriteByte((byte)m_algorithm); // write the algorithm used to stream
  86.             outFile.Write(m_cipher.IV, 0, m_cipher.IV.GetLength(0)); // write the initialization vector to stream
  87.  
  88.             for(;;)
  89.             {
  90.                 bytesRead = inFile.Read(in_buffer, 0, c_bufferSize);
  91.  
  92.                 if (bytesRead == c_bufferSize)
  93.                 {
  94.                     cryptor.TransformBlock(in_buffer, 0, bytesRead, out_buffer, 0);
  95.                     outFile.Write(out_buffer, 0, c_bufferSize);
  96.                 }
  97.                 else
  98.                 {
  99.                     var bytes = cryptor.TransformFinalBlock(in_buffer, 0, bytesRead);
  100.                     outFile.Write(bytes, 0, bytes.GetLength(0));
  101.                 }
  102.  
  103.                 if (bytesRead < 4096)
  104.                     break;
  105.             }
  106.  
  107.             outFile.Flush();
  108.             outFile.Close();
  109.             inFile.Close();
  110.  
  111.             outFile = null;
  112.             inFile = null;
  113.         }
  114.     }
  115.  
  116.     public class Decryptor
  117.     {
  118.         const int c_bufferSize = 4096;
  119.  
  120.         public Decryptor()
  121.         {
  122.         }
  123.  
  124.         /// <summary>
  125.         /// Decrypt file
  126.         /// </summary>
  127.         /// <param name="inStrFileName"></param>
  128.         /// <param name="outStrFileName"></param>
  129.         /// <param name="password"></param>
  130.         public void DecryptFile(string inStrFileName, string outStrFileName, string password)
  131.         {
  132.             var inFile = new FileStream(inStrFileName, FileMode.Open);
  133.             var outFile = new FileStream(outStrFileName, FileMode.Create);
  134.             var in_buffer = new byte[c_bufferSize];
  135.             var out_buffer = new byte[c_bufferSize];
  136.             int bytesRead;
  137.             var algorithm = (Algorithm)inFile.ReadByte();
  138.             SymmetricAlgorithm cipher;
  139.  
  140.             switch (algorithm)
  141.             {
  142.                 case Algorithm.DES:
  143.                     cipher = new DESCryptoServiceProvider();
  144.                     break;
  145.                 case Algorithm.RC2:
  146.                     cipher = new RC2CryptoServiceProvider();
  147.                     break;
  148.                 case Algorithm.TripleDES:
  149.                     cipher = new TripleDESCryptoServiceProvider();
  150.                     break;
  151.                 default:
  152.                     cipher = new AesCryptoServiceProvider();
  153.                     break;
  154.             }
  155.  
  156.             var saltSize = cipher.IV.GetLength(0);
  157.             var salt = new byte[saltSize];
  158.            
  159.             inFile.Read(salt, 0, saltSize); // get the initialization vector from stream
  160.             cipher.IV = salt;
  161.             cipher.Mode = CipherMode.CBC;
  162.             cipher.Padding = PaddingMode.None;
  163.            
  164.             var keygen = new Rfc2898DeriveBytes(password, salt);
  165.             var key = keygen.GetBytes(cipher.KeySize / 8); // create key
  166.             cipher.Key = key;
  167.            
  168.             var decryptor = cipher.CreateDecryptor();
  169.  
  170.             for(;;)
  171.             {
  172.                 bytesRead = inFile.Read(in_buffer, 0, c_bufferSize);
  173.  
  174.                 if (bytesRead == c_bufferSize)
  175.                 {
  176.                     decryptor.TransformBlock(in_buffer, 0, c_bufferSize, out_buffer, 0);
  177.                     outFile.Write(out_buffer, 0, c_bufferSize);
  178.                 }
  179.                 else
  180.                 {
  181.                     var bytes = decryptor.TransformFinalBlock(in_buffer, 0, bytesRead);
  182.                     outFile.Write(bytes, 0, bytes.GetLength(0));
  183.                 }
  184.                
  185.                 if (bytesRead < 4096)
  186.                     break;
  187.             }
  188.  
  189.             outFile.Flush();
  190.             outFile.Close();
  191.             inFile.Close();
  192.  
  193.             outFile = null;
  194.             inFile = null;
  195.         }
  196.     }
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement