本文实例讲述了 php 基于 mcrypt 实现加密解密的方法分享给大家供大家参考具体实现方法如下:
PHP 中自带了相当多的加密的方法, 这里我们来看一下 mcrypt 扩展的使用方式也是在工作中需要用这个东西加密访问用户的 Cookie 的值, 认真的学习了这个方面的内容
1. 简介
Mcrypt 是 PHP 的一个扩展, 完成了常用加密算法的封装其实该扩展是对 mcrypt 标准类库的封装, mcrypt 完成了相当多的常用加密算法, 如 DES, TripleDES, Blowfish (default), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 和 GOST 加密算法, 并且提供了 CBCOFBCFB 和 ECB 四种块加密的模型
2. 安装和使用
要使用该扩展, 必须首先安装 mcrypt 标准类库, 可以在 http://mcrypt.sourceforge.net 下载该扩展的编译和安装方式和常规的 php 扩展相同, 不在详细说明了
3. 四种块加密模型
Mcrypt 支持四种块加密模型, 简要说明如下:
. MCRYPT_MODE_ECB(electronic codebook) 适合对小数量随机数据的加密, 比如加密用户的登录密码之类的
. MCRYPT_MODE_CBC (cipher block chaining) 适合加密安全等级较高的重要文件类型
. MCRYPT_MODE_CFB (cipher feedback) 适合于需要对数据流的每一个字节进行加密的场合
. MCRYPT_MODE_OFB (output feedback, in 8bit) 和 CFB 模式兼容, 但比 CFB 模式更安全 CFB 模式会引起加密的错误扩散, 如果一个 byte 出错, 则其后续的所有 byte 都会出错 OFB 模式则不会有此问题但该模式的安全度不是很高, 不建议使用
. MCRYPT_MODE_NOFB (output feedback, in nbit) 和 OFB 兼容, 由于采用了块操作算法, 安全度更高
. MCRYPT_MODE_STREAM 是为了 WAKE 或者 RC4 等流加密算法提供的额外模型
NOFB 和 STREAM 仅当 mycrypt 的版本号大于等于 libmcrypt-2.4.x 才有效 (现在基本上都是大于这个版本了, libmcrypt 的最新主版本已经到 4 了)
4. 查看支持的算法和模型
. mcrypt_list_modes() 列出当前环境支持的模型
. mcrypt_list_algorithms() 列出当前环境支持的算法
如命令行执行:
代码如下:
php -r "var_dump(mcrypt_list_modes()); var_dump(mcrypt_list_algorithms());"
即可列出所有的结果
5. 如何使用
示例 1:
代码如下:
- <?php
- $key = "this is a secret key";
- $input = "Let us meet at 9 o'clock at the secret place.";
- $encrypted_data = mcrypt_ecb (MCRYPT_3DES, $key, $input, MCRYPT_ENCRYPT);
- ?>
最简单的方式如示例 1 中所示, 该方法表明对 $input 使用 3DES 的算法进行加密, 加密密钥是 $key. 不过这中直接调用的方法已经不被官方推荐使用, 也建议大家在开发中不要使用此种方式, 不一定哪天该方法就不能用了在 php5 下使用此种方式调用时, 能看到一条 warning 信息, 提示 PHP Warning: attempt to use an empty IV, which is NOT recommend
官方推荐的使用方式如示例 2 所示
示例 2:
代码如下:
- <?php
- $key = "this is a secret key";
- $input = "Let us meet at 9 o'clock at the secret place.";
- // 打开 mcrypt, 或者 mcrypt 类型的资源对象, 该对象使用 ecb 模式, 使用 3des 作为加密算法
- $td = mcrypt_module_open('tripledes', '','ecb','');
- // 创建 iv(初始化向量)
- $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
- // 根据密钥和 iv 初始化 $td, 完成内存分配等初始化工作
- mcrypt_generic_init($td, $key, $iv);
- // 进行加密
- $encrypted_data = mcrypt_generic($td, $input);
- // 反初始化 $td, 释放资源
- mcrypt_generic_deinit($td);
- // 关闭资源对象, 退出
- mcrypt_module_close($td);
- ?>
上述过程完成了数据的加密过程首先选择加密算法和加密模式创建 mcrypt 的资源对象和 IV, 然后初始化加密所需的 buffer(内存), 进行加密后再释放 buffer, 最后关闭资源对象
解密的过程和加密是基本相同, 只要把 mcrypt_generic($td, $input) 替换成 mdecrypt_generic($td, $input) 就可以了, 其它部分完全相同当然, 对于 3des 这种对称加密算法而言, 加密解密所用的 key 是必须完全相同的
6. 有关 IV
不是所有的模型中都需要 IV. CFB 和 OFB 是必须有 IV, CBC 和 EBC 则是可选的对于必选 IV 的模式来说, 其加密和解密的 IV 的值必须完全相同, CBC 和 EBC 则无此要求可以相同也可以不同, 没什么关系
7. 一个简单功能的加密解密类
代码如下:
- class AMPCrypt {
- private static function getKey(){
- return md5('exampleKey');
- }
- public static function encrypt($value){
- $td = mcrypt_module_open('tripledes', '','ecb','');
- $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
- $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));
- mcrypt_generic_init($td, $key, $iv);
- $ret = base64_encode(mcrypt_generic($td, $value));
- mcrypt_generic_deinit($td);
- mcrypt_module_close($td);
- return $ret;
- }
- public static function dencrypt($value){
- $td = mcrypt_module_open('tripledes', '','ecb','');
- $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
- $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));
- $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));
- mcrypt_generic_init($td, $key, $iv);
- $ret = trim(mdecrypt_generic($td, base64_decode($value))) ;
- mcrypt_generic_deinit($td);
- mcrypt_module_close($td);
- return $ret;
- }
- }
希望本文所述对大家的 PHP 程序设计有所帮助
来源: https://www.php1.cn/detail/php-2105ed72c7.html