#!/usr/bin/php | -f } {-s | -f } # --------------------------------------------------------------- # Convert \xAF chars to chr(0xaf) function parseArgStr($s) { return preg_replace("/\\\\x([0-9a-f]{2})/ie", 'chr(0x$1)', $s); } # dechex with leading zeroes function tohex($num, $l = 2) { $a = dechex($num); while (strlen($a) < $l) $a = "0".$a; return $a; } # Show message and exit with some code function halt($message, $exitcode) { if ($message) echo rtrim($message, "\r\n")."\n"; die(intval($exitcode)); } # --------------------- $pname = basename(array_shift($argv)); if ($argc < 5) usage(); function usage() { global $pname; halt("Usage: $pname [--hex] {-s str | -f fname} {-s str | -f fname}\n", 1); } function get($type, $var) { switch ($type) { case "-f": $s = file_get_contents($var); break; case "-s": $s = parseArgStr($var); break; case "-h": $s = parseHex($var); break; default: halt("Error: bad string type.\n", 3); } return $s; } function parseHex($s) { $res = ''; if (strpos($s, ' ') !== false) $hexes = explode(' ', $s); else $hexes = str_split($s, 2); foreach ($hexes as $hex) { $res .= chr(hexdec($hex)); } return $res; } $hex = 0; if ($argv[0] == "--hex") { $hex = 1; array_shift($argv); } if ($argv[0] == "--hex2") { $hex = 2; array_shift($argv); } $s1 = get($argv[0], $argv[1]); //(($argv[0] == '-f') ? file_get_contents($argv[1]) : parseArgStr($argv[1])); $s2 = get($argv[2], $argv[3]); //(($argv[2] == '-f') ? file_get_contents($argv[3]) : parseArgStr($argv[3])); for ($i = 0; $i < strlen($s1); $i++) { $ch = ord($s1[$i]) ^ ord($s2[$i % strlen($s2)]); if ($hex == 1) {echo "\\x".tohex($ch);} elseif ($hex == 2) {echo tohex($ch);} else {echo chr($ch);} } if ($hex) echo "\n" ?>