Das Verschlüsseln und Entschlüsseln einer Datei mithilfe von Visual C#

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 307010 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Eine Microsoft Visual Basic .NET Version dieses Artikels finden Sie unter 301070.
Dieser Artikel bezieht sich auf folgende Microsoft.NET Framework Class Library-Namespaces:
  • System.IO
  • System.Security
  • System.Security.Cryptography
Hinweis Dieser Artikel gilt nicht für die Microsoft.NET Framework 2.0.
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Artikel beschreibt, wie die kryptografischen Klassen verwenden, die bereitgestellt durch das Microsoft.NET Framework zum Verschlüsseln einer Datei auf unlesbaren und dann zum Entschlüsseln dieser Datei wieder zurück in ihr ursprüngliches Format werden.

Anforderungen

Die folgende Liste führt die empfohlene Hardware, Software, Netzwerkinfrastruktur und Servicepacks, die Sie benötigen:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server, Windows NT 4.0 Server oder Microsoft Windows XP Professional
  • Microsoft Visual Studio 2005 oder Microsoft Visual Studio.NET

Verschlüsselung und Entschlüsselung

Der System.Security.Cryptography -Namespace in das Microsoft.NET Framework bietet eine Vielzahl von Tools, die Ihnen helfen, mit Verschlüsselung und Entschlüsselung. Die CryptoStream -Klasse ist eine der vielen Klassen, die bereitgestellt wird. Die CryptoStream -Klasse dient zum Verschlüsseln oder Entschlüsseln der Inhalt beim Schreiben in eine Datei ist.

Verschlüsseln einer Datei

Gehen Sie folgendermaßen vor, um eine Datei zu verschlüsseln:
  1. Starten Sie Visual Studio 2005 oder Visual Studio .NET.
  2. Klicken Sie auf Visual C# unterProjekte, und klicken Sie dann unter Vorlagenauf Konsolenanwendung. Visual C# .NET erstellt eine statische Klasse sowie eine leere Prozedur Main() für Sie.
  3. Verwenden Sie die using -Anweisung (wie im folgenden Beispielcode angegeben) für folgende Namespaces:
    • System
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    Damit Sie keinen Deklarationen aus Thesenamespaces später in Ihrem Code vornehmen müssen. Sie müssen diese Anweisungen vor jeder Otherdeclarations verwenden.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
  4. Generiert einen geheimen Schlüssel zum Ver- und Entschlüsseln der Daten.Die DESCryptoServiceProvider basiert auf einem symmetrischen Verschlüsselungsalgorithmus. Die symmetrische Verschlüsselung erfordert einen Schlüssel und einen Initialisierungsvektor (IV) zum Verschlüsseln von Thedata. Um die Daten zu entschlüsseln, müssen Sie die gleichen Schlüssel und IV derselben verfügen. Auch Sie verwenden denselben Verschlüsselungsalgorithmus. Sie können die Schlüssel generieren, indem Usingeither der folgenden Methoden:
    • Methode 1 Sie können den Benutzer auffordern, ein Kennwort einzugeben. Verwenden Sie dann das Kennwort als Schlüssel und IV.
    • Methode 2 Wenn Sie eine neue Instanz der symmetrischen Kryptografieklasse erstellen, werden automatisch ein neuer Schlüssel und IV für die Sitzung erstellt. Verwenden Sie den Schlüssel und IV, die durch den verwalteten symmetrischen Kryptografieklasse zum Ver- und Entschlüsseln der Datei generiert werden.

      Weitere Informationen über das Generieren und Verteilen der Schlüssel finden Sie in der Dokumentation des Microsoft.NET Framework SDK oder finden Sie unter der folgenden Microsoft Developer Network (MSDN)-Website:
      Generieren von Schlüsseln für die Ver- und Entschlüsselung
  5. Fügen Sie die folgende Funktion generiert einen neuen Schlüssel für Asession (wie in Methode 2 von Schritt 4 notiert haben):
    //  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. Erstellen Sie in ihrer Klasse eine Methode mit dem Namen EncryptFile. Die EncryptFile -Klasse muss die folgenden drei Parameter enthalten:
    • sInputFilename
    • sOutputFilename
    • sKey (Dem geheimen Schlüssel, die zum Verschlüsseln und Entschlüsseln der Datei verwendet wird.)
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
    					
  7. Erstellen Sie in der Prozedur EncryptFile ein FileStream -Eingabeobjekt und eine Ausgabe FileStream -Objekt. Diese Objekte können gelesen und in die Targetfiles geschrieben.
    FileStream fsInput = new FileStream(sInputFilename, 
    				FileMode.Open, 
    				FileAccess.Read);
    
    FileStream fsEncrypted = new FileStream(sOutputFilename, 
    				FileMode.Create, 
    				FileAccess.Write);
    					
  8. Deklarieren Sie eine Instanz der DESCryptoServiceProvider -Klasse. Dies entspricht der tatsächlichen Verschlüsselung und die Actualdecryption-Technologie, die für die Dateien verwendet wird. An diesem Punkt können Sie unterschiedliche Anbieter erstellt, wenn Sie RSAsecutiry oder eine andere Cryptographictechnique verwenden möchten.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    					
  9. Der cryptographic Provider mit Schlüssel als Bytearray vorzulegen. Der System.Text -Namespace stellt eine Funktion mit dem Namen GetBytes(). Im Rahmen der Verschlüsselungsfeatures GetBytes() -Funktion akzeptiert eine Zeichenfolge und gibt ein Bytearray zurück. Thesize des Schlüssels ist für jede Verschlüsselungstechnik. Data Encryption Standard (DES) führt z. B. eines 64-Bit-Schlüssels, der 8 Byte oder zum 8 Zeichen lang ist.

    Wenn Sie keinen der Anbieter Randomlygenerates einen Schlüssel angeben. Dies erfolgreich die Datei verschlüsselt, aber es gibt keine Todecrypt wie die Datei. Beachten Sie, dass Sie auch die Initialisierung vector(IV) angeben müssen. Dieser Wert wird als Teil der Verschlüsselung verwendet. Wie der Schlüssel der IV Israndomly generiert, wenn Sie keinen Wert angeben. Da die Werte sein müssen für die Verschlüsselung und die Entschlüsselung denselben, Sie müssen nicht zulassen Randomgeneration dieser Werte.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Erstellen Sie eine Instanz der CryptoStream -Klasse mithilfe des cryptographic Providers erhalten Sie eine Encryptingobject (CreateEncryptor) sowie das vorhandene FileStream -Objekt als Teil des Konstruktors.
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    					desencrypt, 
    					CryptoStreamMode.Write);
    					
  11. Lesen Sie in der Eingabedatei, und klicken Sie dann in die Ausgabedatei geschrieben. Durchlaufen des CryptoStream -Objekts, in dem die Datei verschlüsselt wird, mithilfe der Taste, Youprovided.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    					

