Come crittografare e decrittografare un file utilizzando Visual C#

Traduzione articoli Traduzione articoli
Identificativo articolo: 307010 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo è stato precedentemente pubblicato con il codice di riferimento I307010
Per una versione di Microsoft Visual Basic .NET di questo articolo, vedere 301070.
In questo articolo si riferisce al seguente Microsoft .NET Spazi dei nomi di Framework Class Library:
  • System. IO
  • System. Security
  • System.Security.Cryptography
Nota. In questo articolo non si applica per il Microsoft.NET Framework 2.0.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In questo articolo viene descritto come utilizzare le classi di crittografia fornite dal.NET Framework di Microsoft per crittografare un file di testo a un illeggibile e quindi per decrittografare questo file di testo originale formato.

Requisiti

Nell'elenco seguente sono indicati l'hardware consigliato, software, infrastruttura di rete e i service pack è necessario disporre di:
  • Microsoft Windows 2000 Professional, Windows 2000 Server Windows 2000 Advanced Server, Windows NT 4.0 Server o Microsoft Windows XP Professional
  • Microsoft Visual Studio 2005 o Microsoft Visual Studio .NET

Crittografia e decrittografia

Lo spazio dei nomi System.Security.Cryptographic in di Microsoft.NET Framework fornisce una varietà di strumenti per la crittografia e decrittografia. La classe CryptoStream è una delle molte classi fornite. La classe CryptoStream è progettata per crittografare o decrittografare il contenuto è trasmesso in un file.

Crittografare un file

Per crittografare un file, attenersi alla seguente procedura:
  1. Avviare Visual Studio 2005 o Visual Studio .NET.
  2. Fare clic Visual C# Nella casella di gruppoProgetti, quindi fare clic su Applicazione consoleNella casella di gruppo Modelli. Visual C# .NET crea automaticamente una classe Static insieme a una routine Main () vuota.
  3. Utilizzare l'istruzione using (come indicato nell'esempio di codice che segue) il spazi dei nomi seguenti:
    • Sistema
    • System. Security
    • System.Security.Cryptography
    • System. Text
    • System. IO
    in modo che non è necessario qualificare dichiarazioni provenienti da questi spazi dei nomi nel codice. È necessario utilizzare queste istruzioni prima di qualsiasi altro dichiarazioni.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
  4. Generare una chiave segreta per crittografare e decrittografare i dati. Il DESCryptoServiceProvider si basa su un algoritmo di crittografia simmetrica. La proprietà simmetrica la crittografia richiede una chiave e un vettore di inizializzazione (IV) per crittografare il dati. Per decrittografare i dati, è necessario disporre della stessa chiave e dello stesso IV. È necessario Inoltre, utilizzare lo stesso algoritmo di crittografia. È possibile generare le chiavi utilizzando uno dei metodi seguenti:
    • Metodo 1 È possibile richiedere all'utente una password. Quindi, utilizzare la password come la chiave e il vettore di Inizializzazione.
    • Metodo 2 Quando si crea una nuova istanza del simmetrica crittografia classi, una nuova chiave e un vettore vengono creati automaticamente per la sessione. Utilizzare il chiave e vettore di Inizializzazione generati dalle classi di crittografia simmetriche gestite a crittografare e decrittografare il file.

      Per ulteriori informazioni su come generare e distribuire le chiavi, vedere Microsoft.NET Framework SDK Documentazione o vedere il seguente Web Microsoft Developer Network (MSDN) sito:
      Generazione di chiavi per la crittografia e decrittografia
  5. Aggiungere la seguente funzione per generare una nuova chiave per un sessione (come descritto nel metodo 2 del passaggio 4):
    //  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(ref string 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);
    }
  6. Creare un metodo nella classe denominata EncryptFile. La classe di EncryptFile deve avere i seguenti tre parametri:
    • sInputFilename
    • sOutputFilename
    • sKey (La chiave segreta utilizzata per crittografare e decrittografare il file).
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
    					
  7. Nella routine EncryptFile , creare un oggetto FileStream di input e output in un oggetto FileStream . Questi oggetti possono essere letta o scritti alla destinazione file.
    FileStream fsInput = new FileStream(sInputFilename, 
    				FileMode.Open, 
    				FileAccess.Read);
    
    FileStream fsEncrypted = new FileStream(sOutputFilename, 
    				FileMode.Create, 
    				FileAccess.Write);
    					
  8. Dichiarare un'istanza della classe DESCryptoServiceProvider . Rappresenta l'effettiva crittografia e l'effettivo tecnologia di decrittografia utilizzata nei file. A questo punto, è possibile creare un provider diverso se si preferisce utilizzare RSA Security o un'altra crittografia tecnica.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    					
  9. Il provider di crittografia deve essere munito di chiave segreta come una matrice di byte. Lo spazio dei nomi System. Text fornisce una funzione denominata GetBytes (). Come parte della funzionalità di codifica, la funzione GetBytes () accetta una stringa e quindi restituisce una matrice di byte. Il dimensione della chiave è diversa per ogni tecnica di crittografia. Ad esempio, Data Encryption Standard (DES) utilizza una chiave di 64 bit è uguale a 8 byte o 8 caratteri.

    Se non si specifica una chiave, il provider in modo casuale genera uno. Crittografare il file, ma non esiste alcun modo per decrittografare il file. Si noti che è necessario fornire anche il vettore di inizializzazione (IV). questo valore viene utilizzato come parte della crittografia. Come la chiave è il vettore di Inizializzazione generato in modo casuale se non si specifica il valore. Poiché i valori devono essere lo stesso per la crittografia e la decrittografia, è necessario non consentire casuale generazione di questi valori.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Creare un'istanza della classe CryptoStream utilizzando il provider di crittografia per ottenere una crittografia oggetto (CreateEncryptor) e le impostazioni esistenti di output dell'oggetto FileStream come parte del costruttore.
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    					desencrypt, 
    					CryptoStreamMode.Write);
    					
  11. Leggere il file di input e quindi scrivere nell'output file. Passare attraverso l'oggetto CryptoStream dove il file è crittografato utilizzando la chiave che si fornito.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    					

