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

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
Eine Microsoft Visual Basic-NET-Version dieses Artikels finden Sie unter 301070.
Dieser Artikel bezieht sich auf die folgenden Namespaces für Microsoft.NET Framework-Klassenbibliothek:
  • System.IO
  • System.Security
  • System.Security.Cryptography
Hinweis Dieser Artikel gilt nicht für Microsoft.NET Framework 2.0.
Zusammenfassung
Dieser Artikel beschreibt, wie Sie mithilfe der im Microsoft .NET Framework enthaltenen Verschlüsselungsklassen eine Textdatei unlesbar verschlüsseln und diese wieder in das ursprüngliche Format entschlüsseln.

Voraussetzungen

Die folgende Liste beschreibt empfohlene Hardware, Software, Netzwerkinfrastruktur und Servicepacks, die Sie benötigen:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server, Windows NT Server 4.0 oder Microsoft Windows XPProfessional
  • Microsoft Visual Studio 2005 oder Microsoft Visual Studio

Verschlüsselung und Entschlüsselung

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

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 unter Vorlagenauf Konsolenanwendungsprojekteauf Visual C#Projekte Visual C# NET erstellt eine statische Klasse und eine leere Prozedur Main() für Sie.
  3. Verwenden Sie die using -Anweisung (wie im folgenden Beispielcode) für folgende Namespaces:
    • System
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    Damit Sie keinen Deklarationen Thesenamespaces später in Ihrem Code vornehmen müssen. Verwenden Sie diese Anweisung vor jeder Otherdeclarations.
    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. DESCryptoServiceProvider basiert auf einem symmetrischen Verschlüsselungsalgorithmus. Die symmetrische Verschlüsselung erfordert einen Schlüssel und einen Initialisierungsvektor (IV) zum Verschlüsseln von Thedata. Zum Entschlüsseln der Daten müssen Sie den gleichen Schlüssel und IV derselben. Sie auch verwenden denselben Verschlüsselungsalgorithmus. Die Schlüssel können Sie durch Usingeither der folgenden Methoden erstellen:
    • 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 von verwalteten symmetrischen Kryptografieklasse zum Ver- und Entschlüsseln der Datei generiert.

      Weitere Informationen zum Erstellen und Verteilen von Schlüsseln finden Sie in der Dokumentation des Microsoft.NET Framework SDK oder finden Sie in der Website des Microsoft Developer Network (MSDN):
  5. Fügen Sie die folgende Funktion generiert einen neuen Schlüssel für Asession (wie in Methode 2 Schritt 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. Erstellen Sie eine Methode in der Klasse mit dem Namen EncryptFile. Die EncryptFile -Klasse muss die folgenden drei Parameter haben:
    • sInputFilename
    • sOutputFilename
    • sKey (Der geheime Schlüssel, der zum Verschlüsseln und Entschlüsseln der Datei verwendet wird.)
    static void EncryptFile(string sInputFilename,		string sOutputFilename,		string sKey)					
  7. In der Prozedur EncryptFile erstellen Sie ein FileStream -Eingabeobjekt und ein FileStream-Ausgabeobjekt. 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 Klasse DESCryptoServiceProvider. Dies ist die tatsächliche Verschlüsselung und Actualdecryption Technologie, die auf die Dateien angewendet. An diesem Punkt können unterschiedliche Anbieter erstellt, wenn Sie RSAsecutiry oder eine andere Cryptographictechnique verwenden möchten.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();					
  9. Der Kryptografieanbieter mit Yoursecret Schlüssel als Bytearray vorzulegen. 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) hat beispielsweise eines 64-Bit-Schlüssels, 8 Byte oder zum 8 Zeichen.

    Wenn Sie keinen Anbieter Randomlygenerates einen Schlüssel angeben. Dies erfolgreich verschlüsselt, aber keine Todecrypt wie die Datei vorhanden ist. Beachten Sie, dass auch das vector(IV) Initialisierung bereitstellen muss. Dieser Wert wird als Teil der Verschlüsselung verwendet. Wie der Schlüssel IV Israndomly generiert, wenn Sie keinen Wert angeben. Da die Werte Bethe müssen für die Verschlüsselung und die Entschlüsselung denselben, Sie müssen nicht gestatten Randomgeneration 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 zu einem Encryptingobject (CreateEncryptor) sowie das vorhandene FileStream -Objekt als Teil des Konstruktors.
    ICryptoTransform desencrypt = DES.CreateEncryptor();CryptoStream cryptostream = new CryptoStream(fsEncrypted, 					desencrypt, 					CryptoStreamMode.Write);					
  11. In der Eingabedatei gelesen und anschließend in die Ausgabedatei geschrieben. Durchlaufen Sie CryptoStream -Objekt, in dem die Datei verschlüsselt wird, mithilfe des Schlüssels, Youprovided.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);					

Entschlüsseln einer Datei

Entschlüsseln eine Datei folgendermaßen Sie vor:
  1. Erstellen Sie eine Methode aus, und nennen Sie esDecryptFile. Die Entschlüsselung erfolgt ähnlich 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.
    • Des entschlüsselten Textes in die Zieldatei geschrieben werden, wird das CryptoStream -Objekt jetzt Quelle 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. Main() aufzurufenden EncryptFile und DecryptFilefügen Sie folgenden Zeilen hinzu:
    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. Die Anwendung auszuführen. Stellen Sie sicher, Thepath für Eingabedatei Name verweist auf eine Existingfile verwendet wird.

Die Prüfverfahren

Testen Sie den Code mit einer TXT-Datei 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 die in diesem Artikel Main()-Prozedur) statt mit der ursprünglichen Datei entschlüsseln. Entschlüsselte Datei, und vergleichen Sie ihn mit der ursprünglichen Datei.

Vollständige Codeliste

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 zu Kryptografie und zum Verwenden der Kryptographiefunktionen NET finden Sie auf der folgenden MSDN-Websites:

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 307010 – Letzte Überarbeitung: 05/01/2016 20:21:00 – Revision: 6.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 KbMtde
Feedback