Soutěž Crypto-World

Školení, která pořádám

Stejně jako letos i loni vycházela na Crypto-Worldu soutěž v luštění jednoduchých šifrových textů. Dokud na mě úlohy nezačaly být moc těžké, tak jsem je s potěšením řešil. Na podobných úlohách je samozřejmě nejzajímavější hledání řešení, takže pokud vás to baví, tak dál nečtěte a zkuste si to sami. Důležité je při řešení vytrvat – když má člověk řešení pod nosem, tak to chce pevnou vůli.

Vyřešil jsem prvních 12 úloh s výjimkou úlohy č. 10 – když jsem se dozvěděl, jak je řešení triviální, tak se kopu do zadku. Zabrat mi dala i úloha 5 – nechápu, jak jsem si mohl nevzpomenout na Braillovo písmo. Nebo úloha č. 4 – řešení mě napadlo asi po čtrnácti dnech, když jsem psal SMS…

V hledání řešení mi PHP také pomáhalo – vždy, když jsem si chtěl něco vyzkoušet, tak jsem si to zkusil napsat a buď z toho něco vypadlo nebo ne.

Úloha 1/1 Transpozice

<?php
$text = "ZYXNE TARBO OVOLS ETJED AZILI SERYV UHOLU ETSJE ZZAKU DOKAJ INESE RENVA RPSTA VOTSE TATAV ADAZK AJINE SUOKZ OAINE CIVCZ ORORP NEJEJ ANDEJ OLSIC AHOLU";
echo strtolower(str_replace(" ", "", strrev($text)));
// uloha cislo jedna je jen pro rozcviceni a ozkouseni jak zadavat a testovat spravne reseni jako dukaz ze jste ulohu vyresili zadejte slovo obratenxyz
?>

Úloha 1/2 Jednoduchá záměna

<?php
$text = "cRYP t owo R l dcr yp tOWo rL DC rY P toW oRLD c R y PT OWO rLd cry p TOW orlD CrY ptO wORl DCR YpT owO Rld cR Yp TOW oRLd cR YpT owoR lD CR yP tow or lD Cr yp T oW O RLD crY pTow ORL dcry pT Ow o Rld c rYpt oW oRld cR yPTo wOr LDC Rypt oWor l DC rypT oWor LDC RYpt O w oRl d cry p To wo rld CrY pT owO R";
$morse = array('.-' => 'a', '-...' => 'b', '-.-.' => 'c', '-..' => 'd', '.' => 'e', '..-.' => 'f', '--.' => 'g', '....' => 'h', '----' => 'ch', '..' => 'i', '.---' => 'j', '-.-' => 'k', '.-..' => 'l', '--' => 'm', '-.' => 'n', '---' => 'o', '.--.' => 'p', '--.-' => 'q', '.-.' => 'r', '...' => 's', '-' => 't', '..-' => 'u', '...-' => 'v', '.--' => 'w', '-..-' => 'x', '-.--' => 'y', '--..' => 'z');
foreach (explode(" ", $text) as $word) {
    $code = "";
    for ($i=0; $i < strlen($word); $i++) {
        $code .= ($word[$i] == strtoupper($word[$i]) ? "-" : ".");
    }
    echo (isset($morse[$code]) ? $morse[$code] : "?");
}
// jeste si pamatujete morseovku pokud ano pak vam asi ani tato uloha nedelala problem vlozte reseni skaut
?>

Úloha 1/3 Jednoduchá záměna 2

<?php
$text = "0 B1 2 345 ox6 r7Ma 890 juFy k1 L234 k enG5 I6ex e7 Gxx 8 9a s 01rZ h2 Gpk k x345 e 6y nkj7 k8 T9v dT a0 1G2v s 3e B4 56 789 I0h krT F 123 vuo4 5x6 xn7 c89n uy ZFs 01 s 2w F3 d456 uje 789 oM0 1 r 2L3s 4L5 6u78 G9 0T1h Gj deF v2Qv Qe 3d4h p 5n6M d7 y8y 9M0 1s23 j4c v wwe u 5x Zw e678 M Q901 jn2 3I j4 5x6";
foreach (explode(" ", $text) as $word) {
    $code = "";
    for ($i=0; $i < strlen($word); $i++) {
        $code .= (is_numeric($word[$i]) ? "-" : ".");
    }
    echo (isset($morse[$code]) ? $morse[$code] : "?");
}
// tato uloha je vlastne zase jen variace na morseovku pismena jsou tecky a cislice carky reseni je junak
?>

Úloha 1/4 Jednoduchá záměna 3

