Chris_als_Gast: Verständnissfrage zur Verschlüsselung

Hallo Forum,

ich beschäftige mich erstmals mit dem Thema Verschlüsselung mit mcrypt (PHP). Als Anforderung ist folgendes gesetzt:

1. PHP stellt Daten zusammen und speichert es in einer Datei auf dem Server.
2. Diese Datei soll unmittelbar nach der Erstellung verschlüsselt ( mcrypt(blowfish o.ä.) ) werden.
3. Die verschlüsselte Datei ist nun downloadbar.
4. Die heruntergeladene Datei soll nun mit Windows-Tolls zur Ver-/Entschlüsselung entschlüsselbar sein.

Inzwischen habe ich sehr viel gelesen, dennoch scheitere ich an dieser Grundsatzfrage:
Nach meinem Verständnis ist es ein Unterschied, ob ich einen STRING verschlüsselt in einer Datei ablege, z.B. einer Textdatei ODER ob ich Klartext in die Datei (dieselbe Textdatei) schreibe und danach die DATEI verschlüssele.

Mein großes Problem ist, dass ich ein Tool für Windows benötige, mit dem die mit PHP verschlüsselte Datei wieder zu entschlüsseln ist, z.B. mit BlowFish, AxCrypt, TrueCrypt oder ähnlichem.

Hat jemand soetwas schon mal gemacht und kann mir aufs Pferd helfen?

