总结:php 自带hash mhash 用于散列只能加密 扩展mcrypt 用于加解密 对文件加密有的文件会隐藏换行,或者读取方式等影响导致结果不一致。
1.crc32
php:
a.系统crc32()输入字符串,返回整数(32位),echo输出32位系统会存在不同可能输出负数,64不会。
b.$str=mhash(MHASH_CRC32B, 'abcde');返回4字节的字符串,使用bin2hex($str)转为16进制字符串,hexdec($str)转为十进制输入字符串,返回int型或float型
base_convert($str, 16, 10)输入字符型转换成字符型(此处为from16进制to10进制)。
c.mysql SELECT CRC32('abcde');
2.MD5 SHA1
md5($str) == bin2hex(mhash(MHASH_MD5, $str))
sha1($str) == bin2hex(mhash(MHASH_SHA1, $str))
AND
pack("H*", md5($str)) == mhash(MHASH_MD5, $str)
pack("H*", sha1($str)) == mhash(MHASH_SHA1, $str)
3.加密和散列
下面部分转自:http://jichangxucode.blog.163.com/blog/static/207713391201261910134418/
主要有crypt(),md5(),sha1()这3个函数。还有加密扩展库mcrypt和mhash
1.crypt()(单向加密,安全性较低)
String crypt(String str[,String salt]);
salt参数为加密时使用的干扰串,如果省去,会随机生成一个干扰串,该函数支持4种算法和长度。
2.md5()
String md5(String str[,bool raw_output]);
raw_output参数默认为false,如果为真,函数返回一个二进制形式的密文。
3.sha1() secure hash algorithm(安全哈希算法)
String sha1(String str[,bool raw_output]);
函数返回一个40位的16进制数,如果raw_output为真,则返回一个20位的2进制数。
Mcrypt库
libmcrypt.dll 到windows(php.ini配置的initDir 目录),然后配置php.ini文件中的extension=libmcrypt.dll;
mcypt支持20多种加密算法和8种加密模式。
mcypt_list_algorithms()和mcypt_list_modes()都返回一个数组,可以用foreach循环出来查看mcypt支持的加密算法和模式。
<?php
$en_dir = mcrypt_list_algorithms() ;
echo "Mcrypt支持的算法有:";
foreach($en_dir as $en_value){
echo '<br>';
echo $en_value." ";
}
?>
<?php
$mo_dir = mcrypt_list_modes() ;
echo "<p>Mcrypt支持的加密模式有:";
foreach($mo_dir as $mo_value){
echo '<br>';
echo $mo_value." ";
}
?>
输出为:
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库的一个例子:
<?php
$str = "被加密的内容:相见时难别亦难 东风无力百花残";
$key = "key:111"; //密匙
$cipher = MCRYPT_DES; //加密算法
$modes = MCRYPT_MODE_ECB;//加密模式
$iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$modes),MCRYPT_RAND); //初始化向量
echo "加密前:".$str."<p>";
//加密:
$str_encrypt = mcrypt_encrypt($cipher,$key,$str,$modes,$iv);//里面的$cipher,$modes可以不与mcrypt_get_iv_size里的一样
echo "加密后:".$str_encrypt." <p>";
$str_decrypt = mcrypt_decrypt($cipher,$key,$str_encrypt,$modes,$iv);//要跟上面的加密里的$cipher,$modes一样才能还原
echo "还原:".$str_decrypt;
?>
输出:
加密前:被加密的内容:相见时难别亦难 东风无力百花残
加密后: 鞤"猀车摰 D瓇A?Jo鷟?咦N翢? 蟮E6?鄹[p}??
还原:被加密的内容:相见时难别亦难 东风无力百花残
Mhash库
libmash.dll 配置方式同上
mhash支持md5,sha1,crc32等多种散列算法,可以使用mhash_count()和mhash_get_hash_name()输出支持的算法名称。
<?php
$num = mhash_count(); //函数返回最大的hash id
echo "Mhash库支持的算法有:";
for($i = 0; $i <= $num; $i++){
echo '<br>';
echo $i."=>".mhash_get_hash_name($i); //输出每一个hash id 的名称
}
?>
输出:
Mhash库支持的算法有:
0=>CRC32
1=>MD5
2=>SHA1
3=>HAVAL256
4=>
5=>RIPEMD160
6=>
7=>TIGER
8=>GOST
9=>CRC32B
10=>HAVAL224
11=>HAVAL192
12=>HAVAL160
13=>HAVAL128
14=>TIGER128
15=>TIGER160
16=>MD4
17=>SHA256
18=>ADLER32
mhash应用小例子:
<?php
$filename = '07.txt';
$str = file_get_contents($filename);//获取文件全部内容
$hash = 2; //The hash id. One of the MHASH_XXX constants.
$password = '111';
$salt = '4444';//干扰串 8字节,小于8字节的用0补齐
$key = mhash_keygen_s2k(1,$password,$salt,10);//生成密钥. 1表示1个MHASH_XXX constant,10表示字节长度
$str_mhash = bin2hex(mhash($hash,$str,$key));//讲2进制转化为16进制,生成16进制的校验码
echo "文件07.txt的校验码是:".$str_mhash;
?>
输出:
文件07.txt的校验码是:d03e414026e6e5f0699e8d66e3a1a1e23caea04f