php 加密和解密文件

2013.06.14 No Comments

window环境下:

PHP程序员们在编写代码程序时,除了要保证代码的高性能之外,还有一点是非常重要的,那就是程序的安全性保障。PHP除了自带的几种加密函数外,还有功能更全面的PHP加密扩展库Mcrypt和Mhash。

其中,Mcrypt扩展库可以实现加密解密功能,就是既能将明文加密,也可以密文还原。

1.PHP加密扩展库Mcrypt安装

在标准的PHP安装过程中并没有把Mrcypt安装上,但PHP的主目录下包含了libmcrypt.dlllibmhash.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>";

}

?>

到此看下你已解密的文件和加密之前信息是相同的。

 

Related Posts:

评论已关闭。