AES加密和解密文件

using System;
using System.IO;
using System.Security;
using System.Security.Cryptography;
using System.Runtime.InteropServices;
using System.Text;

namespace CSEncryptDecrypt
{
   class Class1
   {
      //  Call this function to remove the key from memory after use for security
      [System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint="RtlZeroMemory")]
      public static extern bool ZeroMemory(IntPtr Destination, int Length);
		
      // Function to Generate a 64 bits Key.
      static string GenerateKey() 
      {
         // Create an instance of Symetric Algorithm. Key and IV is generated automatically.
         DESCryptoServiceProvider desCrypto =(DESCryptoServiceProvider)DESCryptoServiceProvider.Create();

         // Use the Automatically generated key for Encryption. 
         return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
      }

      static void EncryptFile(string sInputFilename,
         string sOutputFilename, 
         string sKey) 
      {
         FileStream fsInput = new FileStream(sInputFilename, 
            FileMode.Open, 
            FileAccess.Read);

         FileStream fsEncrypted = new FileStream(sOutputFilename, 
            FileMode.Create, 
            FileAccess.Write);
         DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
         DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
         DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
         ICryptoTransform desencrypt = DES.CreateEncryptor();
         CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
            desencrypt, 
            CryptoStreamMode.Write); 

         byte[] bytearrayinput = new byte[fsInput.Length];
         fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
         cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
         cryptostream.Close();
         fsInput.Close();
         fsEncrypted.Close();
      }

      static void DecryptFile(string sInputFilename, 
         string sOutputFilename,
         string sKey)
      {
         DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
         //A 64 bit key and IV is required for this provider.
         //Set secret key For DES algorithm.
         DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
         //Set initialization vector.
         DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

         //Create a file stream to read the encrypted file back.
         FileStream fsread = new FileStream(sInputFilename, 
            FileMode.Open, 
            FileAccess.Read);
         //Create a DES decryptor from the DES instance.
         ICryptoTransform desdecrypt = DES.CreateDecryptor();
         //Create crypto stream set to read and do a 
         //DES decryption transform on incoming bytes.
         CryptoStream cryptostreamDecr = new CryptoStream(fsread, 
            desdecrypt,
            CryptoStreamMode.Read);
         //Print the contents of the decrypted file.
         StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
         fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
         fsDecrypted.Flush();
         fsDecrypted.Close();
      } 

      static void Main()
      {
         // Must be 64 bits, 8 bytes.
         // Distribute this key to the user who will decrypt this file.
         string sSecretKey;
         
         // Get the Key for the file to Encrypt.
         sSecretKey = GenerateKey();

         // For additional security Pin the key.
         GCHandle gch = GCHandle.Alloc( sSecretKey,GCHandleType.Pinned );
         
         // Encrypt the file.        
         EncryptFile(@"C:\MyData.txt", 
            @"C:\Encrypted.txt", 
            sSecretKey);

         // Decrypt the file.
         DecryptFile(@"C:\Encrypted.txt", 
            @"C:\Decrypted.txt", 
            sSecretKey);

         // Remove the Key from memory. 
         ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2);
         gch.Free();
      }
   }
}


----------------------------------------------------------------------------------------------------------

大文件分块加密和解密

using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Security.Cryptography;

namespace VideoEncrypt
{
    class Program
    {
        static void Main(string[] args)
        {
            RijndaelManaged rij = new RijndaelManaged();
            rij.KeySize = 128;

            string fp = @"E://friends//3//3.mkv";
            string sPhysicalFilePath = @"E://friends//3//o3.mkv";
            string fw = @"E://friends//3//dd3.mkv";
            Console.WriteLine("Encrypting begin...");
            encryption(rij, fp, sPhysicalFilePath);
            decryption(rij,sPhysicalFilePath,fw);

        }
        //用于加密的函数
        public static void encryption(RijndaelManaged rij,string readfile, string writefile)
        {
            try
            {
                    byte[] key = rij.Key;
                    byte[] iv = rij.IV;
                    byte[] buffer = new byte[4096];
                    Rijndael crypt = Rijndael.Create();
                    ICryptoTransform transform = crypt.CreateEncryptor(key, iv);
                    //写进文件
                    FileStream fswrite = new FileStream(writefile, FileMode.Create);
                    CryptoStream cs = new CryptoStream(fswrite, transform, CryptoStreamMode.Write);
                    //打开文件
                    FileStream fsread = new FileStream(readfile, FileMode.Open);
                    int length;
                    //while ((length = fsread.ReadByte()) != -1)
                        //cs.WriteByte((byte)length);
                    while ((length = fsread.Read(buffer, 0, 4096)) > 0)
                        cs.Write(buffer, 0, (int)length);

                    fsread.Close();
                    cs.Close();
                    fswrite.Close();
                    Console.WriteLine("Encrypt Success");
            }
            catch (Exception e)
            {
                Console.WriteLine("Encrypt Faile"+e.ToString());
            }
        }
        //用于解密的函数
        public static void decryption(RijndaelManaged rij, string readfile, string writefile)
        {
            try
            {
                byte[] key = rij.Key;
                byte[] iv = rij.IV;
                byte[] buffer=new byte[4096];
                    Rijndael crypt = Rijndael.Create();
                    ICryptoTransform transform = crypt.CreateDecryptor(key, iv);
                    //读取加密后的文件 
                    FileStream fsopen = new FileStream(readfile, FileMode.Open);
                    CryptoStream cs = new CryptoStream(fsopen, transform, CryptoStreamMode.Read);
                    //把解密后的结果写进文件
                    FileStream fswrite = new FileStream(writefile, FileMode.OpenOrCreate);
                    
                    int length;
                    //while ((length = cs.ReadByte()) != -1)
                        //fswrite.WriteByte((byte)length);
                    while ((length = cs.Read(buffer, 0, 4096)) > 0)
                        fswrite.Write(buffer, 0, (int)length);
                    fswrite.Close();
                    cs.Close();
                    fsopen.Close();
                    Console.WriteLine("Decrypt Success");
            }
            catch (Exception e)
            {
                Console.WriteLine("Decrypt Failed"+e.ToString());
            }
        }
    }
}
posted @ 2013-05-02 09:41  乔先生  阅读(2084)  评论(0编辑  收藏  举报