PHP 加密扩展 mcrypt 的基本使用
Posted 落叶成冰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP 加密扩展 mcrypt 的基本使用相关的知识,希望对你有一定的参考价值。
Mcrypt 支持以下四种分组密码模式:CBC, OFB,CFB 和 ECB。 如果使用 libmcrypt-2.4.x 或更高版本链接, 还可以
支持 nOFB 分组模式 和 流 模式。 下列是所支持的加密模式以及其对应的预定义常量。
1. MCRYPT_MODE_ECB (electronic codebook) 适用于随机数据, 比如可以用这种模式来加密其他密钥。 由于要加密
的数据很短,并且是随机的,所以这种模式的缺点反而起到了积极的作用。
2. MCRYPT_MODE_CBC (cipher block chaining) 特别适用于对文件进行加密。 相比 ECB, 它的安全性有明显提升。
3. MCRYPT_MODE_CFB (cipher feedback) 对于每个单独的字节都进行加密, 所以非常适用于针对字节流的加密。
4. MCRYPT_MODE_OFB (output feedback, in 8bit) 和 CFB 类似。它可以用在无法容忍加密错误传播的应用中。因为
它是按照 8 个比特位进行加密的,所以安全系数较低,不建议使用。
5. MCRYPT_MODE_NOFB (output feedback, in nbit) 和 OFB 类似,但是更加安全,因为它可以按照算法指定的分组
大小来对数据进行加密。
6. MCRYPT_MODE_STREAM 是一种扩展模式,它包含了诸如 "WAKE" 或 "RC4" 的流加密算法。
<?php
// 获取支持的加密算法
$algos = mcrypt_list_algorithms();
print_r($algos);
// 获取所支持的模式
$modes = mcrypt_list_modes();
print_r($modes);
自 PHP5.5.0 开始被废弃的几个方法,不建议再使用:
mcrypt_cfc()
mcrypt_cfb()
mcrypt_ecb()
mcrypt_ofb();
示例一:
<?php
/**
* 加密
* @param $plainText 明文数据
* @param $key 加密key
*/
function encrypt($plainText, $key)
$algo = MCRYPT_RIJNDAEL_256; //加密算法
$ecb = MCRYPT_MODE_ECB; //加密模式
$keysize = mcrypt_get_key_size($algo, $ecb);
$key = substr($key, 0, $keysize); //确保key的长度有效
$ivSize = mcrypt_get_iv_size($algo, $ecb);
// 参数 2 可选值有:MCRYPT_RAND(系统随机数生成器), MCRYPT_DEV_RANDOM(从 /dev/random 文件读取数据)
// 和 MCRYPT_DEV_URANDOM(从 /dev/urandom 文件读取数据)。在 Windows 平台,PHP 5.3.0 之前的版本中,仅支持 MCRYPT_RAND。
// 请注意,在 PHP 5.6.0 之前的版本中, 此参数的默认值为 MCRYPT_DEV_RANDOM。
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND); //从随机源创建初始向量
$encryptText = mcrypt_encrypt($algo, $key, $plainText, $ecb, $iv);
return trim(base64_encode($encryptText));
/**
* 解密
* @param encryptedText 密文数据
* @param $key 解密key
*/
function decrypt($encryptedText, $key)
$algo = MCRYPT_RIJNDAEL_256;
$ecb = MCRYPT_MODE_ECB;
$keysize = mcrypt_get_key_size($algo, $ecb);
$key = substr($key, 0, $keysize); //确保key的长度有效
$cryptText = base64_decode($encryptedText);
$ivSize = mcrypt_get_iv_size($algo, $ecb);
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
$decryptText = mcrypt_decrypt($algo, $key, $cryptText, $ecb, $iv);
return trim($decryptText);
示例二:
<?php
/**
* 数据加密
* @param $plainText 明文数据
* @param $key 加密key
*/
function encrypt($plainText, $key)
$td = mcrypt_module_open(MCRYPT_3DES, '', 'ecb', ''); // MCRYPT_3DES = tripledes
$size = mcrypt_enc_get_iv_size($td); // 返回打开的算法的初始向量大小
$iv = mcrypt_create_iv($size, MCRYPT_RAND); // 从随机源创建初始向量
$key = substr($key, 0 ,mcrypt_enc_get_key_size($td)); // 打开模式所能支持的最长密钥长度
// 初始化加密所需的缓冲区
// 如果发生错误将会返回负数: -3表示密钥长度有误, -4表示内存分配失败, 其他值表示未知错误, 同时会显示对应的警告信息
$retInt = mcrypt_generic_init($td, $key, $iv);
$encrypt_data = mcrypt_generic($td, $plainText); //加密
mcrypt_generic_deinit($td); // 对加密模块进行清理工作
mcrypt_module_close($td); // 关闭加密模块
return base64_encode($encrypt_data);
/**
* 数据解密
* @param $encryptData 密文数据
* @param $key 解密key
*/
function decrypt($encryptData, $key)
$encryptData = base64_decode($encryptData);
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); //从随机源创建初始向量
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
$retInt = mcrypt_generic_init($td, $key, $iv);
// 请注意,由于存在数据补齐的情况,返回字符串的长度可能和明文的长度不相等
$plainText = mdecrypt_generic($td, $encryptData); // 解密
mcrypt_generic_deinit($td); // 对加密模块进行清理工作
mcrypt_module_close($td); // 关闭加密模块
return $plainText;
// 解决数据补齐,造成返回字符串长度和明文长度不一致的问题
$origin_plain = ''; //原始的明文
$plainText = ''; //解密后得到的明文
if (strncmp($origin_plain, $plainText, strlen($origin_plain)) == 0)
echo 'ok';
else
echo 'error';
以上是关于PHP 加密扩展 mcrypt 的基本使用的主要内容,如果未能解决你的问题,请参考以下文章
用wampserver配置PHP环境,想使用PHP的mcrypt加密扩展库进行加密应该怎么安装扩展库?