我试过将这些函数从AS2转换为PHP,但我没有运气。
这是原始的AS2功能:
enc.charsToLongs = function (chars)
{
var _loc3 = chars;
var tlength = Math.ceil(_loc3.length / 4);
var temp = [];
var _loc2 = 0;
for (var _loc1 = 0; _loc1 < tlength; ++_loc1)
{
_loc2 = _loc1 * 4;
temp[_loc1] = (_loc3[_loc2] << 24) + (_loc3[_loc2 + 1] << 16) + (_loc3[_loc2 + 2] << 8) + _loc3[_loc2 + 3];
}
return (temp);
};
这就是我在PHP中所拥有的:
function charsToLongs($chars)
{
$_loc3 = $chars;
$tlength = ceil(count($_loc3) / 4);
$temp = array();
$_loc2 = 0;
for ($_loc1 = 0; $_loc1 < $tlength; $_loc1++) {
$_loc2 = $_loc1 * 4;
$temp[$_loc1] = ($_loc3[$_loc2] << 24) + ($_loc3[$_loc2 + 1] << 16) + ($_loc3[$_loc2 + 2] << 8) + $_loc3[$_loc2 + 3];
}
return ($temp);
}
每当我运行这些功能时,我都会得到不同的答案。我知道AS2的工作正常,因为我已经多次使用它来完美地加密/解密字符串。还有更多的功能,但这似乎是我唯一坚持的功能。有人能告诉我什么是错的吗?
另外:chars($ chars / chars)是我要加密的字符串的字符ASCII值数组。
感谢。
答案 0 :(得分:0)
您需要使用ord()
和chr()
(或pack()
if you want to be cache-timing safe)将字符串转换为整数,才能使用移位操作。
// Wrong:
var_dump(
($_loc3[$_loc2] << 24) + ($_loc3[$_loc2 + 1] << 16) + ($_loc3[$_loc2 + 2] << 8) + $_loc3[$_loc2 + 3]
);
// Right:
var_dump(
(ord($_loc3[$_loc2]) << 24) + (ord($_loc3[$_loc2 + 1]) << 16) + (ord($_loc3[$_loc2 + 2]) << 8) + ord($_loc3[$_loc2 + 3])
);