首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP加密数据,Bash解密数据

PHP加密数据,Bash解密数据
EN

Stack Overflow用户
提问于 2011-09-20 05:07:29
回答 3查看 5K关注 0票数 4

我正在尝试想出一种让PHP加密文件的方法。我过去只使用PHP系统调用来运行对文件进行编码的脚本:

代码语言:javascript
运行
复制
#!/bin/sh
/usr/bin/openssl aes-256-cbc -a -salt -k $1 -in $2

参数1是要使用的密码,参数2是数据。然后,我在计算机上使用第二个脚本对文件进行解密。

代码语言:javascript
运行
复制
#!/bin/sh
/usr/bin/openssl aes-256-cbc -a -d -salt -k $1 -in $2

这种加密方法在生产主机上不起作用,因为PHP系统调用已禁用。我也不希望在所有可能的情况下改变解码功能。

有没有办法只用PHP就能复制上面的加密函数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-21 22:45:45

如上所述,在注释中填充是必要的,以使这项工作。下面的函数将生成一个可以在命令行上解密的文件,如下所示:

代码语言:javascript
运行
复制
openssl enc -d -aes-256-cbc -a -salt -in test.txt

下面的ssl_encrypt函数的输出创建了test.txt文件。

代码语言:javascript
运行
复制
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");
}

示例用法:

代码语言:javascript
运行
复制
$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;

参考资料:http://juan.boxfi.com/2010/03/16/write-openssl-files-in-php/

票数 2
EN

Stack Overflow用户

发布于 2011-09-20 06:27:16

看一看mcyrpt_encrypt()

代码语言:javascript
运行
复制
string mcrypt_encrypt ( string $cipher , string $key , string $data , 
                        string $mode [, string $iv ] )

$cipher设置为MCRYPT_RIJNDAEL_128 (AES-128),将$mode设置为MCRYPT_MODE_CBC

然后使用base64_encode()生成base-64编码的输出(即:-a选项的作用)。

openssl按如下方式派生密钥和IV:

代码语言:javascript
运行
复制
Key = MD5(Password + Salt)
IV  = MD5(Key + Password + Salt)

其中Salt是一个8字节的盐。考虑到这一点,我创建了简单的encrypt()decrypt()例程:

代码语言:javascript
运行
复制
function ssl_encrypt($pass, $data) {

    $salt = substr(md5(mt_rand(), true), 8);

    $key = md5($pass . $salt, true);
    $iv = md5($key . $pass . $salt, true);

    $ct = mcrypt_encrypt (MCRYPT_RIJNDAEL_128, $key, $data, 
                          MCRYPT_MODE_CBC, $iv);

    return base64_encode('Salted__' . $salt . $ct);
}

function ssl_decrypt($pass, $data) {

    $data = base64_decode($data);
    $salt = substr($data, 8, 8);
    $ct = substr($data, 16);

    $key = md5($pass . $salt, true);
    $iv = md5($key . $pass . $salt, true);

    $pt = mcrypt_decrypt (MCRYPT_RIJNDAEL_128, $key, $ct, 
                          MCRYPT_MODE_CBC, $iv);

    return $pt;
}

参数$data接受要加密的字符串。如果你想加密一个文件,你必须通过file_get_contents()或类似的方式获取它,然后将其传递给函数。

用法:

代码语言:javascript
运行
复制
echo ssl_encrypt('super secret key', 'Hello World');

生成如下内容(由于随机盐分,每次都会发生变化):

代码语言:javascript
运行
复制
U2FsdGVkX18uygnq8bZYi6f62FzaeAnyB90U6v+Pyrk=
票数 7
EN

Stack Overflow用户

发布于 2011-09-20 05:10:59

也许是PHP的OpenSSL库?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7477302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档