Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Security.Cryptography;
- using System.Security;
- using System.IO;
- namespace Tuldok
- {
- public enum Algorithm
- {
- AES,
- DES,
- RC2,
- TripleDES,
- }
- public class Encryptor
- {
- SymmetricAlgorithm m_cipher;
- Algorithm m_algorithm;
- const int c_bufferSize = 4096;
- /// <summary>
- /// Constructor
- /// </summary>
- /// <param name="algorithm">The cipher to use</param>
- public Encryptor(Algorithm algorithm)
- {
- m_algorithm = algorithm;
- switch (algorithm)
- {
- case Algorithm.AES:
- m_cipher = new AesCryptoServiceProvider();
- break;
- case Algorithm.DES:
- m_cipher = new DESCryptoServiceProvider();
- break;
- case Algorithm.RC2:
- m_cipher = new RC2CryptoServiceProvider();
- break;
- case Algorithm.TripleDES:
- m_cipher = new TripleDESCryptoServiceProvider();
- break;
- }
- m_cipher.Mode = CipherMode.CBC;
- }
- /// <summary>
- /// Default constructor. Will use AES.
- /// </summary>
- public Encryptor()
- {
- m_cipher = new AesCryptoServiceProvider();
- m_algorithm = Algorithm.AES;
- }
- ~Encryptor()
- {
- m_cipher = null;
- }
- /// <summary>
- /// Encrypt a file
- /// </summary>
- /// <param name="inStrFilename">Input filename</param>
- /// <param name="outStrFilename">Output filename</param>
- /// <param name="password">Password</param>
- public void EncryptFile(string inStrFilename, string outStrFilename, string password)
- {
- m_cipher.GenerateIV(); // generate a random initialization vector
- m_cipher.Padding = PaddingMode.None;
- var keygen = new Rfc2898DeriveBytes(password, m_cipher.IV);
- var key = keygen.GetBytes(m_cipher.KeySize / 8); // derive a key from the password
- m_cipher.Key = key;
- var inFile = new FileStream(inStrFilename, FileMode.Open);
- var outFile = new FileStream(outStrFilename, FileMode.Create);
- var in_buffer = new byte[c_bufferSize];
- var out_buffer = new byte[c_bufferSize];
- int bytesRead;
- var cryptor = m_cipher.CreateEncryptor();
- outFile.WriteByte((byte)m_algorithm); // write the algorithm used to stream
- outFile.Write(m_cipher.IV, 0, m_cipher.IV.GetLength(0)); // write the initialization vector to stream
- for(;;)
- {
- bytesRead = inFile.Read(in_buffer, 0, c_bufferSize);
- if (bytesRead == c_bufferSize)
- {
- cryptor.TransformBlock(in_buffer, 0, bytesRead, out_buffer, 0);
- outFile.Write(out_buffer, 0, c_bufferSize);
- }
- else
- {
- var bytes = cryptor.TransformFinalBlock(in_buffer, 0, bytesRead);
- outFile.Write(bytes, 0, bytes.GetLength(0));
- }
- if (bytesRead < 4096)
- break;
- }
- outFile.Flush();
- outFile.Close();
- inFile.Close();
- outFile = null;
- inFile = null;
- }
- }
- public class Decryptor
- {
- const int c_bufferSize = 4096;
- public Decryptor()
- {
- }
- /// <summary>
- /// Decrypt file
- /// </summary>
- /// <param name="inStrFileName"></param>
- /// <param name="outStrFileName"></param>
- /// <param name="password"></param>
- public void DecryptFile(string inStrFileName, string outStrFileName, string password)
- {
- var inFile = new FileStream(inStrFileName, FileMode.Open);
- var outFile = new FileStream(outStrFileName, FileMode.Create);
- var in_buffer = new byte[c_bufferSize];
- var out_buffer = new byte[c_bufferSize];
- int bytesRead;
- var algorithm = (Algorithm)inFile.ReadByte();
- SymmetricAlgorithm cipher;
- switch (algorithm)
- {
- case Algorithm.DES:
- cipher = new DESCryptoServiceProvider();
- break;
- case Algorithm.RC2:
- cipher = new RC2CryptoServiceProvider();
- break;
- case Algorithm.TripleDES:
- cipher = new TripleDESCryptoServiceProvider();
- break;
- default:
- cipher = new AesCryptoServiceProvider();
- break;
- }
- var saltSize = cipher.IV.GetLength(0);
- var salt = new byte[saltSize];
- inFile.Read(salt, 0, saltSize); // get the initialization vector from stream
- cipher.IV = salt;
- cipher.Mode = CipherMode.CBC;
- cipher.Padding = PaddingMode.None;
- var keygen = new Rfc2898DeriveBytes(password, salt);
- var key = keygen.GetBytes(cipher.KeySize / 8); // create key
- cipher.Key = key;
- var decryptor = cipher.CreateDecryptor();
- for(;;)
- {
- bytesRead = inFile.Read(in_buffer, 0, c_bufferSize);
- if (bytesRead == c_bufferSize)
- {
- decryptor.TransformBlock(in_buffer, 0, c_bufferSize, out_buffer, 0);
- outFile.Write(out_buffer, 0, c_bufferSize);
- }
- else
- {
- var bytes = decryptor.TransformFinalBlock(in_buffer, 0, bytesRead);
- outFile.Write(bytes, 0, bytes.GetLength(0));
- }
- if (bytesRead < 4096)
- break;
- }
- outFile.Flush();
- outFile.Close();
- inFile.Close();
- outFile = null;
- inFile = null;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement