最近在开发中遇到了两个用于解密 FlashFXP 密码的 PHP 函数,分别由 7j 和国外开发者编写。经过实际测试,国外版本在执行效率上明显更胜一筹,7j 的版本可能稍显逊色——不过两者都值得深入分析,正好借此机会对比它们的实现思路。
function flashfxp($data)
{
$pass=substr($data, 2);
$flashfxp_key = array(y,0,A,0,3,0,6,0,z,0,A,0,4,0,8,0,d,0,E,0,h,0,f,0,r,0,v,0,g,0,h,0,G,0,R,0,g,0,5,0,7,0,h,0,5,0,U,0,l,0,D,0,v,0,3);
for ($i=0; $i < strlen($data) - 2; $i =2)
{
$run = (Hexdec(substr($pass, $i, 2)) ^ Hexdec(DecHex(ord($flashfxp_key[$i])))) - Hexdec(substr($data, $i, 2));
if ($run < 0)
$run=$run 255;
$Num.=chr($run);
}
return $Num;
}
function decryptffxp($ciphertext)
{
$magic_buffer="yA36zA48dEhfrvghGRg57h5UlDv3";
$count =0;
$length =strlen($ciphertext);
while ($count < $length)
{
$cts.=chr(hexdec($ciphertext[$count] . $ciphertext[$count 1]));
$count =2;
}
$length =strlen($cts);
$count =0;
$mbcount=0;
while ($count 1 < $length)
{
$foo = ord($cts[$count 1]) ^ ord($magic_buffer[$mbcount]);
if ($foo - ord($cts[$count]) < 0)
{
$plaintext.=chr($foo - ord($cts[$count]) 255);
}
else
{
$plaintext.=chr($foo - ord($cts[$count]));
}
$count ;
$mbcount ;
if ($mbcount == 28)
{
$mbcount=0;
}
}
return $plaintext;
}
第一个函数采用固定密钥数组进行逐位异或运算,而第二个函数则利用一个魔数字符串通过循环取模来完成解密操作。对比之下,国外版本在循环结构和位运算方面更加简洁,因此执行效率更高。尽管两者底层遵循相同的解密逻辑,但实现细节上的细微差异直接影响了性能表现。如果要在实际项目中选用,后者显然是更优的选择。