VG
Chris

  1. Hallo Forum,

    ich beschäftige mich erstmals mit dem Thema Verschlüsselung mit mcrypt (PHP). Als Anforderung ist folgendes gesetzt:

    1. PHP stellt Daten zusammen und speichert es in einer Datei auf dem Server.

    Wozu erst im Klartext speichern? Das könnte die Sicherheit gefährden.

    1. Diese Datei soll unmittelbar nach der Erstellung verschlüsselt ( mcrypt(blowfish o.ä.) ) werden.

    Hier ein Beispiel für die symmetrische Verschlüsselung mit einem Passwort:

    <?php  
    $data="Hier stehen Seine Daten."; # Woher auch immer  
    #$password=$_POST['password']; # Woher auch immer  
    $password="GeHeim";  
    header ('Content-Type: text/plain');  
    header('Last-Modified: '.date('D, d M Y H:i:s T'));  
    header('Expires: 0');  
    header('Pragma: no-cache');  
    header('Cache-Control: private, no-store, no-cache, must-revalidate, max-age=0');  
    header('Cache-Control: post-check=0, pre-check=0', false);  
    header('Content-Disposition: attachment; filename="file.enc"');  
    $sys  
    system("echo '$data' | openssl enc -aes-256-cbc -a -salt -pass pass:'$password'");  
    ?>
    
    1. Die verschlüsselte Datei ist nun downloadbar.

    Schon mit erledigt.

    1. Die heruntergeladene Datei soll nun mit Windows-Tolls zur Ver-/Entschlüsselung entschlüsselbar sein.

    Sdjes nachodiza problem! - Aber wenn openssl installiert ist kann man es mit:

    ~> openssl enc -d -aes-256-cbc -a -in file.enc
    oder
    -> openssl enc -d -aes-256-cbc -a -in file.enc > out.file

    entschlüsseln. Das Passwort wird abgefragt. Die Verschlüsselung kannst Du übrigens frei wählen.

    Weiterführend:

    Windows-Software: (Linux Benutzer brauchen OpenSSL oft nicht mehr mal nachinstallieren...)

    Jörg Reinholz

    1. Ich sehe gerade, ich habe das ohne wichtige Sicherheitsfunktionen gemacht. Besser:

      <?php  
      $data  = 'Hier stehen Deine Daten.'; # Woher auch immer  
      #$password=$_POST['password']; # Woher auch immer  
      $password="Ge'Heim";  
        
      header ('Content-Type: text/plain');  
      header('Last-Modified: '.date('D, d M Y H:i:s T'));  
      header('Expires: 0');  
      header('Pragma: no-cache');  
      header('Cache-Control: private, no-store, no-cache, must-revalidate, max-age=0');  
      header('Cache-Control: post-check=0, pre-check=0', false);  
        
      $sys = 'echo ' . escapeshellarg($data) . ' | openssl enc -aes-256-cbc -a -salt -pass pass:' . escapeshellarg($password);  
      system($sys);  
      ?>
      

      Jörg Reinholz

    2. Hallo Jörg,

      1. PHP stellt Daten zusammen und speichert es in einer Datei auf dem Server.
        Wozu erst im Klartext speichern? Das könnte die Sicherheit gefährden.

      Es wird eine *.csv-Datei erstellt und die wäre für Millisekunden unverschlüsselt.

      Hier ein Beispiel für die symmetrische Verschlüsselung mit einem Passwort:

      <?php

      $data="Hier stehen Seine Daten."; # Woher auch immer

      [cut]

      ?>

      Auch hier wird ein String "`$data="Hier stehen Seine Daten.";`{:.language-php}" verschlüsselt und nicht eine Datei "`$data="./geheimePasswoerter.csv";`{:.language-php} - oder?! Mir ist nicht klar, ob das ein Unterschied ist! Wenn ich einen String verschlüssele und in eine .csv-Datei schreibe, dann ist zwar der Inhalt der Datei verschlüsselt, aber nicht die Datei selbst - nach meinem Verständnis. In der Folge würde man eine csv.-Datei auch immer mit Excel geöffnet bekommen und NICHT mit einem Windows-Crypt-Tool, wie die oben von mir angegebenen.  
        
      
      > Sdjes nachodiza problem! - Aber wenn openssl installiert ist kann man es mit:  
      > ~> openssl enc -d -aes-256-cbc -a -in file.enc  
      > oder  
      > -> openssl enc -d -aes-256-cbc -a -in file.enc > out.file  
      > entschlüsseln. Das Passwort wird abgefragt. Die Verschlüsselung kannst Du übrigens frei wählen.  
        
      Sodala taucht eben genau das Problem auf, was ich nicht verstehe: "openssl enc ... file.enc" - ich muss ein FILE.enc angeben!! Wird openssl nun die csv.-Datei mit verschlüsseltem Inhalt erkennen und den Inhalt entschlüsseln oder funktioniert das nur wenn die csv.-Datei SELBST verschlüsselt ist?  
        
      Danke für Deine Tipps und den Code.  
        
      VG  
      Chris
      
      1. Wird openssl nun die csv.-Datei mit verschlüsseltem Inhalt erkennen und den Inhalt entschlüsseln oder funktioniert das nur wenn die csv.-Datei SELBST verschlüsselt ist?

        Wie verschlüsselt man denn eine Datei? Man liest sie aus, verschlüsselt die Bytewurst und schreibt das wieder in eine Datei.

        1. Hallo unbekanntEr,

          Wie verschlüsselt man denn eine Datei? Man liest sie aus, verschlüsselt die Bytewurst und schreibt das wieder in eine Datei.

          Das ist eine klare, kurze und knappe Aussage, die den Kern trifft. Jetzt habe ich es verstanden.

          Danke und VG
          Chris

      2. Ob Du einen "String" verschlüsselst oder eine Date ist, geneu genommen, kein Unterschied. bei der Datei wird ja der Dateininhalt verschlüsselt. Also ein "String".

        Dein Wollen:

        Du willst mit PHP einen String erzeugen und in eine Datei schreiben.
        Dann willst Du die Datei verschlüsseln, das Original löschen.
        Dann willst Du die verschlüsselte Datei zum Download anbieten.
        Dann willst Du die Datei löschen.

        Mein Vorschlag:

        Du solltest (meinetwegen) mit PHP einen String erzeugen.
        Du sollst den String noch im Arbeitsspeicher verschlüsseln.
        Du sollst den verschlüsselten String direkt zum Empfänger senden.
        Du sollst also eine Menge Umwege und Mühen sparen.

        Sodala taucht eben genau das Problem auf, was ich nicht verstehe: "openssl enc ... file.enc" - ich muss ein FILE.enc angeben!

        Ja. Das ist die Entschlüsselung der heruntergeladenen Datei auf dem Host des Empfängers.

        Wo ist also das Problem? Weist Du nicht, was Du willst?

        Wenn Du GAR KEINE Datei haben willst, dann nimm HTTPS. Allerdings kann dann jeder zugreifen, das ist nur eine Transportverschlüsselung zwischen dem Server und beliebigen Clients.

        Willst Du nur für einen bestimmten Empfänger verschlüsseln, dann handle mit ihm das Passwort (Das kann auch eine Datei sein!) aus oder besorge Dir seinen öffentlichen PGP-Schlüssel und gib ihm Deinen öffentlichen PGP-Schlüssel. Freilich musst Du dann statt openSSL gpg oder pgp benutzen und für das Verschlüsseln einen Schlüssel nehmen, der KEINE Passworteingabe erfordert und Deinen Schlüssel (private key) auf dem Server speichern.

        Jörg Reinholz

        1. Ob Du einen "String" verschlüsselst oder eine Date ist, geneu genommen, kein Unterschied. bei der Datei wird ja der Dateininhalt verschlüsselt. Also ein "String".

          <cut>

          Mein Vorschlag:

          <cut>

          Du sollst den verschlüsselten String direkt zum Empfänger senden.

          DAS war der Hinweis, der mich die Zusammenhänge erkennen lässt. Danke!

          Du sollst also eine Menge Umwege und Mühen sparen.

          Du hast Recht - machmal denke ich viel zu kompliziert. :/

          Meine Anpassung Deines Scriptes an meine Bedürfnisse funktioniert einwandfrei, auch in Verbindung mit openssl für Windows.

          Vielen Dank für Deine Hilfe und Geduld.

          VG
          Chris

  2. Hallo Forum,

    ich beschäftige mich erstmals mit dem Thema Verschlüsselung mit mcrypt (PHP). Als Anforderung ist folgendes gesetzt:

    1. PHP stellt Daten zusammen und speichert es in einer Datei auf dem Server.
    2. Diese Datei soll unmittelbar nach der Erstellung verschlüsselt ( mcrypt(blowfish o.ä.) ) werden.
    3. Die verschlüsselte Datei ist nun downloadbar.
    4. Die heruntergeladene Datei soll nun mit Windows-Tolls zur Ver-/Entschlüsselung entschlüsselbar sein.

    Kannst du bei PHP nicht ein verschlüsseltes ZIP Archiv erstellen lassen? Das wäre aus meiner Sicht eine sehr elegante Lösung, weil man dann einen bewährten plattformunabhängigen Standard benutzt.