如何使用 Visual C# 加密和解密文件(2)

byte[] bytearrayinput = new byte[fsInput.Length - 1];
fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

解密文件

要解密文件,请按照下列步骤操作:

创建一个方法,然后将它命名为 DecryptFile。解密过程与加密过程相似,但 DecryptFile 过程与 EncryptFile 过程有两个关键区别。

CryptoStream 对象是使用 CreateDecryptor 而非 CreateEncryptor 创建的,这将指定对象的使用方式。

在将解密的文本写入到目标文件时,CryptoStream 对象现在是源,而不是目标流。

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

将以下几行添加到 Main() 过程,以调用 EncryptFileDecryptFile

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

保存文件。运行您的应用程序。确保输入文件名使用的路径指向一个现有文件。

测试过程

用一个文本文件 (.txt) 测试此代码,确认它可对此文件进行正确的加密和解密。确保将文件解密到一个新文件(如本文中的 Main() 过程中所示),而不是解密到原来的文件中。检查解密后的文件,然后与原文件进行比较。

完整代码列表

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


上面代码不能正确还原中文字符,只需要小做修改

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5c6f9f4ceb4886993825b03d319c21c0.html