| <?php | |
| class rc4 | |
| { | |
| private $s; | |
| private $i; | |
| private $j; | |
| public function __construct($key, $drop) | |
| { | |
| $this->s = range(0, 255); | |
| for ($i = 0, $j = 0; $i < 256; $i++) { | |
| $k = ord($key{$i % strlen($key)}); | |
| $j = ($j + $k + $this->s[$i]) & 255; | |
| $this->swap($i, $j); | |
| } | |
| $this->i = 0; | |
| $this->j = 0; | |
| $this->cipher(range(0, $drop), 0, $drop); | |
| } | |
| public function cipher($data, $offset, $length) | |
| { | |
| $out = $data; | |
| for ($n = $length; $n > 0; $n--) { | |
| $this->i = ($this->i + 1) & 0xff; | |
| $this->j = ($this->j + $this->s[$this->i]) & 0xff; | |
| $this->swap($this->i, $this->j); | |
| $d = ord($data{$offset}); | |
| $out[$offset] = chr($d ^ $this->s[($this->s[$this->i] + $this->s[$this->j]) & 0xff]); | |
| $offset++; | |
| } | |
| return $out; | |
| } | |
| protected function swap($i, $j) | |
| { | |
| $c = $this->s[$i]; | |
| $this->s[$i] = $this->s[$j]; | |
| $this->s[$j] = $c; | |
| } | |
| } | |
| // DEPRECATED: WAUTH-1 | |
| //class KeyStream | |
| //{ | |
| // private $rc4; | |
| // private $key; | |
| // | |
| // public function __construct($key) | |
| // { | |
| // $this->rc4 = new RC4($key, 256); | |
| // $this->key = $key; | |
| // } | |
| // | |
| // public function encode($data, $offset, $length, $append = true) | |
| // { | |
| // $d = $this->rc4->cipher($data, $offset, $length); | |
| // $h = substr(hash_hmac('sha1', $d, $this->key, true), 0, 4); | |
| // if ($append) | |
| // return $d . $h; | |
| // else | |
| // return $h . $d; | |
| // } | |
| // | |
| // public function decode($data, $offset, $length) | |
| // { | |
| // /* TODO: Hash check */ | |
| // | |
| // return $this->rc4->cipher($data, $offset + 4, $length - 4); | |
| // } | |
| // | |
| //} |