C#加密與解密文件

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();
        }

    }

}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值