PHP 加密数据,Bash 解密

标签 php bash openssl encryption

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

#!/bin/sh
/usr/bin/openssl aes-256-cbc -a -salt -k $1 -in $2

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

#!/bin/sh
/usr/bin/openssl aes-256-cbc -a -d -salt -k $1 -in $2

由于禁用了 PHP 系统调用,因此这种加密方法在生产主机上不起作用。如果可能的话,我也不希望更改解码功能。

有没有办法仅使用 PHP 复制上述加密函数?

最佳答案

看看 mcyrpt_encrypt() :

string mcrypt_encrypt ( string $cipher , string $key , string $data , 
                        string $mode [, string $iv ] )

设置$cipherMCRYPT_RIJNDAEL_128 (AES-128) 和 $modeMCRYPT_MODE_CBC .

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


openssl 导出 key 和 IV 如下:

Key = MD5(Password + Salt)
IV  = MD5(Key + Password + Salt)

在哪里Salt是一个 8 字节的盐。考虑到这一点,我创建了简单的 encrypt()decrypt()套路:


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() 获取它。或类似的,然后将其提供给函数。

用法:

echo ssl_encrypt('super secret key', 'Hello World');

生成类似的东西(由于随机盐每次都会改变):

U2FsdGVkX18uygnq8bZYi6f62FzaeAnyB90U6v+Pyrk=

关于PHP 加密数据,Bash 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7477302/

相关文章:

linux - 移动并删除文件夹中所有匹配 grep 的文件

java - 如何读取.pem文件来获取私钥和​​公钥

ruby - STARTTLS 与 Ruby 和 OpenSSL 的连接

openssl - 关于 : PKCS7, X509 和 DER

php - htaccess 选择性转发

php - 如何优化此查询以生成许多逗号分隔的数据?

php suhosin 警报

PHP 从 html 消息发送电子邮件

bash - grep 使用 grep 结果

bash - 将变量从 bash 脚本传递到 makefile