提问人:Bilal H 提问时间:11/14/2023 更新时间:11/14/2023 访问量:69
在PHP和命令行之间复制openssl加密/解密大文件?
replicate openssl encrypt/decrypt between PHP and Command Line for large files?
问:
我正在尝试创建一个PHP方法来复制OpenSSL命令行函数,这样我就可以使用命令行进行加密,然后使用PHP进行解密,或者相反,通过使用PHP加密,然后使用命令行进行解密。
我创建了这个PHP方法来加密文件:
$salt= random_bytes(8);
$saltPrefix = "Salted__" . $salt;
$keyIV= EVP_BytesToKey($salt, file_get_contents('my.key'));
$key = substr($keyIV, 0, 32);
$original = file_get_contents('confidential.txt');
$encrypted = openssl_encrypt($original, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
file_put_contents('php-encrypted.bin', $saltPrefix . $encrypted);
然后在运行此方法后,我可以使用以下命令行对其进行解密:
openssl enc -p -d -aes-256-cbc -in php-encrypted.bin -out decrypted.txt -pass file:my.key
但是当要加密的文件很大时会出现问题,所以我尝试更新上面的PHP方法,以免出现内存限制问题:
$FILE_ENCRYPTION_BLOCKS = 64;
if ($fpOut = fopen('php-encrypted.bin', 'w')) {
fwrite($fpOut, $saltPrefix);
if ($fpIn = fopen('confidential.txt', 'rb')) {
while (!feof($fpIn)) {
$plaintext = fread($fpIn, 16 * $FILE_ENCRYPTION_BLOCKS);
$encrypted = openssl_encrypt($plaintext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
fwrite($fpOut, $encrypted);
}
fclose($fpIn);
}
fclose($fpOut);
}
但是当我尝试像以前一样使用命令行解密生成的文件时,它不起作用。我需要更新上述方法以遵循内存性能问题,但希望能够像原始方法一样使用命令行对其进行加密。
答: 暂无答案
评论
OPENSSL_RAW_DATA
$options = feof($fpIn) ? OPENSSL_RAW_DATA : OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING;
$iv = substr($encrypted, 0, 16);
$iv = substr($encrypted, -16);