首页 > 后端开发 > php教程 > 如何使用 PHP 的 mcrypt 和 openssl 替代方案加密和解密文件?

如何使用 PHP 的 mcrypt 和 openssl 替代方案加密和解密文件?

Linda Hamilton
发布: 2024-11-20 11:57:16
原创
569 人浏览过

How Can I Encrypt and Decrypt Files Using PHP's mcrypt and the openssl Alternative?

使用 PHP 的 mcrypt 对文件进行加解密

对文件进行加解密可以增强数据安全性,保护敏感信息。 mcrypt 提供了一个方便的库,用于在 PHP 中实现加密和解密操作。但是,由于 mcrypt 不再得到积极维护,因此有必要考虑加密任务的替代选项。

在本文中,我们将探索使用 mcrypt 来加密和解密文件。我们还将提供一个使用 openssl 的更新示例,这是 mcrypt 的推荐替代方案。

使用以下命令加密文件mcrypt:

</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">function encryptFile() {
    global $cryptastic;
    $pass = PGPPASS;
    $salt = PGPSALT;
    $key = $cryptastic->pbkdf2($pass, $salt, 1000, 32) or die("Failed to generate secret key.");

    if ($handle = opendir(PATH.'/ftpd')) {
        while (false !== ($file = readdir($handle))) {
            if ($file != "." &amp;&amp; $file != "..") {
                $newfile = PATH.'/encrypted/'.$file.'.txt';
                $msg = file_get_contents(PATH.'/ftpd/'.$file);
                $encrypted = $cryptastic->encrypt($msg, $key) or die("Failed to complete encryption.");
                $nfile = fopen($newfile, 'w');
                fwrite($nfile, $encrypted);
                fclose($nfile);
                unlink(PATH.'/ftpd/'.$file);

            }
        }
        closedir($handle);
    }
}
登录后复制

解密文件mcrypt:

</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">function inFTP() {
    global $cryptastic;
    $pass = PGPPASS;
    $salt = PGPSALT;
    $key = $cryptastic->pbkdf2($pass, $salt, 1000, 32) or die("Failed to generate secret key.");

    if ($handle = opendir(PATH.'/encrypted')) {
        while (false !== ($file = readdir($handle))) {
            if ($file != "." &amp;&amp; $file != "..") {
                $newfile = PATH.'/decrypted/'.$file;
                $msg = PATH.'/encrypted/'.$file;
                $decrypted = $cryptastic->decrypt($msg, $key) or die("Failed to complete decryption.");
                $nfile = fopen($newfile, 'w');
                fwrite($nfile, $decrypted);
                fclose($nfile);
                //unlink(PATH.'/encrypted/'.$file);

            }
        }
        closedir($handle);
    }
}
登录后复制

替代选项:加密和解密openssl

<br>类 AES256Encryption<br>{</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">public const BLOCK_SIZE = 8;
public const IV_LENGTH = 16;
public const CIPHER = 'AES256';

public static function generateIv(bool $allowLessSecure = false): string
{
    $success = false;
    $random = openssl_random_pseudo_bytes(openssl_cipher_iv_length(static::CIPHER));
    if (!$success) {
        if (function_exists('sodium_randombytes_random16')) {
            $random = sodium_randombytes_random16();
        } else {
            try {
                $random = random_bytes(static::IV_LENGTH);
            }
            catch (Exception $e) {
                if ($allowLessSecure) {
                    $permitted_chars = implode(
                        '',
                        array_merge(
                            range('A', 'z'),
                            range(0, 9),
                            str_split('~!@#$%&amp;*()-=+{};:"<>,.?/\'')
                        )
                    );
                    $random = '';
                    for ($i = 0; $i < static::IV_LENGTH; $i++) {
                        $random .= $permitted_chars[mt_rand(0, (static::IV_LENGTH) - 1)];
                    }
                }
                else {
                    throw new RuntimeException('Unable to generate initialization vector (IV)');
                }
            }
        }
    }
    return $random;
}

protected static function getPaddedText(string $plainText): string
{
    $stringLength = strlen($plainText);
    if ($stringLength % static::BLOCK_SIZE) {
        $plainText = str_pad($plainText, $stringLength + static::BLOCK_SIZE - $stringLength % static::BLOCK_SIZE, "");
    }
    return $plainText;
}

public static function encrypt(string $plainText, string $key, string $iv): string
{
    $plainText = static::getPaddedText($plainText);
    return base64_encode(openssl_encrypt($plainText, static::CIPHER, $key, OPENSSL_RAW_DATA, $iv));
}

public static function decrypt(string $encryptedText, string $key, string $iv): string
{
    return openssl_decrypt(base64_decode($encryptedText), static::CIPHER, $key, OPENSSL_RAW_DATA, $iv);
}
登录后复制

}

$text = '8SViI0Gz4r-p7A15YxkwjOBFuW*@NTtbm{U]D&E=~6yLM adX'P;h3$,KJ%/eo>}<2>





以上是如何使用 PHP 的 mcrypt 和 openssl 替代方案加密和解密文件?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
上一篇:哪种 MySQL 排序规则最适合需要用户输入的网站? 下一篇:如何使用 PHP 从 URL 检索的 JSON 对象中提取访问令牌?
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
关于CSS思维导图的课件在哪? 课件
来自于 2024-04-16 10:10:18
0
0
1959
相关专题
更多>
热门推荐
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板