在PHP中通过shell_exec()调用OpenSSL命令

时间:2016-06-07 20:14:29

标签: php encryption openssl

执行时:

func Enemy1KillCounter() {
    guard let gameScene = self.scene as? GameScene
        else { fatalError("Current node is not inside a GameScene") }
    gameScene.Enemy1DieG()
}

OpenSSL完美地解密了我的文件。但是,当我执行:

openssl_decrypt(
    base64_decode(file_get_contents('/path/to/file')),
    'aes-256-cbc',
    $key,
    OPENSSL_RAW_DATA,
    $iv
);

未创建目标文件。

有谁知道什么可能是错的?我的客户希望能够上传大到2GB的大文件,并将那么多数据加载到PHP变量中似乎是一个非常糟糕的主意。

编辑:

使用bin2hex,我得到了一个看似理智的命令:

shell_exec('openssl enc -aes-256-cbc -base64 -d -A -p -K ' . $key . ' -iv ' . $iv . ' -in /path/to/file -out /path/to/dest');

但是我得到了包:

openssl enc  -aes-256-cbc -base64 -d -A -p -K 64343438343165333635663434663262633036636235656462383238356239303763373365353633 -iv abdd099c7bac8b514089d8c901c8395c -in /usr/www/vault/new/d71fd708181573c5f92c8f500ddcb399/787 -out /tmp/decrypted/57574484b684c

1 个答案:

答案 0 :(得分:2)

也许您需要对参数进行编码,以便shell可以实际执行命令:

shell_exec('openssl enc -aes-256-cbc -base64 -d -A -p -K '
 . escapeshellarg($key) . ' -iv ' . escapeshellarg($iv)
 . ' -in /path/to/file -out /path/to/dest');

如果您的文件名包含例如文件名,则情况也是如此。空格。

编辑:实际上Artjom B.是对的:openssl说: -K / -iv key / iv in hex是下一个参数。所以你需要对其进行十六进制编码:

shell_exec('openssl enc -aes-256-cbc -base64 -d -A -p -K '
 . bin2hex($key) . ' -iv ' . bin2hex($iv)
 . ' -in /path/to/file -out /path/to/dest');