<?php
$text = "8 33 66 8 666 1 9999 7 88 7777 666 22 1 9999 66 2 8 33 1 9999 2 7777 33 1 9999 1 6 666 22 444 555 88 1 66 2 7 444 7777 8 33 1 7777 555 666 888 666 1 6 666 22 444 555";
$mobil = array(1 => " ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz");
foreach (explode(" ", $text) as $val) {
    echo $mobil[$val[0]][strlen($val)-1];
}
echo "\n";
// tento zpusob znate zase z mobilu napiste slovo mobil
?>

Úloha 1/5 Jednoduchá záměna 4

<?php
$text = ".XXXX. X..XX. .XXXX. X..XX.  X.X.XX X.X.X. X..... .XX.X. .XXXX. XX.XX. X..X..  X..... XX.XX. .XX..."; // pouze začátek
$lines = explode("\n",
"a     b     c     d     e     f     g     h     i     j     k     l     m     n     o     p     q     r     s     t     u     v     w     x     y     z
X.    X.    XX    XX    X.    XX    XX    X.    .X    .X    X.    X.    XX    XX    X.    XX    XX    X.    .X    .X    X.    X.    .X    XX    XX    X.
..    X.    ..    .X    .X    X.    XX    XX    X.    XX    ..    X.    ..    .X    .X    X.    XX    XX    X.    XX    ..    X.    XX    ..    .X    .X
..    ..    ..    ..    ..    ..    ..    ..    ..    ..    X.    X.    X.    X.    X.    X.    X.    X.    X.    X.    XX    XX    .X    XX    XX    XX");
foreach ($lines as $key => $val) {
    $lines[$key] = explode("    ", $val);
}
$braille = array();
foreach ($lines[0] as $key => $char) {
    $braille[$lines[1][$key] . $lines[2][$key] . $lines[3][$key]] = trim($char);
}
foreach (explode(" ", $text) as $word) {
    if (!$word) {
        echo " ";
    } elseif (strlen($word) != 6 || !isset($braille[$word])) {
        echo "\nError in $word.\n";
    } else {
        echo $braille[$word];
    }
}
// toto vlastne ani neni sifra ale text napsany v braillovu pismu takze heslo je heureka
?>

Úloha 1/6 Jednoduchá záměna 5

<?php
$text = "7470 |_|10|-|4 _|3 see410see3/\\/4 /\\/4 7see\\/ |-|4(|<3|- 14/\\/6|_|4|_|3 7|-4/\\/5|<|-!|>(! |<0/\\/7|-01/\\/! 510\\/0 |<73|-3 /\\/\\473 see4|)47 _|3 |-|4(|<3|-";
$leet = array(
    "4" => "a", "3" => "e", "1" => "l", "0" => "o", "6" => "g", "7" => "t", "5" => "s",
    "|_|" => "u", "|-|" => "h", "_|" => "j", "\\/" => "v", "/\\/" => "n", "(" => "c", "|<" => "k", "|-" => "r", "|>" => "p", "/\\/\\" => "m", "|)" => "d",
    "see" => "z", "!" => "i",
);
$text .= " ";
$token = "";
for ($i=0; $i < strlen($text); $i++) {
    if ($text[$i] == " ") {
        if ($token) {
            echo "?$token?";
            $token = "";
        }
        echo " ";
    } else {
        $token .= $text[$i];
        if (isset($leet[$token]) && !isset($leet[$token . $text[$i+1]])) {
            echo $leet[$token];
            $token = "";
        }
    }
}
// tato uloha je zalozena na tzv hacker languaue transkripci kontrolni slovo ktere mate zadat je hacker
?>

Úloha 1/7 Jednoduchá záměna 6

<?php
$text = "FMTOT UJYOJ SRFQF WTHAN HPFSJ GTYYT YTOJZ QTMFS FXSFI SJOES FRJOX NXNKW ZFYTH FJXFW TAZAY TRYTU WNUFI JOJUT ZENYU TXZSU NXRJS TUJYA UWFAT EFIJO YJOFP TWJXJ SNUTX ZSUJY";
$text = strtolower(str_replace(" ", "", $text));
for ($j=0; $j < strlen($text); $j++) {
    echo chr(ord('a') + (ord($text[$j]) - ord('a') + 21) % 26);
}
// ahoj opet jen mala rocvicka nebot toto je uloha na snad nejznamejsi sifru a to caesarovu v tomto pripade je pouzit posun pismen o pet vpravo zadejte jako reseni posunpet
?>

Úloha 1/8 Jednoduchá záměna 7

<?php
$text = "WZOHR AMZNZ HRUIZ QVSVY IVQHP ZHFYH GRGFX MRHRU IZZGY ZHHKL XREZE MZSIZ WVZYV XVWBZ YVXVW LFPGV IZQVK HZMZK LAKZG PFQZP LWFPZ AIVHV MREOL AGVZO VUYVG";
$text = strtolower(str_replace(" ", "", $text));
for ($j=0; $j < strlen($text); $j++) {
    echo chr(ord('a') + ord('z') - ord($text[$j]));
}
// dalsi znama sifra je hebrejska substitucni sifra atbas spociva v nahrade abecedy abecedou ktera je psana pozpatku jako dukaz reseni vlozte alefbet
?>

Úloha 1/9 Agenturní šifra

<?php
$text = "blaho asfalt nejmene zpev Alzir indukce oddan pujceny talent bilance sex brucet nebozez finalni Kristus blok tepna kat zase kopanec plest priste koren sumici program sesup pojivo hrabos pel tohle blond nucen vyliti zapirac druh drap sedici unos hrom chuze prsten kazit pratele topic orech carovat tornado mys kotel pradlo sev pasaz vyzdoba doklad koroze oblicej dotovat cislice odstup Finsko casopis utratil dezerce zlorad kolega";
foreach (explode(" ", $text) as $word) {
    echo $word[strlen($word)-1];
}
// otevreny text ziskate ctenim poslednich pismen techto slov zadejte posleda
?>

Úloha 1/10 Transpozice

<?php
$text = "LNDLL ETSSE NZAYO LPOUE IEUPO LMLZE NLEOI EATNO YTMAV NPDEL TRSTL MRBEV OTAGI";
$text = strtolower(str_replace(" ", "", $text));
$half_length = strlen($text) / 2;
for ($i=0; $i < $half_length; $i++) {
    echo $text[$i] . $text[$half_length + 1 + $i];
}
// loni delal tento system nazvany podle plotu resitelum problem vlozte anglie
?>

Úloha 2/1 Steganografie

<?php
$text = 'TATOU LOHAP ATRIM EZISP ISELE HKE.U KOLEM JEOPE TNALE ZTSLO VOKTE RYMPR OKAZE TEZEJ STEJI VYRES ILI.T ENTOK RATEN ENISL OVOZA SIFRO VANO, ALEUT AJENO JEDNO DUCHO USTEG ANOGR AFICK OUMET ODOU. NEVIM ZDANA POVIM ,ALET ATOUL OHANE BUDEV CRYPT O-WOR LDU10 /2004 UVEDE NA(PR OC?).';
$file = file_get_contents("http://soutez2004.crypto-world.info/index.php?crypto=ulohy&kolo=2&uloha=1");
if (preg_match('~<span style="display: none;">(.*?)</span>~', $file, $matches)) {
    echo $matches[1];
}
// Blahopreji ! nasel jste uschovany kod ! Zadejte slovo BYSTROZRAKY
?>

Úloha 2/2 Kódová kniha, II.světová válka

<?php
$text = "BAH-HAS-TKIH BE-SO-DE-DEZ-AHE BESH-LEGAI-NAH-KIH YAH-DI-ZINI NI-DAH-THAN-ZIE IL-DAY A-WOH NE-AHS-JAH BE-TAS-TNI NE-AHS-JAH AH-LOSZ DAH-NES-TSA A-KHA GLOE-IH BE-SO-DE-DEZ-AHE NE-ZHONI WOL-LA-CHEE DIBEH KLESH GLOE-IH TLO-CHIN GAH BE SEIS TSAH TSE-NILL A-KEH-DI-GLINI BE-LA-SANA YIL-DOI NE-AHS-JAH A-CHIN BE-LA-SANA A-KEH-DI-GLINI WOL-LA-CHEE AH-YA-TSINNE TLO-CHIN";
$navajo = array();
foreach (file("navajo.txt") as $line) { // získáno z http://www.history.navy.mil/faqs/faq61-4.htm
    list($key, $val) = explode("\t", trim($line));
    $navajo[$key] = $val;
}
foreach (explode(" ", $text) as $val) {
    echo $navajo[$val] ." ";
}
// secret point captain can not arrive t o m o r r o w point p a s s w o r d is n a v a j o n a v a j o
?>
Jakub Vrána, Řešení problému, 26.9.2005, diskuse: 4 (nové: 0)

Diskuse

Leo:

OT: Nejak jsem na weblogy.cz zahlidl oznameni o vasem clanku o AJAXu na root.cz, ale odkaz vedl do null... Co to? Leo

ikona Jakub Vrána OpenID:

Měl jsem přislíbeno, že by článek mohl v pondělí vyjít na Rootu, ale protože tam nevyšel, tak jsem ho stáhl i od sebe. Vyjde snad v pátek.

ikona Jakub Vrána OpenID:

Aktuální termín je pondělí 3.10.2005.

Jakub Podhorský:

ty jo docela se na to těším :) a né a né se toho dočkat :)

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2017 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.