Come crittografare e decrittografare un file utilizzando Visual C#

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
Per la versione di Microsoft Visual Basic .NET di questo articolo, vedere 301070.
In questo articolo fa riferimento a spazi dei nomi Microsoft.NET Framework Class Library seguenti:
  • System.IO
  • System. Security
  • System.Security.Cryptography
Nota In questo articolo non riguarda il Microsoft.NET Framework 2.0.
Sommario
In questo articolo viene descritto come utilizzare le classi di crittografia fornite dal Microsoft.NET Framework per crittografare un file di testo in un formato illeggibile e quindi decrittografare tale file di testo nuovamente in formato originale.

Requisiti

Nell'elenco seguente vengono indicati l'hardware consigliato, software, infrastruttura di rete e service pack che è necessario disporre di:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server, Windows NT 4.0 Server o Microsoft Windows XPProfessional
  • 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 serie di strumenti per la crittografia e decrittografia. La classe CryptoStream è una delle molte classi fornite. Ed è stata sviluppata per crittografare o decrittografare il contenuto che viene 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 su Visual C# inprogettie quindi fare clic su Applicazione Consolein modelli. Visual C# .NET crea una classe statica , con una routine Main () vuota.
  3. Utilizzare l'istruzione using (come indicato nell'esempio di codice che segue) sugli spazi dei nomi thefollowing:
    • System
    • System. Security
    • System.Security.Cryptography
    • System. Text
    • System.IO
    in modo che non è necessario qualificare dichiarazioni provenienti da thesenamespaces nel codice. È necessario utilizzare queste istruzioni prima di qualsiasi otherdeclarations.
    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 symmetricencryption richiede una chiave e un vettore di inizializzazione (IV) per crittografare thedata. Per decrittografare i dati, è necessario che la stessa chiave e dello stesso vettore. Mustalso si utilizza lo stesso algoritmo di crittografia. È possibile generare le chiavi usingeither dei seguenti metodi:
    • Metodo 1 È possibile richiedere all'utente di immettere una password. Utilizzare quindi la password come chiave e il vettore di Inizializzazione.
    • Metodo 2 Quando si crea una nuova istanza delle classi di crittografia simmetriche, vengono create automaticamente una nuova chiave e vettore di Inizializzazione per la sessione. Utilizzare la chiave e il vettore di Inizializzazione generati dalle gestito classi di crittografia simmetrica per crittografare e decrittografare il file.

      Per ulteriori informazioni su come generare e distribuire le chiavi, vedere la documentazione di Microsoft.NET Framework SDK oppure visitare il seguente sito Web Microsoft Developer Network (MSDN):
  5. Aggiungere la seguente funzione per generare una nuova chiave per asession (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. Il dovranno essere tre parametri seguenti:
    • 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 un output dell'oggetto FileStream . Questi oggetti possono leggere e scritti il targetfiles.
    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 la tecnologia actualdecryption che viene utilizzata nei file. A questo punto, è possibile creareuna provider diverso se si preferisce utilizzare RSA Security o un'altra cryptographictechnique.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();					
  9. Fornire il provider di crittografia con chiave yoursecret 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. Thesize della chiave è diversa per ogni tecnica di crittografia. Ad esempio, Data Encryption Standard (DES) utilizza una chiave a 64 bit che è uguale a 8 byte orto 8 caratteri.

    Se non si specifica una chiave, il provider di randomlygenerates uno. Crittografare il file, ma non esiste alcun modo todecrypt il file. Si noti che è necessario fornire anche il vector(IV) di inizializzazione. Questo valore viene utilizzato come parte della crittografia. Come la chiave, il israndomly IV se non si specifica il valore generato. Poiché i valori devono bethe stesso per la crittografia e la decrittografia, è necessario non consentire randomgeneration 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 un encryptingobject (CreateEncryptor) e l'oggetto output esistente 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 il outputfile. Passare attraverso l'oggetto CryptoStream dove il file è crittografato utilizzando la chiave di youprovided.
    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 a theencryption, tuttavia, la procedura DecryptFile presenta due differenze fondamentali rispetto alla routine EncryptFile .
    • CreateDecryptor viene utilizzato invece di CreateEncryptor per creare l'oggetto CryptoStream , che specifica come è possibile utilizzare l'oggetto.
    • Quando il testo decrittografato viene scritto nel file di destinazione, l'oggetto CryptoStream è ora il flusso di origine anziché il destinazione.
    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 tale thepath utilizzato per i punti di nome di file di input per un existingfile.

La procedura di prova

Testare questo codice con un file di testo (txt) per verificare che il codice di crittografata e decrittografata 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 quindi 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 delle funzionalità di crittografia di .NET, vedere i seguenti siti Web MSDN:

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 307010 - Ultima revisione: 07/03/2016 13:09:00 - Revisione: 4.0

Microsoft Visual C# 2005, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition

  • kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMtit
Feedback