Frage

Versuchen Sie, ein paar Funktionen zu schreiben, die eine Datei verschlüsseln oder entschlüsseln und die hier gefundene Klasse verwenden, um dies zu erreichen:

http://www.itnewb.com/v/php-encryptiondecryption-using-the-mcrypt-library-libmcrypt

Die folgende Verschlüsselungsfunktion scheint zu funktionieren, da sie die Datei verschlüsselt und in das beabsichtigte Verzeichnis platziert. Ich versuche jetzt, die Datei zu entschlüsseln, und sie stirbt nur mit der Meldung "Die Entschlüsselung nicht abgeschlossen" (die dort codiert ist ...). In den PHP -Fehlerprotokollen ist nichts mehr Aber als McRypt für mich völlig neu ist, bin ich mehr als geneigt zu glauben, dass ich hier etwas falsch mache ...

Hier sind die Funktionen:

//ENCRYPT FILE
    function encryptFile() {
        global $cryptastic;
        $pass = PGPPASS;
        $salt = PGPSALT;
        $key = $cryptastic->pbkdf2($pass, $salt, 1000, 32) or die("Failed to generate secret key.");

        if ($handle = opendir(PATH.'/ftpd')) {
            while (false !== ($file = readdir($handle))) {
                if ($file != "." && $file != "..") {
                    $newfile = PATH.'/encrypted/'.$file.'.txt';
                    $msg = file_get_contents(PATH.'/ftpd/'.$file);
                    $encrypted = $cryptastic->encrypt($msg, $key) or die("Failed to complete encryption.");
                    $nfile = fopen($newfile, 'w');
                    fwrite($nfile, $encrypted);
                    fclose($nfile);
                    unlink(PATH.'/ftpd/'.$file);

                }
            }
            closedir($handle);
        }       


//DECRYPT FILE
    function inFTP() {
        global $cryptastic;
        $pass = PGPPASS;
        $salt = PGPSALT;
        $key = $cryptastic->pbkdf2($pass, $salt, 1000, 32) or die("Failed to generate secret key.");

        if ($handle = opendir(PATH.'/encrypted')) {
            while (false !== ($file = readdir($handle))) {
                if ($file != "." && $file != "..") {
                    $newfile = PATH.'/decrypted/'.$file;
                    $msg = PATH.'/encrypted/'.$file;
                    $decrypted = $cryptastic->decrypt($msg, $key) or die("Failed to complete decryption.");
                    $nfile = fopen($newfile, 'w');
                    fwrite($nfile, $decrypted);
                    fclose($nfile);
                    //unlink(PATH.'/encrypted/'.$file);

                }
            }
            closedir($handle);
        }       
        //$crypt->decrypt($file);
    }
War es hilfreich?

Lösung

Probieren Sie diese PHP5 -Klasse für die Verschlüsselung mit McRypt aus. In diesem Fall wird die AES -Verschlüsselung verwendet. Sie möchten den Schlüssel für jede Website ändern, auf der Sie ihn verwenden. Wenn Sie es nicht zumindest verwenden, kann es Sie dazu führen, dass Sie Ihre eigene Version davon schreiben.

<?php

class Encryption
{
    const CIPHER = MCRYPT_RIJNDAEL_128; // Rijndael-128 is AES
    const MODE   = MCRYPT_MODE_CBC;

    /* Cryptographic key of length 16, 24 or 32. NOT a password! */
    private $key;
    public function __construct($key) {
        $this->key = $key;
    }

    public function encrypt($plaintext) {
        $ivSize = mcrypt_get_iv_size(self::CIPHER, self::MODE);
        $iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM);
        $ciphertext = mcrypt_encrypt(self::CIPHER, $this->key, $plaintext, self::MODE, $iv);
        return base64_encode($iv.$ciphertext);
    }

    public function decrypt($ciphertext) {
        $ciphertext = base64_decode($ciphertext);
        $ivSize = mcrypt_get_iv_size(self::CIPHER, self::MODE);
        if (strlen($ciphertext) < $ivSize) {
            throw new Exception('Missing initialization vector');
        }

        $iv = substr($ciphertext, 0, $ivSize);
        $ciphertext = substr($ciphertext, $ivSize);
        $plaintext = mcrypt_decrypt(self::CIPHER, $this->key, $ciphertext, self::MODE, $iv);
        return rtrim($plaintext, "\0");
    }
}

Verwendungszweck:

$key = /* CRYPTOGRAPHIC!!! key */;
$crypt = new Encryption($key);
$encrypted_string = $crypt->encrypt('this is a test');
$decrypted_string = $crypt->decrypt($encrypted_string); // this is a test

Anmerkungen:

  • Diese Klasse ist nicht sicher für die Verwendung von Binärdaten (die in NUL -Bytes enden können)
  • Diese Klasse bietet keine authentifizierte Verschlüsselung.

Andere Tipps

Während Johns Antwort gut ist, ist die Verwendung von Base64 -Codierung, um das Binärsicherheitsproblem zu beheben, übertrieben und macht Ihre verschlüsselten Dateien um 33% größer als das Original. Hier ist meine PHP -Implementierung des AES Crypt -Dateiformates, das alle oben genannten Probleme transparent löst.

https://github.com/philios33/php-aes-file-encryption

Es ist binär sicher und umfasst authentifizierte Verschlüsselung. Da es das Open Source AES Crypt Dateiformat (.aes) verwendet, ist es vollständig mit anderen .aes -Software kompatibel.

https://www.aescrypt.com/

Die Benutzeroberfläche ist ziemlich einfach, ob Sie verschlüsseln oder entschlüsseln. Sie geben ihm nur eine Quelldatei und ein Passwort.

Sie sollten McRypt nicht verwenden, um Daten zu verschlüsseln/zu entschlüsseln. Wie in Ihrer Frage und in der akzeptierten Antwort gezeigt, werden die Daten nicht authentifiziert, was bedeutet, dass sie den ausgewählten Chiffretext -Angriffen zum Opfer fallen.

Darüber hinaus wurde viel Anstrengungen unternommen, um sicherzustellen, dass Entwickler kryptografische Primitive korrekt zusammenstellen. Anstelle von McRypt sollten Sie Libsodium für Ihre PHP -Projekte verwenden. Libsodium ist eine NaCl -Gabel. NaCl/Libsodium wird geschrieben, um viele der kryptografischen Fallstricke zu entfernen, in denen Entwickler sich befinden, z. B. Timing -Angriffe mit Überprüfung von MAC -Tags.

McRypt ist in PHP 7.1 veraltet, und Libsodim ist die bevorzugte Art, in PHP mit der Kryptographie umzugehen.

Die Verwendung von Libsodium in Ihrem PHP -Projekt ist einfach und sicher. Scott Arciszewski hat ein umfangreiches eBook über die Verwendung von Libsodium mit PHP bei geschrieben https://paragonie.com/book/pecl-libsodium. Es ist die Lektüre für alle wert, die PHP -Kryptographie macht.

CakePhp hat ein ziemlich gutes Implementierung von Rijndael. Ich poste Code hier nicht direkt, da ich nicht sicher bin, ob die rechtlichen Auswirkungen.

Hier sind die API -Dokumente für die Security::rijndael() Methode.

Wenn Sie eine Datei codieren, möchten Sie base64_encode() Bevor Sie diese Methode mit 'aufrufen'encrypt', und base64_decode() Nach dem Aufrufen dieser Methode mit 'decrypt'

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top