20
2017
09

PPTV视频文件KEY算法PHP版本

<?php
class PPTVToKey {
	public function __construct() {
		return $this;
	}

	public function string($abyte2) {
		$k = "";
		for ($i=0; $i < count($abyte2); $i++) $k .= chr($abyte2[$i]);
		return trim($k);
	}

	public function timeArray() {
		$i = 0;
		$abyte = array();
		$time = $_SERVER['REQUEST_TIME'] + 300;
		while ($i < 16) {
			$bytes;
			$abyte[$i] = 0xf & $time >> 28 - 4 * ($i % 8);
			$byte = $abyte[$i];
			if ($abyte[$i] > 9) $bytes = 87; else $bytes = 48;
			$abyte[$i] = $byte + $bytes;
			if ($i > 7 || $abyte[$i] == 0) {
				$abyte[$i] = mt_rand(1, 256);
			}
			$i++;
		}
		return $abyte;
	}

	public function token() {
		$keyArray = array();
		$tmAray = $this->timeArray();
		$tmCode = array(113, 113, 113, 113, 113, 119, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0);
		$tmAray = $this->encrypt_a($tmAray, 16, $tmCode);
		$keyArray = $this->encrypt_b($tmAray, 16, $keyArray, 33);
		return $this->string($keyArray);
	}

	public function keyCode($tmCode) {
		$k = 0;
		for ($i=0; $i < 16; $i++) {
			$k ^= $tmCode[$i] << 8 * ($i % 4);
		}
		return $k;
	}

	public function b($num) {
		$a = 0xffffffff & $num;
		$b = sprintf("%u", $a);
		return $b * 1;
	}

	public function encrypt_a($tmArray, $i, $tmCode) {
		$l = $this->keyCode($tmCode);
		$l1 = $l << 8 | $l >> 24;
		$l2 = $l << 16 | $l >> 16;
		$l3 = $l << 24 | $l >> 8;
		for ($k = 0; $k + 16 <= $i; $k += 16) {
			$l4 = 0;
			$l5 = 0;
			$l6 = 0;
			for ($i1 = 0; $i1 < 4; $i1++) {
				$l4 |= (0xff & $tmArray[$k + $i1]) << $i1 * 8;
				$l5 |= (0xff & $tmArray[4 + ($k + $i1)]) << $i1 * 8;
			}
			for ($j1 = 0; $j1 < 32; $j1++) {
				$l6 = $this->b($l6 - 0x61c88647);
				$a1 = $this->b($l5 << 4);
				$a2 = $this->b($l + $a1);
				$a3 = $this->b($l5 + $l6);
				$a4 = $this->b($a2 ^ $a3);
				$a5 = $this->b($l5 >> 5);
				$a6 = $this->b($l1 + $a5);
				$l4 = $this->b($l4 + ($a4 ^ $a6));
				$b1 = $this->b($l4 << 4);
				$b2 = $this->b($l2 + $b1);
				$b3 = $this->b($l4 + $l6);
				$b4 = $this->b($b2 ^ $b3);
				$b5 = $this->b($l4 >> 5);
				$b6 = $this->b($l3 + $b5);
				$l5 = $this->b($l5 + ($b4 ^ $b6));
			}
			for ($k1 = 0; $k1 < 4; $k1++) {
				$tmArray[$k + $k1] = (255 & $l4 >> $k1 * 8);
				$tmArray[4 + ($k + $k1)] = (255 & $l5 >> $k1 * 8);
			}
		}
		return $tmArray;
	}

	public function encrypt_b($tmAray, $i, $keyArray, $j) {
		for ($k = 0; $k < $i; $k++) {
			$keyArray[$k * 2] = (0xf & $tmAray[$k]);
			$keyArray[1 + $k * 2] = (0xf & $tmAray[$k] >> 4);
		}
		$l = 0;
		while ($l < $i * 2) {
			$byte1;
			$byte0 = $keyArray[$l];
			if ($keyArray[$l] > 9) {
				$byte1 = 87;
			} else {
				$byte1 = 48;
			}
			$keyArray[$l] = $byte0 + $byte1;
			$l++;
		}
		$keyArray[$i * 2] = 0;
		return $keyArray;
	}
}

$PPTV = new PPTVToKey();
$token = trim($PPTV->token());
echo '{"key":"'.$token.'"}';


这个算法用于PPTV视频MP4地址的KEY=值。

« 上一篇 下一篇 »