Добрый день, Aleri!
Изввините, меня, за накладки, которые Вы ещё заметите.
Теперь подчистил. См. PHP
class CaesarCipher в zip-файле.
При вызове класса необходимо определить алфавит
в ассоциативном массиве кеу: символ, value: частотность символа в текстах.
Протестировал пока на текстах на русском языке.
https://www.alto-booking.com/tes...test=1&key=9
Цитата:еще одной интересной функцией программы является стеганография теганография это возможность прикрепления шифротекста в любой файл с сохранением его работоспособности подобно тому как революционеры писали письма молоком на полях книг так и здесь зашифрованный текст можно записать например в файл картинки никто не догадается что фотографии которыми вы обмениваетесь с вашим деловым партнером содержат секретную информацию
https://www.alto-booking.com/tes...est=2&key=10
https://www.alto-booking.com/tes...test=3&key=5
https://www.alto-booking.com/tes...test=4&key=9
По ходу обсуждения алгоритма возник вопрос о его работоспособности на коротких текстах.
dcc0 пишет:Код, получается, в расчёте только на большие строки слово "тфсфрфзфн" не получилось расшифровать.
Теперь могу ответить.
Во всех случаях, тесты должны шифроваться и расшифровываться на одном
и том же алфавите, напрример, пробел 0-символ, алфавит без буквы ё, как в задаче Aleri.
Метод
BruteForceDecoding работет стабильно.
Метод
DecodingByCharacterFrequency работет только с техтами с проявленим
частотности одного символа, например, "молоко"
и не работает в случаях, если все символы в тексте уникальны, например, "кот".
Это код тестевого скрипта.
Спойлер (Отобразить)PHP:
скопировать код в буфер обмена
<?
include_once("ClassCaesarCipher.php");
//https://www.alto-booking.com/test/PHP_SU/CaesarCipher.php?alphabet=ru&test=2&key=9
$alphabet = isset($_GET['alphabet'])?
$_GET['alphabet']:"ru"; $key = isset($_GET['key'])?
$_GET['key']:1; $test = isset($_GET['test'])?
$_GET['test']:1;
$alphabet_frequency["ru"]=[
[" " , 14,46],
["а" , 8.01],
["б" , 1.59],
["в" , 4.54],
["г" , 1.70],
["д" , 2.98],
["е" , 8.45],
//["ё" , 0.04],
["ж" , 0.94],
["з" , 1.65],
["и" , 7.35],
["й" , 1.21],
["к" , 3.49],
["л" , 4.40],
["м" , 3.21],
["н" , 6.70],
["о" , 10.97],
["п" , 2.81],
["р" , 4.73],
["с" , 5.47],
["т" , 6.26],
["у" , 2.62],
["ф" , 0.26],
["х" , 0.97],
["ц" , 0.48],
["ч" , 1.44],
["ш" , 0.73],
["щ" , 0.36],
["ъ" , 0.04],
["ы" , 1.90],
["ь" , 1.74],
["э" , 0.32],
["ю" , 0.64],
["я" , 2.01]
];
$CaesarСipher = new CaesarCipher($alphabet_frequency[$alphabet]);
//-----------------------------------------
$test_text[1] = "еще одной интересной функцией программы является стеганография теганография это возможность прикрепления шифротекста в любой файл с сохранением его работоспособности подобно тому как революционеры писали письма молоком на полях книг так и здесь зашифрованный текст можно записать например в файл картинки никто не догадается что фотографии которыми вы обмениваетесь с вашим деловым партнером содержат секретную информацию";
$test_text[2] = "молоко";
$test_text[3] = "суп из топора";
$test_text[4] = "кот";
//-----------------------------------------
$text = $test_text[$test];
$text_encode = $CaesarСipher->encode($text, $key);
$text_decode = $CaesarСipher->decode($text_encode, $key);
echo print_text("Техт, который требуется зашифровать", $text);
echo print_text("Зашифрованный текст с использованием ключа: $key", $text_encode);
echo print_text("Расшифрованный текст с использованием известного ключа", $text_decode);
echo "<br><hr><b>Взом шифра с использование метода DecodingByCharacterFrequency</b><br>";
$res = $CaesarСipher->DecodingByCharacterFrequency($text_encode);
//-------------------------------------------------------------------------
if($res->error)
{
echo "Взлом шифра этим методом невозможен. Используйте метод BruteForceDecoding";
}
else
{
$character = $res->MostFrequentlyCharacter;
$indA = $res->MostFrequentlyCharacterInd;
$character = ord($character)==32?
"пробел":$character; echo "<p>Часто используемый символ в зашифрованном тексте: '$character'
, порядковы номер в алфавите $indA</p>";
foreach ($res -> decoded as $decoded) {
$character = ord($decoded[0])==32?
"пробел":$decoded[0
]; $label = "Часто используемый символ алфавита: '$character'";
$label .= ", порядковы номер в алфавите {$decoded[1]}";
$label .= ", ключ: $indA - {$decoded[1]} = {$decoded[2]}";
echo print_text($label, $decoded[3]);
}
}
//---------------------------------------------------------------------------
echo "<br><hr><b>Взлом шифра с использование метода BruteForceDecoding</b><br>";
foreach ($CaesarСipher->BruteForceDecoding($text_encode) as $key => $text) {
echo print_text("Kлюч: $key",$text);
}
//------------------------------------
function print_text($label, $text){
return <<<HTML
<p>
$label<br>
<textarea rows=5 cols=100>$text</textarea>
</p>
HTML;
}
?>