如何使用php加密大文件并通过命令行解密?

时间:2014-03-11 13:40:29

标签: php linux encryption cryptography mcrypt

我正在用PHP编写一个小脚本来备份我的文件。在我从服务器传输文件之前,我想加密它们。

我在我的脚本的早期版本中通过在我的Linux服务器上使用exec()和OpenSSL来实现。现在我正在寻找一个原生的PHP函数来完成这项工作,主要是为了更好地处理错误。

问题是我的文件可能变大(如20gb)。此外,我必须在shell上使用命令再次解密文件。

有谁知道如何在PHP中加密大文件然后在命令行上解密?

我现在正在使用PHP的mcrypt函数进行加密:

// IV:
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);

// Create new random Key:
$key = openssl_random_pseudo_bytes(32);

// Encrypt:
$fileStream = fopen($file, "r");
$encFileStream = fopen($file . ".enc.data", "w");

$opts = [
    'iv'   => $iv,
    'key'  => $key,
    'mode' => 'cbc'
];
stream_filter_append($encFileStream, 'mcrypt.rijndael-256', STREAM_FILTER_WRITE, $opts);
stream_copy_to_stream($fileStream, $encFileStream);

fclose($fileStream);
fclose($encFileStream);

// Encrypt random generated key and save it:
$encryptedKey = null;
openssl_public_encrypt($key, $encryptedKey, $publickey);
file_put_contents($file . ".enc.key", $encryptedKey);

// Save Initial Vetor:
file_put_contents($file . ".enc.iv", $iv);

// Delete unencrypted file:
unlink($file);

现在要在linux命令行上解密我也尝试使用mcrypt。但我遇到的最大问题是我不知道如何将IV添加到mdecrypt。到目前为止,我的命令是:

mdecrypt --decrypt -m CBC -f key.key archive_hallo.tar.gz.enc.data

这当然不起作用,因为缺少IV。那么,有没有人知道如何将IV添加到我的mdecrypt命令

2 个答案:

答案 0 :(得分:3)

来自mcrypt_2.6.8 debian package expects the specific file format with header

mdecrypt CLI工具。搜索write_file_head函数,它显示mcrypt / mdecrypt工具格式的前3个字节:

buf[0] = '\0';
buf[1] = 'm';
buf[2] = '\3';

标题应该设置特殊位,并将IV嵌入到文件中。它将被阅读here, in decrypt_general function

if (_mcrypt_iv_is_needed(td, mode, noiv) != 0) {
   IV = read_iv(FROMF, mcrypt_enc_get_iv_size(td));
} else {
   IV = _mcrypt_calloc(1, mcrypt_enc_get_iv_size(td));
}

read_ivextra.c中定义为:

void *read_iv(FILE * fstream, int ivsize)
{
char *IV;
     ... // malloc 
fread(IV, 1, ivsize, fstream);
    return IV;
}

因此,只需检查加密文件的前N个字节(您可以在hexdump -C之后在此处发布)并检查mcrypt标头(0x00'm'0x03)和IV。如果是 - 那么mdecrypt工具应该从文件中获取IV。如果不是 - 不支持在mdecrypt中通过命令行设置IV,但您可以入侵源代码,为iv添加新选项,然后修改decrypt_general以从选项中读取iv。

答案 1 :(得分:0)

如果您的PHP版本可以从命令行执行单个文件,则始终可以创建PHP命令行程序来执行解密。根据您的安全设置,您可能需要通过shell程序(shell文件中的php -q decrypt.php)而不是直接(#!/usr/bin/php/cli/php或某些)来执行PHP。