복붙노트

Mcrypt로 파일 암호화 / 암호 해독

PHP

Mcrypt로 파일 암호화 / 암호 해독

파일을 암호화하거나 암호 해독하고 여기에있는 클래스를 사용하여이 작업을 시도하고 수행하는 몇 가지 기능을 작성하려고합니다.

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

아래의 암호화 기능은 파일을 암호화하여 의도 된 디렉토리에 배치하는 것처럼 보입니다. 지금 파일을 해독하려고하는데, "해독을 완료하지 못했습니다"라는 메시지와 함께 죽습니다. (거기에 코딩되어 있습니다 ...) PHP 오류 로그에는 아무 것도 없으므로 실패 이유는 확실하지 않습니다. ,하지만 mcrypt는 완전히 새로운 것인데, 나는 여기서 내가 잘못된 것을하고 있다고 믿는 경향이있다.

함수는 다음과 같습니다.

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

해결법

  1. ==============================

    1.mcrypt를 사용하는 암호화를 위해이 PHP5 클래스를 사용해보십시오. 이 경우 AES 암호화를 사용합니다. 당신은 당신이 그것을 사용하는 각 사이트의 키를 변경하기를 원할 것입니다. 최소한 사용하지 않으면 자신의 버전을 작성하는 데 도움이 될 수 있습니다.

    mcrypt를 사용하는 암호화를 위해이 PHP5 클래스를 사용해보십시오. 이 경우 AES 암호화를 사용합니다. 당신은 당신이 그것을 사용하는 각 사이트의 키를 변경하기를 원할 것입니다. 최소한 사용하지 않으면 자신의 버전을 작성하는 데 도움이 될 수 있습니다.

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

    용법:

    $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
    

    노트:

  2. ==============================

    2.존스가 대답하는 동안 바이너리 안전 문제를 해결하기 위해 base64 인코딩을 사용하는 것은 잔인하며 암호화 된 파일을 원본보다 33 % 크게 만듭니다. 위의 모든 문제를 투명하게 해결하는 PHP 구현 AES Crypt 파일 형식입니다.

    존스가 대답하는 동안 바이너리 안전 문제를 해결하기 위해 base64 인코딩을 사용하는 것은 잔인하며 암호화 된 파일을 원본보다 33 % 크게 만듭니다. 위의 모든 문제를 투명하게 해결하는 PHP 구현 AES Crypt 파일 형식입니다.

    https://github.com/philios33/PHP-AES-File-Encryption

    그것은 바이너리 안전하며 인증 된 암호화를 포함합니다. 오픈 소스 aes crypt 파일 형식 (.aes)을 사용하므로 다른 .aes 소프트웨어와 완벽하게 호환됩니다.

    https://www.aescrypt.com/

    인터페이스는 암호화 또는 암호 해독 여부에 관계없이 매우 간단합니다. 소스 파일과 암호 만 입력하면됩니다.

  3. ==============================

    3.CakePHP는 rijndael을 꽤 잘 구현합니다. 나는 법적인 파급 효과가 확실하지 않기 때문에 여기에 직접 코드를 게시하는 것이 아닙니다.

    CakePHP는 rijndael을 꽤 잘 구현합니다. 나는 법적인 파급 효과가 확실하지 않기 때문에 여기에 직접 코드를 게시하는 것이 아닙니다.

    다음은 Security :: rijndael () 메소드의 API 문서입니다.

    파일을 인코딩하는 경우 'encrypt'로이 메소드를 호출하기 전에 base64_encode ()를 사용하고 'decrypt'로이 메소드를 호출 한 후 base64_decode ()

  4. ==============================

    4.Mcrypt를 사용하여 데이터를 암호화 / 해독하면 안됩니다. 귀하의 질문과 승인 된 답변에서 보여 지듯이, 데이터는 인증되지 않았기 때문에 선택된 암호문 공격에 희생 될 것입니다.

    Mcrypt를 사용하여 데이터를 암호화 / 해독하면 안됩니다. 귀하의 질문과 승인 된 답변에서 보여 지듯이, 데이터는 인증되지 않았기 때문에 선택된 암호문 공격에 희생 될 것입니다.

    또한 개발자가 암호화 기본 요소를 올바르게 조합 할 수 있도록 많은 노력을 기울였습니다. 따라서 Mcrypt 대신 PHP 프로젝트에 libsodium을 사용해야합니다. libsodium은 NaCl 포크입니다. NaCl / libsodium은 MAC 태그 확인을 통한 타이밍 공격과 같이 개발자가 스스로 발견 할 수있는 많은 암호화 함을 제거하기 위해 작성되었습니다.

    Mcrypt는 PHP 7.1에서 더 이상 사용되지 않으며 libsodim는 PHP에서 암호화를 처리하는 기본 방법입니다.

    PHP 프로젝트에서 libsodium을 사용하는 것은 쉽고 안전합니다. Scott Arciszewski는 https://paragonie.com/book/pecl-libsodium에서 PHP로 libsodium을 사용하는 방대한 전자 서적을 작성했습니다. PHP 암호 작성을하는 사람이라면 누구나 읽을만한 가치가 있습니다.

  5. from https://stackoverflow.com/questions/2448256/encrypting-decrypting-file-with-mcrypt by cc-by-sa and MIT license