Home  >  Article  >  Backend Development  >  What is the PHP mcrypt encryption extension? Detailed introduction to mcrypt extension

What is the PHP mcrypt encryption extension? Detailed introduction to mcrypt extension

不言
不言Original
2018-07-24 17:38:042201browse

In specific project development, sometimes we may need to encrypt certain data during front-end and back-end interactions. Therefore, PHP provides the mcrypt encryption extension to implement encryption and decryption of data. Next, let’s take a detailed look at the introduction of the mcrypt extension.

1. mcrypt extension installation

 In lower versions of PHP, it needs to be in the configuration file php.ini Explicitly add a reference to the extension, and ensure that there is a corresponding extension file in the extension reference directory; in higher versions of PHP, the mcrypt extension seems to be enabled by default under Windows, and there is no need to configure it in the configuration file php.ini , the corresponding extension file is not seen in the extension reference directory. Under Linux, the corresponding mcrypt.so extension needs to be installed.

The mcrypt extension supports multiple encryption algorithms and modes. You can use mcrypt_list_algorithms() and mcrypt_list_modes() to display the supported encryption algorithms and encryption modes.

two, Use of mcrypt extension

Encryption

1、Open encryption algorithm and mode

mcrypt_module_open('tripledes', '', ecb'', '') ;

The first parameter is the name of the encryption algorithm used, corresponding to the encryption algorithm output by mcrypt_list_algorithms(); the third parameter corresponds to the encryption mode, corresponding to Supported encryption modes output by mcrypt_list_modes().

2、Create initialization vector

## mcrypt_create_iv (mcrypt_enc_get_iv_size($td ), MCRYPT_RAND);

PS. Under the Window platform, the second parameter is fixed to use MCRYPT_RAND

##3,

Initialize the encryption buffer## mcrypt_generic_init($td, $key, $iv);

$td is The returned encryption descriptor, $key is the encryption key, $iv is the initialization vector

4、数据加密

   $encrypted_data = mcrypt_generic($td, $data);

   $td为加密描述符,$data为加密前的数据,数据加密函数返回加密后的字符串。

5、结束加密,执行清理工作

mcrypt_generic_deinit($td);

解密

1、打开解密算法和模式,同上,得到$td解密描述符

2、创建初始化向量,同上,得到$iv初始化向量

3、初始化解密缓冲区

mcrypt_generic_init($td,$key, $iv);

4、数据解密

   $decrypted_data = mdecrypt_generic($td, $encrypted_data);

PS.$encrypted_data为解密前的密文,$decrypted_data为解密后的明文。

演示Demo:

