Crittografia e decrittografia di un file utilizzando Visual Basic .NET o Visual Basic 2005

Traduzione articoli Traduzione articoli
Identificativo articolo: 301070 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo è stato precedentemente pubblicato con il codice di riferimento I301070
Per la versione di questo articolo relativa a Microsoft Visual C# .NET, vedere 307010.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In questo articolo viene descritto come utilizzare le classi di crittografia fornite da Microsoft .NET Framework per crittografare un file di testo, in modo da renderne illeggibile il contenuto, e quindi decrittografarlo per ripristinare il formato originale.



Requisiti

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

Utilizzo delle tecniche di crittografia e decrittografia

Lo spazio dei nomi System.Security.Cryptographic incluso in .NET Framework offre numerosi strumenti di supporto per le operazioni di crittografia e decrittografia. La classe CryptoStream è una delle molte classi fornite edè stata sviluppata per crittografare o decrittografare il contenuto nel momento in cui viene trasmesso in un file.

Per crittografare un file, attenersi alla procedura descritta di seguito:
  1. Eseguire Visual Studio .NET o Visual Studio 2005.
  2. Creare una nuova applicazione console in Visual Basic .NET o in Visual Basic 2005. Verrà creato un modulo unitamente a una routine Main() vuota.
  3. Utilizzare l'istruzione Imports negli spazi dei nomi System, System.Security, System.Security.Cryptography, System.Text e System.IO, in modo che in seguito non sia più necessario qualificare le dichiarazioni provenienti da questi spazi dei nomi nel codice. È necessario utilizzare queste istruzioni prima di qualsiasi altra dichiarazione.
    Imports System
    Imports System.IO
    Imports System.Security
    Imports System.Security.Cryptography
    Imports System.Runtime.InteropServices
    Imports System.Text
    					
  4. Generare una chiave privata per crittografare e decrittografare i dati. La classe DESCryptoServiceProvider è basata su un algoritmo di crittografia simmetrica, che richiede una chiave e un vettore di inizializzazione (IV, initialization vector) per crittografare i dati e l'utilizzo della stessa chiave e dello stesso vettore di inizializzazione, oltre che dello stesso algoritmo di crittografia, per decrittografarli. Per generare le chiavi, è possibile utilizzare uno dei metodi descritti di seguito:
    • Metodo 1 È possibile richiedere all'utente di specificare una password e quindi utilizzarla come chiave e vettore di inizializzazione.
    • Metodo 2 Quando si crea una nuova istanza delle classi di crittografia simmetrica, vengono creati automaticamente una nuova chiave e un nuovo vettore di inizializzazione per la sessione. La chiave e il vettore di inizializzazione generati dalle classi di crittografia simmetrica gestite possono essere utilizzati per crittografare e decrittografare il file.

      Per ulteriori informazioni su come generare e distribuire le chiavi, visitare il seguente sito Web Microsoft o fare riferimento alla documentazione del Software Development Kit (SDK) di .NET Framework (informazioni in lingua inglese):

      http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcongeneratingkeysforencryptiondecryption.asp
  5. Aggiungere la seguente funzione per generare una nuova chiave per una sessione, come descritto nel Metodo 2:
       ' Call this function to remove the key from memory after it is used for security.
       Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" _
                         (ByVal Destination As String, ByVal Length As Integer)
       
       ' Function to generate a key.
       Function GenerateKey() As String
          ' Create an instance of Symmetric Algorithm. The key and the IV are generated automatically.
          Dim desCrypto As DESCryptoServiceProvider = DESCryptoServiceProvider.Create()
    
          ' Use the automatically generated key for encryption. 
          Return ASCIIEncoding.ASCII.GetString(desCrypto.Key)
       End Function 
  6. Creare un metodo nella classe con nome EncryptFile, a cuidovranno essere associati tre parametri:
    • sInputFile
    • sOutputFile
    • sKey (questa è la chiave privata utilizzata per crittografare e decrittografare il file).
        Sub EncryptFile(ByVal sInputFilename As String, _
                       ByVal sOutputFilename As String, _
                       ByVal sKey As String)
        End Sub
    					
  7. Nella routine EncryptFile creare un oggetto di input FileStream e un oggetto di output FileStream che potranno essere utilizzati per la lettura e la scrittura nei file di destinazione.
            Dim fsInput As New FileStream(sInputFilename, _
                                        FileMode.Open, FileAccess.Read)
            Dim fsEncrypted As New FileStream(sOutputFilename, _
                                        FileMode.Create, FileAccess.Write)
    					
  8. Dichiarare un'istanza della classe DESCryptoServiceProvider, che rappresenta la tecnologia corrente di crittografia e decrittografia utilizzata nei file. A questo punto è possibile creare un provider diverso se si desidera utilizzare RSA Security o un'altra tecnica di crittografia.
     Dim DES As New DESCryptoServiceProvider() 					
  9. Il provider del servizio di crittografia deve essere in possesso della chiave privata costituita da una matrice di byte. Nello spazio dei nomi System.Text è disponibile una funzione denominata GetBytes(), le cui funzionalità dicodifica prevedono l'accettazione di una stringa e la restituzione di una matrice di byte. Le dimensioni della chiave sono diverse per ogni tecnica di crittografia. Ad esempio, DES (Data Encryption Standard) utilizza una chiave a 64 bit corrispondente a 8 byte o 8 caratteri.

    Se non viene fornita una chiave, il provider provvederà a generarne una in modo casuale con cui sarà possibile crittografare il file, ma non decrittografarlo. È inoltre necessario specificare il valore del vettore di inizializzazione utilizzato nell'ambito delle operazioni di crittografia. Anche il vettore di inizializzazione, come la chiave, viene generato in modo casuale se non si fornisce un valore. Poiché i valori devono essere uguali sia per la crittografia che per la decrittografia, è opportuno impedirne la generazione automatica.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
    					
  10. Creare un'istanza della classe CryptoStream. Utilizzare il provider di crittografia per ottenere un oggetto crittografia (CreateEncryptor) e l'oggetto output esistente FileStream nell'ambito del costruttore.
    Dim cryptostream As New CryptoStream(fsEncrypted, _
                                         desencrypt, _
                                         CryptoStreamMode.Write)
    					
  11. Leggere il file di input e quindi scriverlo nel file di output mediante l'oggetto CryptoStream in cui il file viene crittografato utilizzando la chiave fornita.
    Dim bytearrayinput(fsInput.Length - 1) As Byte
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
    					
