Добрый день! 11 декабря был опубликован "Рождественский конкурс GCHQ 2024" (Government Communications Headquarters) https://www.gchq.gov.uk/news/gchq-christmas-challenge-2024 Своё решение покажу позже. Удачи!
И как делать? Перебором если есть английский словарик? Проверяем каждое слово на маску и если подходит другие слова на остатки маски?
Они дали подсказку первые два слова: PERHAPS READING зашифрованы так: ISKGWIM KSWEBDU Из этого можно начать подбирать ключ шифрования и затем сделать предварительную расшифровку PHP: <? $str1 = "PERHAPS READING the start of this substitution cipher will help you solve it."; $str2 = "ISKGWIM KSWEBDU BN DFN LBIGSKSE BM IKBCWKBQX W QSWEBDU BDEBLWNBFD NF XFO"; $str2 .= "MFQPBDU NGBM WECBNNSEQX ESPBFOM BDBNBWQQX ODKSWEWAQS CSMMWUS"; echo "<b>Зашифрованный текст:</b><br>$str2<br>"; $str1W = explode(" ", $str1 ); $str2W = explode(" ", $str2 ); echo "<pre>"; $alpha = array_flip(range('A', 'Z')); foreach($alpha as $key => $val ){ $buf[$key] = "-"; } for($i=0; $i<2; $i++){ $ch1 = str_split($str1W[$i]); $ch2 = str_split($str2W[$i]); foreach($ch1 as $key=>$val){ $val2 = $ch2[$key]; $buf[$val2] = $val; } } echo "Kлюч расшифровки:"; print_r($buf); foreach($str2W as $key => $val){ $ch2 = str_split($val); $deciphered[$key] = ""; foreach($ch2 as $v){ $deciphered[$key] .= $buf[$v]; } } echo "<b>Расшифрованный текст:</b><br>",implode(" ", $deciphered); /* Зашифрованный текст: ISKGWIM KSWEBDU BN DFN LBIGSKSE BM IKBCWKBQX W QSWEBDU BDEBLWNBFD NF XFOMFQPBDU NGBM WECBNNSEQX ESPBFOM BDBNBWQQX ODKSWEWAQS CSMMWUS Kлюч шифровaния : Array ( [A] => - [B] => I [C] => - [D] => N [E] => D [F] => - [G] => H [H] => - [I] => P [J] => - [K] => R [L] => - [M] => S [N] => - [O] => - [P] => - [Q] => - [R] => - [S] => E [T] => - [U] => G [V] => - [W] => A [X] => - [Y] => - [Z] => - ) Расшифрованный текст: PERHAPS READING I- N-- -IPHERED IS PRI-ARI-- A -EADING INDI-A-I-N -- ---S---ING -HIS AD-I--ED-- DE-I--S INI-IA--- -NREADA--E -ESSAGE */ Затем изучаем расшифрованный текст, например, Последее слово CSMMWUS расшифровано как -ESSAGE, предполагаем, что это MESSAGE и дополняем ключ шифрования $buf["C"] = "M"; Повторно запускаем скрипт и смотрим результат и.т.д Я так нашел ключ шифрования: PHP: Array ( [A] => B [B] => I [C] => M [D] => N [E] => D [F] => O [G] => H [H] => - [I] => P [J] => - [K] => R [L] => C [M] => S [N] => T [O] => U [P] => V [Q] => L [R] => - [S] => E [T] => - [U] => G [V] => - [W] => A [X] => Y [Y] => - [Z] => - ) Которым, так расшифровал текст
Этот шифр та ещё заноза... Хотелось бы найти метод шифрования без интутивного додумывания перестновок. В начале, в предыдущей реализации, попытался привязаться к алфавиту и проверял закономерности перестановок. Искал сдвиги, по принципу шифра Цезаря и.т.п, но ничего не нашёл. От алфавита отказался вообще, но для вычисления перестановок взял не только первые два слова из PERHAPS READING the start of this substitution cipher will help you solve it, а весь текст. Буду благодарен, если сможете предложить свои решения. Здесь последний вариант PHP: <? echo "<pre>"; $str1 = "PERHAPS READING the start of this substitution cipher will help you solve it"; $str2 = "ISKGWIM KSWEBDU BN DFN LBIGSKSE BM IKBCWKBQX W QSWEBDU BDEBLWNBFD NF XFO"; $str2 .= "MFQPBDU NGBM WECBNNSEQX ESPBFOM BDBNBWQQX ODKSWEWAQS CSMMWUS"; echo "<b>Зашифрованный текст:</b><br>$str2<br>"; $S1 = array_unique(str_split(strtoupper(str_replace(" ","",$str1)))); $S2 = array_unique(str_split(str_replace(" ","",$str2))); array_pop($S1); $buf = array_combine($S2, $S1); echo "Kлюч шифрования:"; print_r($buf); echo "<b>Step 1. Расшифрованный текст:</b><br>", decipherer($str2, $buf); //Интуитивная замена перестановок в ключе шифрования $buf["A"] = "B"; $buf["C"] = "M"; $buf["L"] = "C"; $buf["Q"] = "L"; $buf["X"] = "Y"; $buf["O"] = "U"; echo "<br>Дополненный ключ шифрования: "; print_r($buf); echo "<b>Step 2. Расшифрованный текст:</b><br>", decipherer($str2, $buf); echo "<hr>"; ########################################################################## function decipherer($str, $buf){ $ch = str_split($str); $deciphered = ""; foreach($ch as $v) { if($v == " ") $deciphered .= " "; else $deciphered .= $buf[$v]; } return $deciphered; } ########################################################################## /* Зашифрованный текст: ISKGWIM KSWEBDU BN DFN LBIGSKSE BM IKBCWKBQX W QSWEBDU BDEBLWNBFD NF XFOMFQPBDU NGBM WECBNNSEQX ESPBFOM BDBNBWQQX ODKSWEWAQS CSMMWUS Kлюч шифрования:Array ( [I] => P [S] => E [K] => R [G] => H [W] => A [M] => S [E] => D [B] => I [D] => N [U] => G [N] => T [F] => O [L] => F [C] => U [Q] => B [X] => C [O] => W [P] => L [A] => Y ) Step 1. Расшифрованный текст: PERHAPS READING IT NOT FIPHERED IS PRIUARIBC A BEADING INDIFATION TO COWSOBLING THIS ADUITTEDBC DELIOWS INITIABBC WNREADAYBE UESSAGE Дополненный ключ шифрования: Array ( [I] => P [S] => E [K] => R [G] => H [W] => A [M] => S [E] => D [B] => I [D] => N [U] => G [N] => T [F] => O [L] => C [C] => M [Q] => L [X] => Y [O] => U [P] => L [A] => Y ) Step 2. Расшифрованный текст: PERHAPS READING IT NOT CIPHERED IS PRIMARILY A LEADING INDICATION TO YOUSOLLING THIS ADMITTEDLY DELIOUS INITIALLY UNREADABLE MESSAGE Перевод от Google: ВОЗМОЖНО, ПРОЧТЕНИЕ НЕ ЗАШИФРОВАННОГО СООБЩЕНИЯ — ПЕРВАЯ ПОДСКАЗКА К РАЗРЕШЕНИЮ ЭТОГО ЗАЯВЛЕННОГО, ИЗНАЧАЛЬНО НЕЧИТАЕМОГО СООБЩЕНИЯ. */ Удачи!