Entschlüsseln einer Datei

Um eine Datei zu entschlüsseln, gehen Sie folgendermaßen vor:
  1. Erstellen Sie eine Methode aus, und nennen Sie ihnDecryptFile. Die Entschlüsselung erfolgt ähnlich vor wie beim Theencryption, jedoch die DecryptFile -Prozedur hat zwei wesentliche Unterschiede bestehen die EncryptFile .
    • Statt CreateEncryptor dient CreateDecryptorCryptoStream -Objekt zu erstellen, das angibt, wie das Objekt verwendet werden kann.
    • Wenn des entschlüsselten Textes in die Zieldatei geschrieben werden, ist das CryptoStream -Objekt jetzt Quelldatenstrom und nicht als Zieldatenstrom.
    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. Fügen Sie die folgenden Zeilen zu der Main()-Prozedur EncryptFile und DecryptFileaufrufen :
    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. Speichern Sie die Datei. Führen Sie die Anwendung aus. Stellen Sie sicher, dass Thepath, die für die Eingabedatei Name verweist auf eine Existingfile verwendet wird.

Testen Sie die Prozedur

Testen Sie den Code mit einer Textdatei (.txt) zu bestätigen, dass der Code verschlüsselt und die Datei korrekt entschlüsselt. Stellen Sie sicher, dass die Datei in eine neue Datei (wie in der in diesem Artikel Main()-Prozedur) statt mit der ursprünglichen Datei zu entschlüsseln. Überprüfen Sie die entschlüsselte Datei, und vergleichen Sie es mit der ursprünglichen Datei.

Vollständige Codeauflistung

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

Informationsquellen

Weitere Informationen zum Verwenden der Kryptographiefunktionen in .NET und über Kryptographie finden Sie auf der folgenden MSDN-Websites:
System.Security.Cryptography-namespace
Microsoft.NET Framework Developer Center

Eigenschaften

Artikel-ID: 307010 - Geändert am: Montag, 3. März 2014 - Version: 3.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Keywords: 
kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 307010
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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