用php 测试一个加密的文件,发现总是解不对,认真研究后,发现网上下载的unicode 文件头部包含了“0xef 0xbb 0xbf"三个字节,查网原来是unicode 签名,嗯,就是这么个鬼,贴上我的php解密程序,还有一些用途。
//展示如何从命令行获取参数
//展示如何获取文件内容到字符串或内存
//展示如何获取字母数值 ord(char)
//展示一个简单的解密算法
//发现网站上下载的unicode 文件,其头部包含了0xef,0xbb,0xbf 这三个字符(unicode 标志,签名)
<?php
//展示如何从命令行获取参数
//展示如何获取文件内容到字符串或内存
//展示如何获取字母数值 ord(char)
//展示一个简单的解密算法
//发现网站上下载的unicode 文件,其头部包含了0xef,0xbb,0xbf 这三个字符(unicode 标志,签名)
echo "argc:=" . $argc ."\n";
print_r($argv) ; //argv[0] 是自己,argv[1] 是参数1
if(file_exists($argv[1]))
{
$content=file_get_contents($argv[1]);
$decode = decrypt($content,"techwin");
echo $decode;
}
// 网站上下载的unicode 文件, 带有BOM(byte order mark)ef bb bf 三个字节。
// 用二进制文件打开,可以看到这三个字符,用010editor可以看到,用xxd 可以看到.
// 用文本编辑器就看不到了, 原来还隐藏这么个鬼。
// 所以解密时必须要去掉这三个字节, 解密都是按字节计算的。
function decrypt($str,$key)
{
//前3个字符是ef bb bf BOM(byte order mark) unicode 签名,
if(ord($str[0])==0xef && ord($str[1])==0xbb && ord($str[2])==0xbf)
{
echo "unicode BOM.\n";
$str=substr($str,3);
}
$decode="";
$len=strlen($str);
$keylen=strlen($key);
for($i=0;$i<$len;$i++)
{
$ki= $i% $keylen;
$decode .= $str[$i] ^ $key[$ki];
}
return $decode;
}
?>