Per decrittografare un file, attenersi alla procedura descritta di seguito:
  1. Creare un metodo denominato DecryptFile. Il processo di decrittografia è simile a quello di crittografia, ma DecryptFile presenta due differenze fondamentali rispetto alla routine EncryptFile.
    • Anziché CreateEncryptor viene utilizzato CreateDecryptor per creare l'oggetto CryptoStream che specifica il modo in cui potrà essere utilizzato l'oggetto.
    • Quando il testo decrittografato viene scritto nel file di destinazione, l'oggetto CryptoStream diventa il flusso di origine anziché quello di destinazione.
    Sub DecryptFile(ByVal sInputFilename As String, _
        ByVal sOutputFilename As String, _
        ByVal sKey As String)
    
        Dim DES As New DESCryptoServiceProvider()
        'A 64-bit key and an IV are 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.
        Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
        'Create a DES Decryptor from your DES instance.
        Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
        'Create a crypto stream set to read and to do a DES decryption transform on incoming bytes.
        Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
        'Print out the contents of the decrypted file.
        Dim fsDecrypted As New StreamWriter(sOutputFilename)
        fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd)
        fsDecrypted.Flush()
        fsDecrypted.Close()
    End Sub
    					
  2. Aggiungere le righe seguenti alla routine Main() per chiamare sia EncryptFile che DecryptFile.
        Public Sub Main()      'Must be 64 bits, 8 bytes.
          Dim sSecretKey As String
    
          ' Get the key for the file to encrypt.
          ' You can distribute this key to the user who will decrypt the file.
          sSecretKey = GenerateKey()
    
          ' For additional security, pin the key.
          Dim gch As GCHandle = GCHandle.Alloc(sSecretKey, GCHandleType.Pinned)
    
    
          ' Encrypt the file.        
          EncryptFile("%USERPROFILE%\MyData.txt", _
                          "%USERPROFILE%\Encrypted.txt", _
                          sSecretKey)
    
          ' Decrypt the file.
          DecryptFile("%USERPROFILE%\Encrypted.txt", _
                      "%USERPROFILE%\Decrypted.txt", _
                      sSecretKey)
    
          ' Remove the key from memory.
          ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2)
          gch.Free()
       End Sub
  3. Salvare il file. Eseguire l'applicazione. Verificare che il percorso utilizzato per il nome del file di input faccia riferimento a un file esistente e non importante.

