Das Verschlüsseln und Entschlüsseln von Dateien mithilfe von Visual C#

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 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 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 auf Visual C# unter
    Projekte, und klicken Sie unter Vorlagenauf Konsolenanwendungsprojekt. 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) auf die folgenden Namespaces:
    • System
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    Damit Sie keinen Deklarationen aus diesen Namespaces in Ihrem Code vornehmen müssen. Sie müssen diese Anweisungen vor allen anderen Deklarationen verwenden.
    using System;using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;

  4. Generieren Sie einen geheimem Schlüssel zum Verschlüssen 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 der Daten. Zum Entschlüsseln der Daten müssen die den selben Key und den selben IV haben. Sie müssen außerdem denselben Verschlüsselungsalgorithmus verwenden. Sie können die Schlüssel mithilfe einer 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 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 Microsoft.NET Framework SDK-Dokumentation oder der folgenden Microsoft Developer Network (MSDN)-Website:
  5. Fügen Sie die folgende Funktion zum Generieren eines neuen Schlüssels für eine Sitzung (wie in Methode 2 vom Schritt 4) hinzu:
    //  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 von der Zieldatei gelesen und in die Zieldatei geschrieben werden.
    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 auf die Dateien der tatsächlichen Verschlüsselung und die tatsächliche Entschlüsselung. An dieser Stelle können Sie einen anderen Anbieter erstellen, wenn Sie RSAsecutiry oder ein anderes Verschlüsselungsverfahren verwenden möchten.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
  9. Dem Kryptografieanbieter muss der geheime Schlüssel als Bytearray vorgelegt werden. 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. Die Größe des Schlüssels ist für jede Verschlüsselungstechnik. Data Encryption Standard (DES) hat beispielsweise eines 64-Bit-Schlüssels, der 8 Bytes bzw. 8 Zeichen entspricht.

    Wenn einen Schlüssel nicht angeben, generiert der Provider einen. Dies verschlüsselt die Datei erfolgreich, aber es gibt keine Möglichkeit zum Entschlüsseln der Datei. Beachten Sie, dass Sie auch den Initialisierungsvektor (IV) bereitstellen müssen. Dieser Wert wird als Teil der Verschlüsselung verwendet. Wie der Schlüssel, wird auch der Initialisierungsvektor zufällig generiert, wenn Sie keinen Wert angeben. Da die Werte für die Verschlüsselung und die Entschlüsselung identisch sein müssen, müssen Sie zufällige Generierung dieser Werte nicht zulassen.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

  10. Eine Instanz der CryptoStream -Klasse mithilfe des cryptographic Providers ein Verschlüsselungsobjekt (CreateEncryptor) zu erstellen und die vorhandenen FileStream -Objekt als Teil des Konstruktors.
    ICryptoTransform desencrypt = DES.CreateEncryptor();CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    desencrypt,
    CryptoStreamMode.Write);

  11. In der Eingabedatei gelesen und dann in die Ausgabedatei schreiben. Durchlaufen des CryptoStream -Objekts, in dem die Datei verschlüsselt wird, mithilfe des Schlüssel, die Sie zur Verfügung gestellt.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

Entschlüsseln einer Datei

Zum Entschlüsseln einer Datei gehen Sie folgendermaßen vor:
  1. Erstellen Sie eine Methode, und nennen Sie es
    DecryptFile. Der Entschlüsselungsvorgang entspricht dem Verschlüsselungsvorgang DecryptFile weist jedoch zwei wesentliche Unterschiede zu EncryptFile auf.
    • CreateDecryptor wird statt CreateEncryptor zum Objekt CryptoStream erstellen, das angibt, wie das Objekt verwendet werden kann.
    • Wenn der entschlüsselte Text in die Zieldatei geschrieben wird, ist das CryptoStream -Objekt jetzt die Quelle anstelle des Zieldatenstromes.
    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. Führen Sie die Anwendung aus. Stellen Sie sicher, dass der Pfad, für den Namen der Eingabedatei an eine vorhandene Datei verweist.

Die Prüfverfahren

Testen Sie den Code mit einer TXT-Datei zu bestätigen, dass der Code 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 zu entschlüsseln. Überprüfen Sie die entschlüsselte Datei, und vergleichen Sie ihn mit der ursprünglichen Datei.

Vollständiger Programmcode

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

Referenzen

Weitere Informationen zu Kryptografie und zum Verwenden der kryptografischen Features in .NET finden Sie auf der folgenden MSDN-Websites:
Eigenschaften

Artikelnummer: 307010 – Letzte Überarbeitung: 10.01.2017 – Revision: 1

Feedback