php基于mcrypt的加密解密实例
本文实例讲述了php基于mcrypt实现加密解密的方法。分享给大家供大家参考。具体实现方法如下:
php中自带了相当多的加密的方法,这里我们来看一下mcrypt扩展的使用方式。也是在工作中需要用这个东西加密访问用户的cookie的值,认真的学习了这个方面的内容。
1.简介
mcrypt是php的一个扩展,完成了常用加密算法的封装。其实该扩展是对mcrypt标准类库的封装,mcrypt完成了相当多的常用加密算法,如des, tripledes, blowfish (default), 3-way, safer-sk64, safer-sk128, twofish, tea, rc2 和 gost加密算法,并且提供了cbc、ofb、cfb 和 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()列出当前环境支持的算法
如命令行执行:
即可列出所有的结果。
5.如何使用
示例1:
$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:
$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.一个简单功能的加密解密类
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;
}
}
ps:关于加密技术,本站还提供了如下加密工具供大家参考使用:
md5在线加密工具:http://tools.jb51.net/password/createmd5password
escape加密/解密工具:
在线sha1加密工具:
短链(短网址)在线生成工具:
短链(短网址)在线还原工具:
高强度密码生成器:http://tools.jb51.net/password/createstrongpassword
希望本文所述对大家的php程序设计有所帮助。
上一篇: 同学,你很会出洋相啊
下一篇: 很无语的高冷小讽刺