我正在try 创建一个PHP方法来复制OpenSSL命令行函数,这样我就可以使用PHP进行加密,然后使用命令行进行解密.
考虑到内存性能和限制问题,我创建了加密文件的PHP方法,将文件分块加密:
$salt= random_bytes(8);
$saltPrefix = "Salted__" . $salt;
$keyIV= EVP_BytesToKey($salt, file_get_contents('my.key'));
$key = substr($keyIV, 0, 32);
$iv= substr($keyIV, 32, openssl_cipher_iv_length('AES-256-CTR'));
$original = file_get_contents('confidential.txt');
$FILE_ENCRYPTION_BLOCKS = 10000;
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-CTR', $key, (feof($fpIn) ? OPENSSL_RAW_DATA:OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING), $iv);
fwrite($fpOut, $encrypted);
}
fclose($fpIn);
}
fclose($fpOut);
}
然后,在运行此方法后,我可以使用以下命令行对其进行解密:
openssl enc -p -d -aes-256-ctr -in php-encrypted.bin -out decrypted.txt -pass file:my.key
但是,当我try 使用上面的命令行解密生成的文件时,它不起作用.我需要更新上面的方法,以模拟使用CTR模式的命令行加密.我读到$iv必须包含随机数和计数器,但这必须如何完成以及生成计数器的函数,或者只将$iv = $randomBytes . $counter;
放在$randomBytes
固定的位置并在循环中的第二个调用中将$counter
从1
更改为2
是安全的,或者在上面的php代码中如何完成?