Verifica del funzionamento delle operazioni di crittografia e decrittografia

Eseguire il test del codice con un file di testo (con estensione txt) per verificare che il file sia crittografato e decrittografato correttamente. Decrittografare il file in un nuovo file (come nella routine Sub Main() di questo articolo) anziché nel file originale. Esaminare il file decrittografato e confrontarlo con l'originale.

Elenco completo del codice

Imports System
Imports System.IO
Imports System.Security
Imports System.Security.Cryptography
Imports System.Runtime.InteropServices
Imports System.Text


Module Module1

   ' Call this function to remove the key from memory after it is used for security.
   <DllImport("kernel32.dll")> _
   Public Sub ZeroMemory(ByVal addr As IntPtr, ByVal size As Integer)
   End Sub

   ' Function to generate a 64-bit key.
   Function GenerateKey() As String
      ' Create an instance of a symmetric algorithm. The key and the IV are generated automatically.
      Dim desCrypto As DESCryptoServiceProvider = DESCryptoServiceProvider.Create()

      ' Use the automatically generated key for encryption. 
      Return ASCIIEncoding.ASCII.GetString(desCrypto.Key)

   End Function

   Sub EncryptFile(ByVal sInputFilename As String, _
                  ByVal sOutputFilename As String, _
                  ByVal sKey As String)

      Dim fsInput As New FileStream(sInputFilename, _
                                  FileMode.Open, FileAccess.Read)
      Dim fsEncrypted As New FileStream(sOutputFilename, _
                                  FileMode.Create, FileAccess.Write)

      Dim DES As New DESCryptoServiceProvider()

      'Set secret key for DES algorithm.
      'A 64-bit key and an IV are required for this provider.
      DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)

      'Set the initialization vector.
      DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

      'Create the DES encryptor from this instance.
      Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
      'Create the crypto stream that transforms the file stream by using DES encryption.
      Dim cryptostream As New CryptoStream(fsEncrypted, _
                                          desencrypt, _
                                          CryptoStreamMode.Write)

      'Read the file text to the byte array.
      Dim bytearrayinput(fsInput.Length - 1) As Byte
      fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
      'Write out the DES encrypted file.
      cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
      cryptostream.Close()
   End Sub

   Sub DecryptFile(ByVal sInputFilename As String, _
       ByVal sOutputFilename As String, _
       ByVal sKey As String)

      Dim DES As New DESCryptoServiceProvider()
      'A 64-bit key and an IV are required for this provider.
      'Set the secret key for the DES algorithm.
      DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
      'Set the initialization vector.
      DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

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

   Public Sub Main()
      'Must be 64 bits, 8 bytes.
      Dim sSecretKey As String

      ' Get the key for the file to encrypt.
      ' You can distribute this key to the user who will decrypt the file.
      sSecretKey = GenerateKey()

      ' For additional security, pin the key.
      Dim gch As GCHandle = GCHandle.Alloc(sSecretKey, GCHandleType.Pinned)


      ' Encrypt the file.        
      EncryptFile("%USERPROFILE%\MyData.txt", _
                      "%USERPROFILE%\Encrypted.txt", _
                      sSecretKey)

      ' Decrypt the file.
      DecryptFile("%USERPROFILE%\Encrypted.txt", _
                  "%USERPROFILE%\Decrypted.txt", _
                  sSecretKey)

      ' Remove the key from memory. 
      ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2)
      gch.Free()
   End Sub

End Module

Riferimenti

Per ulteriori informazioni sull'utilizzo delle funzionalità di crittografia di .NET Framework e sulla crittografia in generale, visitare i seguenti siti Web Microsoft (informazioni in lingua inglese):

http://msdn.microsoft.com/library/dotnet/cpref/frlrfsystemsecuritycryptography.htm

http://msdn.microsoft.com/net

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcreatingcryptographicscheme.asp

http://samples.gotdotnet.com/quickstart/

Proprietà

Identificativo articolo: 301070 - Ultima modifica: martedì 23 gennaio 2007 - Revisione: 5.3
Le informazioni in questo articolo si applicano a
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Chiavi: 
kbvs2005swept kbvs2005applies kbsecurity kbio kbcrypt kbhowtomaster KB301070
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