21,886
社区成员
发帖
与我相关
我的任务
分享
var orderBuf = new ArrayBuffer(8);
var orderU8 = new Uint8Array(orderBuf);
var orderU32 = new Uint32Array(orderBuf);
function encrypt(array) {
var qq_key = [0x85116032, 0x52142588, 0x36457321, 0x95273217];
var a = qq_key[0];
var b = qq_key[1];
var c = qq_key[2];
var d = qq_key[3];
var sum = 0;
var y, z;
var delta = 0x9e3779b9;
for (var j = 0; j < array.length - 1; j = j + 2) {
y = array[j];
z = array[j + 1];
sum = 0;
for (var i = 0; i < 32; i++) {
sum += delta;
y += ((z << 4) + a) ^ (z + sum) ^ ((z >>> 5) + b);
z += ((y << 4) + c) ^ (y + sum) ^ ((y >>> 5) + d);
}
array[j] = y;
array[j + 1] = z;
}
}
orderU8[0] = 0x22;
orderU8[1] = 0x22;
orderU8[2] = 0x22;
orderU8[3] = 0x22;
orderU8[4] = 0x22;
orderU8[5] = 0x22;
orderU8[6] = 0x22;
orderU8[7] = 0x22;
encrypt(orderU32);
console.log(orderU8.buffer);
/**
* 无符号32位右移
unsigned right shift
* @param mixed $x 要进行操作的数字,如果是字符串,必须是十进制形式
* @param string $bits 右移位数
* @return mixed 结果,如果超出整型范围将返回浮点数
*/
function shr32($x, $bits){
// 位移量超出范围的两种情况
if($bits <= 0) return $x;
if($bits >= 32) return 0;
//转换成代表二进制数字的字符串
$bin = substr(str_repeat('0', 32) . decbin($x), -32);
return bindec(substr($bin, 0, -$bits));
}
于是有
$a = [0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22];
encrypt($a);
print_r($a);
function encrypt(&$array) {
$qq_key = [0x85116032, 0x52142588, 0x36457321, 0x95273217];
$a = $qq_key[0];
$b = $qq_key[1];
$c = $qq_key[2];
$d = $qq_key[3];
$sum = 0;
//var y, z;
$delta = 0x9e3779b9;
for ($j = 0; $j < count($array) - 1; $j = $j + 2) {
$y = $array[$j];
$z = $array[$j + 1];
$sum = 0;
for ($i = 0; $i < 32; $i++) {
$sum += $delta;
$y += (($z << 4) + $a) ^ ($z + $sum) ^ (shr32($z, 5) + $b);
$z += (($y << 4) + $c) ^ ($y + $sum) ^ (shr32($y, 5) + $d);
}
$array[$j] = $y & 0xff;
$array[$j + 1] = $z & 0xff;
}
}