<?php
    /* 打开加密算法和模式 */
    $td = mcrypt_module_open(&#39;rijndael-256&#39;, &#39;&#39;, &#39;ofb&#39;, &#39;&#39;);

    /* 创建初始向量,并且检测密钥长度。 
     * Windows 平台请使用 MCRYPT_RAND。 */
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
    $ks = mcrypt_enc_get_key_size($td);

    /* 创建密钥 */
    $key = substr(md5(&#39;very secret key&#39;), 0, $ks);

    /* 初始化加密 */
    mcrypt_generic_init($td, $key, $iv);

    /* 加密数据 */
    $encrypted = mcrypt_generic($td, &#39;This is very important data&#39;);

    /* 结束加密,执行清理工作 */
    mcrypt_generic_deinit($td);

    /* 初始化解密模块 */
    mcrypt_generic_init($td, $key, $iv);

    /* 解密数据 */
    $decrypted = mdecrypt_generic($td, $encrypted);

    /* 结束解密,执行清理工作,并且关闭模块 */
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

    /* 显示文本 */
    echo trim($decrypted) . "\n";
?>

三、实现一个AES加密类

<?php
/**
 * PHP AES加密解密类
 * Created by PhpStorm.
 * User: ahao
 * Date: 2016/11/3
 * Time: 0:03
 */
class PubEncrypt{
    public static $key = &#39;123454536f667445454d537973576562&#39;;  // 默认的key

    /**
     * AES加密
     * @param $data  明文
     * @param null $key  加密密钥
     * @return array|string
     */
    public static function AesEncrypt($data, $key = null){
        $data = trim($data);
        if($data == &#39;&#39;) return &#39;&#39;;
        try{
            if(!extension_loaded(&#39;mcrypt&#39;))
                throw new Exception(&#39;当前PHP环境没有加载mcrypt扩展&#39;);

            // 打开加密算法和模式
            $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;);

            $key = self::substr($key == null ? self::$key : $key, 0, mcrypt_enc_get_key_size($module));
            $iv = substr(md5($key), 0, mcrypt_enc_get_iv_size($module));

            // 初始化加密
            mcrypt_generic_init($module, $key, $iv);

            // 加密数据
            $encrypt = mcrypt_generic($module, $data);

            // 反初始化释放资源
            mcrypt_generic_deinit($module);

            // 关闭资源对象退出
            mcrypt_module_close($module);
            return array(&#39;status&#39; => true, &#39;data&#39; => base64_encode($encrypt));
        }catch (Exception $e){
            $error = $e->getMessage();
            $data = array(
                &#39;status&#39; => false,
                &#39;msg&#39; => $error
            );
            return $data;
        }
    }

    /**
     * AES解密
     * @param $encrypted  密文
     * @param null $key  解密密钥
     * @return array|string
     */
    public static function AesDecrypt($encrypted, $key = null){
        $encrypted = trim($encrypted);
        if($encrypted == &#39;&#39;)  return &#39;&#39;;
        try{
            if(!extension_loaded(&#39;mcrypt&#39;))
                throw new Exception(&#39;当前PHP环境没有加载mcrypt扩展&#39;);

            $encrypted = base64_decode($encrypted);
            $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;);

            $key = self::substr($key == null ? self::$key : $key, 0, mcrypt_enc_get_key_size($module));
            $iv = substr(md5($key), 0, mcrypt_enc_get_iv_size($module));

            mcrypt_generic_init($module, $key, $iv);
            $decrypted = mdecrypt_generic($module, $encrypted);
            mcrypt_generic_deinit($module);
            mcrypt_module_close($module);
            return array(&#39;status&#39; => true, &#39;data&#39; => rtrim($decrypted,"\0"));
        }catch (Exception $e){
            $error = $e->getMessage();
            $data = array(
                &#39;status&#39; => false,
                &#39;msg&#39; => $error
            );
            return $data;
        }
    }


    /**
     * 截取字符串
     * @param $string  被截取的字符串
     * @param $start   起始位置
     * @param $length  截取长度
     * @return string  截取到的字符串
     */
    private static function substr($string, $start, $length)
    {
        return extension_loaded(&#39;mbstring&#39;) ? mb_substr($string,$start,$length,&#39;8bit&#39;) : substr($string,$start,$length);
    }
}

PS.使用数据加密的好处:数据在前后台之间进行传输的是一个加密后的字符串,可以防止数据被爬虫抓包,避免敏感数据的泄露,也可以有效防止猜测出数据项对数据操作接口进行恶意请求

二、mcrypt扩展的使用

Encryption

1、Open encryption algorithm and mode

mcrypt_module_open('tripledes', '', ecb'', '');

The first parameter is to use The name of the encryption algorithm corresponds to the encryption algorithm output by mcrypt_list_algorithms(); the third parameter corresponds to the encryption mode, which corresponds to the supported encryption mode output by mcrypt_list_modes().

2、Create initialization vector

## mcrypt_create_iv (mcrypt_enc_get_iv_size($td ), MCRYPT_RAND);

PS. Under the Window platform, the second parameter is fixed to use MCRYPT_RAND

##3,

Initialize the encryption buffer## mcrypt_generic_init($td, $key, $iv);

$td is The returned encryption descriptor, $key is the encryption key, $iv is the initialization vector

4,

Data encryption $encrypted_data = mcrypt_generic($td, $data);

$td is the encryption descriptor, $data is the data before encryption, data encryption function Returns the encrypted string.


5,

End encryption and perform cleanup workmcrypt_generic_deinit($ td);


Decryption

1, Open the decryption algorithm and mode, the same as above, get the $td decryption descriptor

##2, Create the initialization vector, the same as above, get the $iv initialization vector

##3,

Initialize the decryption buffer

mcrypt_generic_init($td,$key, $iv);

4. Data decryption

$decrypted_data = mdecrypt_generic($td, $encrypted_data);

PS.$encrypted_data is the ciphertext before decryption, and $decrypted_data is the plaintext after decryption.

Related recommendations:

## Summary of the use of php encryption extension mcrypt

The above is the detailed content of What is the PHP mcrypt encryption extension? Detailed introduction to mcrypt extension. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn