27 public function __construct(
$key)
31 throw new \InvalidArgumentException();
37 protected static function quarterRound(&$a, &$b, &$c, &$d)
42 $d = (($d & 0xFFFF) << 16) | (($d >> 16) & 0xFFFF);
47 $b = (($b & 0xFFFFF) << 12) | (($b >> 20) & 0xFFF);
52 $d = (($d & 0xFFFFFF) << 8) | (($d >> 24) & 0xFF);
57 $b = (($b & 0x1FFFFFF) << 7) | (($b >> 25) & 0x7F);
60 protected function block($iv, $counter)
62 $block = array_values(
63 unpack(
'V*',
'expand 32-byte k' . $this->key . $counter . $iv)
67 for ($i = 0; $i < 10; $i++) {
68 static::quarterRound($block[ 0], $block[ 4], $block[ 8], $block[12]);
69 static::quarterRound($block[ 1], $block[ 5], $block[ 9], $block[13]);
70 static::quarterRound($block[ 2], $block[ 6], $block[10], $block[14]);
71 static::quarterRound($block[ 3], $block[ 7], $block[11], $block[15]);
73 static::quarterRound($block[ 0], $block[ 5], $block[10], $block[15]);
74 static::quarterRound($block[ 1], $block[ 6], $block[11], $block[12]);
75 static::quarterRound($block[ 2], $block[ 7], $block[ 8], $block[13]);
76 static::quarterRound($block[ 3], $block[ 4], $block[ 9], $block[14]);
80 for ($i = 0; $i < 16; $i++) {
81 $res .= pack(
'V', ($block[$i] + $init[$i]) & 0xFFFFFFFF);
86 public function encrypt($plain, $iv, $counter = 0)
88 if (strlen($iv) !== 8) {
89 throw new \InvalidArgumentException();
92 $len = strlen($plain);
93 $m = ($len >> 6) + (($len % 64) > 0);
95 for ($i = 0; $i < $m; $i++) {
96 $c = gmp_strval(gmp_add($counter, $i), 16);
97 $c = pack(
'H*', str_pad($c, 16,
'0', STR_PAD_LEFT));
98 $keyStream .= $this->block($iv, strrev($c));
100 return $plain ^ $keyStream;
103 public function decrypt($cipher, $iv, $counter = 0)
105 return $this->encrypt($cipher, $iv, $counter);
$key
Secret key used to encrypt/decrypt data.