function findSingleByteXOR($cipherText) { for ($kv = 0; $kv < 256; $kv++) { $charScore = 0; $plainText = singleByteXOR($cipherText, chr($kv)); $charScore = englishLetterWeight($plainText, 5); $scores[$kv] = $charScore; } return $scores; }
<?php require_once '../../functions/singleByteXOR.php'; if ($argc > 1) { $input = hex2bin($argv[1]); } else { $input = hex2bin("1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736"); } $scores = findSingleByteXOR($input); arsort($scores); $keyCount = 0; foreach ($scores as $key => $value) { if ($keyCount < 5) { $decrypt = singleByteXOR($input, chr($key)); printf("'%1\$1c' (%1\$'03u) %2\$+09.3f : %3\$1s\n", $key, $value, $decrypt); } else { break; } $keyCount++; }
} fclose($file); $linesKey = []; //store best scoring key for each line $linesScore = []; //store best score for each line foreach ($lines as $lineNumber => $line) { $scores = findSingleByteXOR(hex2bin($line)); arsort($scores); $keyCount = 0; foreach ($scores as $key => $value) { if ($keyCount < 1) { $linesKey[$lineNumber] = $key; $linesScore[$lineNumber] = $value; } else { break; } $keyCount++; } } arsort($linesScore); $lineCount = 0; printf("LINE KEY KEY# SCORE OUTPUT\n"); foreach ($linesScore as $lineNumber => $lineScore) { //return the top scoring entries in the file if ($lineCount < 5) { $decrypt = singleByteXOR(hex2bin($lines[$lineNumber]), chr($linesKey[$lineNumber])); printf("#%1\$'03u '%2\$1c' (%2\$'03u) %3\$+09.3f : %4\$1s\n", $lineNumber, $linesKey[$lineNumber], $linesScore[$lineNumber], $decrypt); } $lineCount++; }