none
Datei verschlüsseln .NET RRS feed

  • Frage

  • Hallo Leute,
    ich versuche eine beliebige Datei zu verschlüsseln und zu entschlüsseln.
    Ich habe bei Microsoft folgendes Beispiel für C# gefunden.

    http://support.microsoft.com/default.aspx/kb/307010/de

    Das klappt auch, wenn ich Textdateien verschlüssele, bei Dateien für Word oder Excel ensteht aber nach dem entschlüsseln ein völlig unbrauchbares Ergebnis.

    Was ist den da falsch?
    Hat jemand einen Hinweis auf ein besseres Verfahren?

    Danke im Voraus für jede Hilfe
    Niels
    Samstag, 16. Januar 2010 10:27

Antworten

  • Hallo Niels,

    das Beispiel funktioniert bei mir auch nur mit Textdateien, aber nicht mit Binärdateien, da in dem Beispiel StreamReader/StreamWriter verwendet werden. Diese arbeiten üblicherweise auf Textbasis. Um das Beispiel für Binärdateien fit zu machen, muss man den StreamReader/StreamWriter durch einen normalen FileStream ersetzen. Auf Basis des Beispiels aus der KB:

          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.
            FileStream fsDecrypted = new FileStream(sOutputFilename, FileMode.Create);
            Byte[] decrypt = ReadAllBytes(cryptostreamDecr);
    
            fsDecrypted.Write(decrypt, 0, decrypt.Length);
            fsDecrypted.Flush();
            fsDecrypted.Close();
          }
    
          static Byte[] ReadAllBytes(Stream input)
          {
            int readBytes = 0;
    
            byte[] buffer = new byte[1024];
            ArrayList bufferRead = new ArrayList();
    
            do
            {
              readBytes = input.Read(buffer, 0, buffer.Length);
    
              if (readBytes > 0)
              {
                byte[] tmp = new byte[readBytes];
                Array.Copy(buffer, tmp, readBytes);
                bufferRead.AddRange(tmp);
              }
            } while (readBytes != 0);
    
            return (byte[])bufferRead.ToArray(typeof(byte));
          } 
    
    Ohne Anspruch auf Vollständigkeit.
    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert NielsUrig Sonntag, 17. Januar 2010 10:58
    Samstag, 16. Januar 2010 23:58
    Beantworter

Alle Antworten

  • Nunja, in dem Beispiel wird aber auch darauf hingewiesen, daß es für Textdateien ist. Und Word und Excel sind nunmal binär.

    Ein besseres Beispiel hab ich im C# 2008 Codebook gefunden, das geht über Filestream, sollte also tun. Ich fürchte nur, wegen Copyright kann ich nicht einfach das komplette Beispiel hier reinkopieren :-(
    Samstag, 16. Januar 2010 12:56
  • Hallo Niels,

    richtig angewendet, ist es egal, ob Textdateien oder binäre Dateien (was Word und Excel zunächst einmal sind)
    verschlüsselt werden.  Wichtig ist nur, dass in beiden Fällen der gleiche Schlüssel verwendet wird.

    Auch wenn der Artikel etwas älter (.NET 1.x) ist, sehe ich keinen direkten Fehler, nur Unschönheiten.
    So wird ein ASCII Encoding für den Schlüssel verwendet, womit Umlaute uam. nicht interpretiert
    werden und in einem Schlüssel nicht verwendet werden sollten.
    Und DES ist nach heutigem Verständnis nicht mehr besonders sicher, üblicherweise wird heute AES verwendet.

    Einiges findest Du unter Kryptografische Dienste , wovon Du die Grundlagen verstanden haben solltest.
    Eine größere Auswahl an Beispielprojekten findest Du z. B. bei CodeProject

    Gruß Elmar

    Samstag, 16. Januar 2010 13:21
    Beantworter
  • Hallo Elmar, hallo Träne!
    Danke für die Rückmeldung.

    "richtig angewendet, ist es egal, ob Textdateien oder binäre Dateien (was Word und Excel zunächst einmal sind)
    verschlüsselt werden.  Wichtig ist nur, dass in beiden Fällen der gleiche Schlüssel verwendet wird."

    Davon bin ich bisher auch ausgegangen. Der Beispielcode kommt aber irgendwie nicht damit klar. Ich habe den Code direkt aus dem Beispiel kopiert (damit wird auch für beide Vorgänge der gleiche Key verwendet). Lediglich die Dateinamen habe ich geändert, und trotzdem ist die Ergebnisdatei nicht mit der Ausgangsdatei identisch. Schon die Größe stimmt nicht ganz exakt. Vor allem stellen Word und Excel den Inhalt der Datei anschließend nicht (oder nicht mehr richtig) dar. :-(

    Funktioniert das Beispiel bei Euch oder ist da doch was faul?

    Danke für den Hinweis auf CodeProject und das "alte" DES-Verfahren. Ich schaue mal nach.

    Gute Nacht.
    Niels

    Samstag, 16. Januar 2010 21:43
  • Hallo Niels,

    das Beispiel funktioniert bei mir auch nur mit Textdateien, aber nicht mit Binärdateien, da in dem Beispiel StreamReader/StreamWriter verwendet werden. Diese arbeiten üblicherweise auf Textbasis. Um das Beispiel für Binärdateien fit zu machen, muss man den StreamReader/StreamWriter durch einen normalen FileStream ersetzen. Auf Basis des Beispiels aus der KB:

          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.
            FileStream fsDecrypted = new FileStream(sOutputFilename, FileMode.Create);
            Byte[] decrypt = ReadAllBytes(cryptostreamDecr);
    
            fsDecrypted.Write(decrypt, 0, decrypt.Length);
            fsDecrypted.Flush();
            fsDecrypted.Close();
          }
    
          static Byte[] ReadAllBytes(Stream input)
          {
            int readBytes = 0;
    
            byte[] buffer = new byte[1024];
            ArrayList bufferRead = new ArrayList();
    
            do
            {
              readBytes = input.Read(buffer, 0, buffer.Length);
    
              if (readBytes > 0)
              {
                byte[] tmp = new byte[readBytes];
                Array.Copy(buffer, tmp, readBytes);
                bufferRead.AddRange(tmp);
              }
            } while (readBytes != 0);
    
            return (byte[])bufferRead.ToArray(typeof(byte));
          } 
    
    Ohne Anspruch auf Vollständigkeit.
    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert NielsUrig Sonntag, 17. Januar 2010 10:58
    Samstag, 16. Januar 2010 23:58
    Beantworter
  • Hallo Thorsten,
    danke für Deinen Code. Es klappt hervorragend.

    Das das Problem beim StreamWriter liegt, hätte ich nie herausgefunden :-). Diese Stream-Geschichten sind für mich sowieso ein Buch mit sieben Siegeln und dann noch so viele unterschiedliche ...

    Herzlichen Dank und ein schönes Wochenende.
    Niels
    Sonntag, 17. Januar 2010 11:01