• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 位置: php 中文手册 -> php 外部扩展库

    mcrypt库(加密)

    安装

    此 » PECL 扩展未与 PHP 捆绑。mcrypt_module_open() 返回加密描述符。

    Note, for Ubuntu, simply installing php5-mcrypt did not get mcrypt to work. You need to execute the following commands as root to enable it:
    apt-get install php5-mcrypt
    mv -i /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available/
    php5enmod mcrypt
    service apache2 restart
    
    If using a Debian-based Linux system, you can run the following commands:
    sudo apt-get install php5-mcrypt
    sudo /etc/init.d/apache2 restart
    
    You can install Mcrypt from the PHP Source Tree as a module if you choose.
    You first need to ensure you have libmcrypt, libmcrypt-devel, and mcrypt installed, then do:
    # cd php-5.x.x/ext/mcrypt
    # phpize
    # aclocal
    # ./configure
    # make && make install
    Enable the module by adding: 'extension=mcrypt.so' to PHP.ini.
    Done!
    Very handy if you need to install a single module and you may have installed PHP via RPM, but don't wish to recompile your whole PHP install.
    

    Mcrypt 密码

    下表是 mcrypt 扩展所支持的密码。 所支持的密码的完整列表请参见 mcrypt.h 文件。 在 PHP 中使用 mcrypt-2.2.x 的一个通用规则是你可以使用 MCRYPT_ciphername 来访问密码。 在 libmcrypt-2.4.x 和 libmcrypt-2.5.x 的 API 中,这些常量依然可用, 但是你也可以把密码模式以字符串的形式传入 mcrypt_module_open() 函数 来进行访问。

    • MCRYPT_3DES
    • MCRYPT_ARCFOUR_IV ( 仅 libmcrypt > 2.4.x 可用 )
    • MCRYPT_ARCFOUR ( 仅 libmcrypt > 2.4.x 可用 )
    • MCRYPT_BLOWFISH
    • MCRYPT_CAST_128
    • MCRYPT_CAST_256
    • MCRYPT_CRYPT
    • MCRYPT_DES
    • MCRYPT_DES_COMPAT ( 仅 libmcrypt 2.2.x 可用 )
    • MCRYPT_ENIGMA ( 仅 libmcrypt > 2.4.x 可用,MCRYPT_CRYPT 的别名)
    • MCRYPT_GOST
    • MCRYPT_IDEA (非免费算法)
    • MCRYPT_LOKI97 ( 仅 libmcrypt > 2.4.x 可用 )
    • MCRYPT_MARS ( 仅 libmcrypt > 2.4.x 可用,非免费算法)
    • MCRYPT_PANAMA ( 仅 libmcrypt > 2.4.x 可用 )
    • MCRYPT_RIJNDAEL_128 ( 仅 libmcrypt > 2.4.x 可用 )
    • MCRYPT_RIJNDAEL_192 ( 仅 libmcrypt > 2.4.x 可用 )
    • MCRYPT_RIJNDAEL_256 ( 仅 libmcrypt > 2.4.x 可用 )
    • MCRYPT_RC2
    • MCRYPT_RC4 ( 仅 libmcrypt 2.2.x 可用 )
    • MCRYPT_RC6 ( 仅 libmcrypt > 2.4.x 可用 )
    • MCRYPT_RC6_128 ( 仅 libmcrypt 2.2.x 可用 )
    • MCRYPT_RC6_192 ( 仅 libmcrypt 2.2.x 可用 )
    • MCRYPT_RC6_256 ( 仅 libmcrypt 2.2.x 可用 )
    • MCRYPT_SAFER64
    • MCRYPT_SAFER128
    • MCRYPT_SAFERPLUS ( 仅 libmcrypt > 2.4.x 可用 )
    • MCRYPT_SERPENT( 仅 libmcrypt > 2.4.x 可用 )
    • MCRYPT_SERPENT_128 ( 仅 libmcrypt 2.2.x 可用 )
    • MCRYPT_SERPENT_192 ( 仅 libmcrypt 2.2.x 可用 )
    • MCRYPT_SERPENT_256 ( 仅 libmcrypt 2.2.x 可用 )
    • MCRYPT_SKIPJACK ( 仅 libmcrypt > 2.4.x 可用 )
    • MCRYPT_TEAN ( 仅 libmcrypt 2.2.x 可用 )
    • MCRYPT_THREEWAY
    • MCRYPT_TRIPLEDES ( 仅 libmcrypt > 2.4.x 可用 )
    • MCRYPT_TWOFISH ( mcrypt 2.x 之前的版本,或者 2.4.x 之后版本可用 )
    • MCRYPT_TWOFISH128 (TWOFISHxxx 在新的 2.x 版本可用,但在 2.4.x 版本不可用)
    • MCRYPT_TWOFISH192
    • MCRYPT_TWOFISH256
    • MCRYPT_WAKE ( 仅 libmcrypt > 2.4.x 可用 )
    • MCRYPT_XTEA ( 仅 libmcrypt > 2.4.x 可用 )

    如果使用 CFB 和 OFB 模式, 必须提供初始向量(IV), 如果使用 CBC 模式, 可以提供一个初始向量。 初始向量必须是唯一的,并且在加密和解密过程中要保持一致。 你可以将初始向量和加密后数据一起存储, 其存储位置可以由一个函数的输出来指定, 例如文件名的 MD5 散列值, 这样你就可以把初始向量和加密后的数据一起传输 (关于本话题的更多信息,请参见 Applied Cryptography by Schneier (ISBN 0-471-11709-9) 9.3 一节)。

    例子

    Mcrypt 支持使用上述的算法来进行加密和解密。 如果你使用 libmcrypt-2.2.x 链接编译 PHP, 通过使用最重要的四个函数(mcrypt_cfb(), mcrypt_cbc(), mcrypt_ecb(), 和 mcrypt_ofb()) 以及 MCRYPT_ENCRYPT and MCRYPT_DECRYPT 来对数据进行加解密。

    如果你使用 libmcrypt 2.4.x 或者 2.5.x 版本,以上函数依然可用。 但是建议使用新版本提供的更先进的函数。

    在 2.4.x 或更高版本,使用 256 比特的密钥,AES 算法和 CBC 模式来加密输入数据

    <?php
        $key = hash('sha256', 'this is a secret key', true);
        $input = "Let us meet at 9 o'clock at the secret place.";
        
        $td = mcrypt_module_open('rijndael-128', '', 'cbc', '');
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_URANDOM);
        mcrypt_generic_init($td, $key, $iv);
        $encrypted_data = mcrypt_generic($td, $input);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
    ?>