php 加密和解密文件
window环境下:
PHP程序员们在编写代码程序时,除了要保证代码的高性能之外,还有一点是非常重要的,那就是程序的安全性保障。PHP除了自带的几种加密函数外,还有功能更全面的PHP加密扩展库Mcrypt和Mhash。
其中,Mcrypt扩展库可以实现加密解密功能,就是既能将明文加密,也可以密文还原。
1.PHP加密扩展库Mcrypt安装
在标准的PHP安装过程中并没有把Mrcypt安装上,但PHP的主目录下包含了libmcrypt.dll和libmhash.dll文件 (libmhash.dll是Mhash扩展库,这里可以一起装上)。首先,将这两个文件复制到系统目录windows/system32下,然后在 PHP.ini文件中按Ctrl+F快捷键跳出查找框,并找到;extension=php-mcrypt.dll和; extension=php_mhash.dll这两个语句,接着将前面的“;”去掉;最后,保存并重启Apache服务器即可生效。
2.PHP加密扩展库Mcrypt的算法和加密模式
Mcrypt库支持20多种加密算法和8种加密模式,具体可以通过函数mcrypt_list_algorithms()和mcrypt_list_modes()来显示,结果如下:
Mcrypt支持的算法有:cast-128 gost rijndael-128 twofish arcfour cast-256 loki97 rijndael-192 saferplus wake blowfish-compat des rijndael-256 serpent xtea blowfish enigma rc2 tripledes
Mcrypt支持的加密模式有:cbc cfb ctr ecb ncfb nofb ofb stream
这些算法和模式在应用中要以常量来表示,写的时候加上前缀MCRYPT_和MCRYPT_来表示,如下面Mcrypt应用的例子:
DES算法表示为MCRYPT_DES;
ECB模式表示为MCRYPT_MODE_ECB;
3.PHP加密扩展库Mcrypt应用
先看一个例子,是针对文件的加密和解密。了解Mcrypt的工作流程,再来看看部分流程使用的函数:
encrypt.php(加密程序)
<?php
header("Content-type: text/html; charset=utf-8");
$str =trim(@file_get_contents('system_catalog.xml'));//获取xml 文件,去除首尾空格
if ($str){
$key = "123111"; //密钥
$cipher = MCRYPT_DES; //密码类型
$modes = MCRYPT_MODE_ECB; //密码模式
$iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher, $modes),MCRYPT_RAND);//初始化向量
$str_encrypt = mcrypt_encrypt($cipher, $key, $str,$modes,$iv);//加密函数
$encrypt_xname ='encrypt'.date('Y-m-d_H-i-s',time()).'.xml'; //加密后的xml文件名
$fp = fopen($encrypt_xname,'w+'); //生成加密文件
fwrite($fp, $str_encrypt);
fclose($fp);
echo '生成文件'.$encrypt_xname;
}else{
echo "<script>alert('文件不存在');</script>";
}
?>
到此可以查看一下你当前文件下的文件已经被加密过了。
再说下解密流程:如下
decrypt.php 解密程序
<?php
header("Content-type: text/html; charset=utf-8");
$str =@file_get_contents('encrypt2013-06-14_08-54-03.xml');//获取xml file
if ($str){
$key = "123111"; //密钥
$cipher = MCRYPT_DES; //密码类型
$modes = MCRYPT_MODE_ECB; //密码模式
$iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher, $modes),MCRYPT_RAND);//初始化向量
$str_decrypt = mcrypt_decrypt($cipher, $key, $str,$modes, $iv); //解密函数
$decrypt_xname ='decrypt'.date('Y-m-d_H-i-s',time()).'.xml'; //解密后的xml文件名
$fp = fopen($decrypt_xname,'w+');
fwrite($fp, $str_decrypt);
fclose($fp);
echo '解密完成文件名为',$decrypt_xname;
}else{
echo "<script>alert('文件不存在');</script>";
}
?>
到此看下你已解密的文件和加密之前信息是相同的。