PHP Mcrypt - şifreleme / çözme dosyası

2 Cevap php

Şifrelemek veya şifresini bir dosya ve denemek ve bunu gerçekleştirmek için burada bulunan sınıfını kullanıyorum işlevlere birkaç yazmaya çalışıyorum:

http://www.itnewb.com/v/PHP-Encryption-Decryption-Using-the-MCrypt-Library-libmcrypt

Bu dosyayı şifrelemek ve amaçlanan dizine koyun göründüğünü aşağıdaki şifreleme işlevi, iş gibi görünüyor. Ben şimdi dosyanın şifresini çalışıyorum ve sadece (orada kodlanmıştır ...) "şifresinin tamamlamak için başarısız" mesajının şey php hata günlükleri var ölür, bu yüzden başarısız neden emin değilim mcrypt benim için tamamen yeni olarak, ama, ben burada yanlış bir şey yapıyorum inanıyorlar daha iyiyim ...

İşte bu fonksiyonlar:

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

2 Cevap

Mcrypt kullanarak şifreleme için bu PHP5 sınıf deneyin. Bu durumda AES şifreleme kullanıyor. Sen bunu kullanmak her site için anahtarını değiştirmek isteyeceksiniz. Bunu kullanmak istemiyorsanız, en azından bunun kendi sürümünü yazma konusunda size rehberlik edebilir.

<?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_RANDOM);
        $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");
    }
}

Kullanımı:

$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

Notlar:

  • Bu sınıf (NUL bayt sona olabilir) ikili veri ile kullanım için güvenli değil
  • Bu sınıf doğrulanmış şifreleme sağlamaz.

CakePHP bir implementation oldukça iyi Rijandael vardır. Hukuki sonuçlarını emin değilim çünkü ben burada doğrudan kod ilanıyla değilim.

Here are the api docs Security::rijndael() yöntem.

Bir dosyayı şifreleyen varsa, 'encrypt' ile bu yöntemi çağırmadan önce base64_encode() isteyeceksiniz, ve base64_decode() ile bu yöntemi çağrıldıktan sonra '{[(3) ]} '