我试图想出一种让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复制上面的加密函数?
答案 0 :(得分:7)
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如下:
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=
答案 1 :(得分:2)
如上所述,评论填充是完成这项工作所必需的。下面的函数将生成一个可以在命令行上解密的文件,如下所示:
openssl enc -d -aes-256-cbc -a -salt -in test.txt
test.txt文件是从下面的ssl_encrypt函数的输出创建的。
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");
}
使用示例:
$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 :(得分:1)
也许是PHP的OpenSSL库?