PHP Encrypt Data, Bash Decrypt it

后端 未结 3 980
滥情空心
滥情空心 2020-12-18 10:24

I am trying to come up with a way to have PHP encrypt a file. I used to just use a PHP system call to run a script that encoded the file:

#!/bin/sh
/usr/bin/         


        
3条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-18 11:09

    As stated above in the comments padding is necessary to make this work. The function below will make a file that can be decrypted on the command line like this:

    openssl enc -d -aes-256-cbc -a -salt -in test.txt
    

    The test.txt file is created from the output of the ssl_encrypt function below.

    function ssl_encrypt($pass, $data)
    {
        // Set a random salt
        $salt = substr(md5(mt_rand(), true), 8);
    
        $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        $pad = $block - (strlen($data) % $block);
    
        $data = $data . str_repeat(chr($pad), $pad);
    
        // Setup encryption parameters
        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, "", MCRYPT_MODE_CBC, "");
    
    
        $key_len =  mcrypt_enc_get_key_size($td);
        $iv_len =  mcrypt_enc_get_iv_size($td);
    
        $total_len = $key_len + $iv_len;
        $salted = '';
        $dx = '';
        // Salt the key and iv
        while (strlen($salted) < $total_len)
        {
            $dx = md5($dx.$pass.$salt, true);
            $salted .= $dx;
        }
        $key = substr($salted,0,$key_len);
        $iv = substr($salted,$key_len,$iv_len);
    
    
        mcrypt_generic_init($td, $key, $iv);
        $encrypted_data = mcrypt_generic($td, $data);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
    
    
        return chunk_split(base64_encode('Salted__' . $salt . $encrypted_data),32,"\r\n");
    }
    

    Example Usage:

    $plainText = "Secret Message";
    $password = "SecretPassword";
    $test = ssl_encrypt($password, $plainText);
    $file = fopen('test.txt', 'wb');
    // Write the Base64 encrypted output to a file.
    fwrite($file, $test);
    fclose($file);
    // Show the output on the screen
    echo $test;
    

    References: http://juan.boxfi.com/2010/03/16/write-openssl-files-in-php/

提交回复
热议问题