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;
}
Ejemplo n.º 2
0
<?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++;
}