PHP – 加密/解密 ( OpenSSL 库)


PHP 早期版本的 mcrypt 扩展提供 加密/解密 功能。由于缺乏维护,现在 mycrypt 扩展已被弃用,并从 PHP 7.2 版本开始删除。PHP 现在最新支持 OpenSSL 库,该库具有支持加密和解密功能的广泛功能。

OpenSSL 支持各种加密算法,例如 AES(高级加密标准)。所有支持的算法都可以通过调用 openssl_get_cipher_methods() 函数来获得。

OpenSSL 扩展中的两个重要功能是 -

  • openssl_encrypt() − 加密数据
  • openssl_decrypt() - 解密数据

openssl_encrypt() 函数

openssl_encrypt() 函数使用给定的方法和密钥加密给定的数据,并返回原始或 base64 编码的字符串 -


openssl_encrypt(
   string $data,
   string $cipher_algo,
   string $passphrase,
   int $options = 0,
   string $iv = "",
   string &$tag = null,
   string $aad = "",
   int $tag_length = 16
): string|false

openssl_encrypt() 函数具有以下参数 -

参数 描述
data 需要加密的明文消息数据。
cipher_algo 密码方法。
passphrase 密码。如果密码短于预期,则填充 NULL 字符;如果密码长度超过预期,则将被截断。
options options 是标志 OPENSSL_RAW_DATA OPENSSL_ZERO_PADDING 的按位析取。
iv NULL 初始化向量。
tag 使用 AEAD 密码模式(GCM 或 CCM)时通过引用传递的身份验证标签。
aad 其他经过身份验证的数据。
tag_length 身份验证标记的长度。对于 GCM 模式,其值可以介于 4 和 16 之间。

openssl_encrypt() 函数在成功时返回加密字符串,在失败时返回 false。

openssl_decrypt() 函数

openssl_decrypt() 函数采用原始字符串或 base64 编码的字符串,并使用给定的方法和密钥对其进行解密。


openssl_decrypt(
   string $data,
   string $cipher_algo,
   string $passphrase,
   int $options = 0,
   string $iv = "",
   ?string $tag = null,
   string $aad = ""
): string|false

openssl_decrypt() 函数使用与 openssl_encrypt() 函数相同的参数。

openssl_decrypt() 函数在成功时返回解密的字符串,在失败时返回 false

例子

请看下面的例子 -


<?php
   function sslencrypt($source, $algo, $key, $opt, $iv) {
      $encstring = openssl_encrypt($source, $algo, $key, $opt, $iv);
      return $encstring;
   }

   function ssldecrypt($encstring, $algo, $key, $opt, $iv) {
      $decrstring = openssl_decrypt($encstring, $algo, $key, $opt, $iv);
      return $decrstring;
   }

   // 要加密的字符串
   $source = "PHP:超文本预处理器";

   // 显示原始字符串
   echo "加密前: " . $source . "\n";
   $algo = "BF-CBC";
   $opt=0;
   $ivlength = openssl_cipher_iv_length($algo);
   $iv = random_bytes($ivlength);
   $key = "abcABC123!@#"; 

   // 加密过程
   $encstring = sslencrypt($source, $algo, $key, $opt, $iv);

   // 显示加密字符串
   echo "加密字符串: " . $encstring . "\n";

   // 解密过程
   $decrstring = ssldecrypt($encstring, $algo, $key, $opt, $iv);

   // 显示解密后的字符串
   echo "解密字符串: " . $decrstring;
?>

将产生以下输出 -

加密前:PHP:超文本预处理器
加密字符串:
解密字符串: