Давайте начнем с чего-то более простого - учитывая сообщение и ключ, XOR сообщение с ключом для его шифрования.XOR зашифрованное сообщение с ключом для его расшифровки.
$msg = "The rooster crows at midnight!";
$key = "secret key";
$cipher_text = simple_xor($msg, $key);
$plain_text = simple_xor($cipher_text, $key);
echo "Original msg: $msg\n";
echo "Supplied key: $key\n";
echo "\n";
echo "Cipher Text: " . base64_encode($cipher_text) . "\n";
echo " Decrypted: " . $plain_text . "\n";
function simple_xor($input, $key) {
# Input must be of even length.
if (strlen($input) % 2)
$input .= '0';
# Keys longer than the input will be truncated.
if (strlen($key) > strlen($input))
$key = substr($key, 0, strlen($input));
# Keys shorter than the input will be padded.
if (strlen($key) < strlen($input))
$key = str_pad($key, strlen($input), '0', STR_PAD_RIGHT);
# Now the key and input are the same length.
# Zero is used for any trailing padding required.
# Simple XOR'ing, each input byte with each key byte.
$result = '';
for ($i = 0; $i < strlen($input); $i++) {
$result .= $input{$i} ^ $key{$i};
}
return $result;
}
Здесь вы можете увидеть внутреннее значение XOR.Учитывая Msg XOR Key = C
, затем C XOR Key = Msg
и C XOR Msg = Key
.
Теперь давайте вернемся к вашему подходу - кажется, вы хотите смешать больше символов вместе, чтобы получить более надежный зашифрованный результат.Прежде чем сделать это, подумайте, что создает силу шифрования при использовании XOR таким способом.Во время этого процесса предположим, что у злоумышленника есть вышеуказанный код, но не $msg
или $key
.
Злоумышленник будет знать, как долго ваше сообщение и ключ, потому что этот алгоритм всегда генерирует результат, которыйто же число байтов, что и у сообщения и ключа.
Самый сильный ключ - это тот, в котором каждый байт отличается - таким образом, результат не будет содержать шаблонов.Например, если вы шифруете текст на английском языке ключом, содержащим только один повторный байт, я мог бы заметить, что зашифрованный текст содержит один байт, повторенный несколько раз.Это, вероятно, буква «е» в вашем простом тексте, самая популярная гласная.Если бы ключ содержал совершенно случайные байты, то любой шаблон, обнаруженный в зашифрованном тексте, не помог бы мне идентифицировать простой текст.
Итак, насколько сильны сообщение «Ноги» и ключ «abcd»?Ну, это, конечно, сильнее, чем использование ключа «0000», но это может быть сильнее.Атакующий может предположить, что вы использовали простой ключ, содержащий только строчные буквы.Это означает, что грубая сила этого ключа, атакующий должен попробовать 26 ^ 8 возможных вариантов.Это можно сделать менее чем за секунду на современных компьютерах.Лучший ключ будет включать в себя заглавные буквы, цифры, знаки пунктуации и другие символы.Еще лучший ключ будет также включать непечатаемые символы, например: $key = chr(27) . chr(6) . 'q.';
Еще один интересный элемент, который следует учитывать при использовании этого алгоритма, состоит в том, что он требует, чтобы ключ был равен длине сообщения.Это означает, что для надежного шифрования большого объема текста (например, романа) требуется ключ, который является абсолютно случайным, также как и роман.Большинство основных алгоритмов избегают этого требования, зашифровывая сообщение в блоках.Существует много различных способов реализации блочного кодирования, позвольте мне проиллюстрировать один из них, известный как cipher-block-chaining (CBC).
Простой CBC работает, беря первые несколько байтов простого текста, XOR'ing егос ключом, который генерирует первые несколько байтов зашифрованного текста.Следующие несколько байтов простого текста зашифрованы с помощью XOR'а с первыми несколькими байтами зашифрованного текста И ключа.Этот процесс повторяется до тех пор, пока весь простой текст не будет зашифрован.Это создает цепочку, где каждый блок в зашифрованном тексте был создан с использованием предыдущего блока и ключа.Чтобы расшифровать последний результат, вы должны XOR зашифрованный текст с предыдущим блоком зашифрованного текста, а затем снова с ключом.
Сильные алгоритмы включают другие функции, чтобы гарантировать, что зашифрованный текст является как можно более случайным,включая функции, позволяющие определить, было ли зашифрованное сообщение изменено.Хорошее место, чтобы узнать больше о режимах блочного шифрования - это Википедия: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
На странице криптографии также есть большой набор вводной информации о различных формах шифрования и процессе криптоанализа.http://en.wikipedia.org/wiki/Cryptography