Decrittografare un file

Per decrittografare un file, attenersi alla seguente procedura:
  1. Creare un metodo e assegnarle il nomeDecryptFile. Il processo di decrittografia è simile al processo di crittografia, tuttavia, la procedura DecryptFile presenta due differenze fondamentali rispetto alla routine EncryptFile .
    • Per creare l'oggetto CryptoStream , che specifica come è possibile utilizzare l'oggetto è utilizzato invece di CreateEncryptorCreateDecryptor .
    • Quando il testo decrittografato viene scritto nella destinazione file, l'oggetto CryptoStream ora è l'origine invece di destinazione flusso.
    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();
    }
    					
  2. Aggiungere le seguenti righe alla procedura Main () per chiamare sia EncryptFile sia DecryptFile:
    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();
    }
  3. Salvare il file. Eseguire l'applicazione. Assicurarsi che il percorso utilizzato per i punti del nome di file di input a un oggetto esistente file.

La procedura di prova

Questo codice di test con un file di testo (txt) per confermare che il codice crittografare e decrittografare il file correttamente. Verificare di decrittografare il file. in un nuovo file (come nella routine Main () in questo articolo) anziché al file originale. Esaminare il file decrittografato e confrontarlo con il file originale.

Elenco completo del codice

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

Riferimenti

Per ulteriori informazioni sulla crittografia e sull'utilizzo di funzionalità di crittografia di .NET, vedere i seguenti siti Web MSDN:
Spazio dei nomi System.Security.Cryptography
Microsoft.NET Framework Developer Center

Proprietà

Identificativo articolo: 307010 - Ultima modifica: lunedì 1 luglio 2013 - Revisione: 3.0
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Chiavi: 
kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMtit
Traduzione automatica articoli
IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l?obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 307010
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com