New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Novoročenka a vánoční soutěž #8

Closed
jakubboucek opened this Issue Dec 23, 2018 · 3 comments

Comments

2 participants
@jakubboucek
Copy link

jakubboucek commented Dec 23, 2018

Against stupidity even the gods themselves contend in vain. Čerňoučký kůň vymýšlí ďábelské nápady. The difference between science and the fuzzy subjects is that science requires reasoning, while the other subjects merely require scholarship.

Hash mi nevychází, ale řešit to nebudu :-D Nikdy mě nenapadlo, kolik variací zakódování ASCII do binárního kódu je možných – 0<=>1, bitové váhy, padding, a nakonec, když jsou ještě ty data v matici, tak uvažuju o možnostech, jakým směrem je to do mřížky zapsáno (svisle, z prava, ap.).

Nejvíc mě potěšil 3. obrázek. Vlastně jsem čekal podobný chyták i u prvních dvou obrázků, jako že skutečná informace bude v alpha kanálu, nebo barvou #1 na černém pozadí.

Nejhůře mě potrápil Unicode. Když už jsem odvodil, že ASCII znaky mají nejvyšší bit 0, tak tohle mě dobrou hodinu zdrželo.

Díky!

@ridercz

This comment has been minimized.

Copy link
Owner

ridercz commented Dec 23, 2018

Jsem rád, že Unicode měl úspěch :p

Pokud mi pošleš (třeba e-mailem) svou poštovní adresu, pošlu ti aspoň cenu útěchy :)

@ridercz ridercz closed this Dec 23, 2018

@jakubboucek

This comment has been minimized.

Copy link

jakubboucek commented Dec 23, 2018

Díky, adresu mám na webu.

Pro zajímavost taky napíšu moji cestu řešení:

Od Altaira očekávám cokoliv, takže jsem nechtěl podcenit žádnou cestu, jakou by mohl informaci do obrázku schovat.

První obrázek vypadal jako Morseovka a dokonce zhruba do třetiny obrázku to byly validní znaky, i když výstup nedával smysl. Naštěstí ji umím číst téměř plynule, takže to netrvalo ani minutu.

Pak jsem analyzoval binární podobu obrázků a hledal v nich Wallyho. 2. a 3. obrázky jsou zřetelně čisté, jen obrazová data.

První mě ale zaměstnal, obsahuje hromadu metadat. Nepoužívám Photoshop, netuším, co jsou jeho běžná meta a co je tam navíc. Nakonec pomohl Google – jsou to běžné metadata.

Při tom mi ale neuniklo, že samotná obrazová data jsou pozdezřelá. Mají pravidelný vzor, takhle nevypadají komprimovaná data:
image

Nakonec to ale vůbec k ničemu nevedlo a tak přišla na řadu analýza obrazu.

Alpha kanál nebyl ani u jednoho obrázku, stejně tak nic nenaznačovalo, že by se něco schovávalo v prostoru mezi samotnými bity obrázku. Nic. V editoru jsem obrázky upravil, aby obsahovaly jen B/W a sjednotil velikosti.

Nejvíce znám PHP, dobře se mi v něm prototypuje, v něm vznikl převodník z obrazu na binární data.

<?php /** @noinspection PhpComposerExtensionStubsInspection */

$file = '20181222-zadani-1';
$fileName = __DIR__ . "/{$file}.png";

$image = imagecreatefrompng($fileName);
$w = imagesx($image);
$h = imagesy($image);

echo sprintf("Size: %d px width, %d px height\n", $w, $h);

$bin = '';
for ($y = 15; $y < $h; $y += 75) {
    for ($x = 15; $x < $w; $x += 30) {
        $color = imagecolorat($image, $x, $y);
        echo sprintf("  X: %4d, Y: %4d, color: %d\n", $x, $y, $color);
        $bin .= $color ? 0 : 1;
        imagesetpixel($image, $x, $y, 16711680); //red
    }
    $bin .= PHP_EOL;
}

imagepng($image, __DIR__ . "/{$file}.dots.png");
file_put_contents(__DIR__ . "/{$file}.output.txt", $bin);

Kromě binárních dat z něho vypadla i kontrolní kopie obrázku s červerným pixele v bodě, ze kterého se četlo.
20181222-zadani-2 dots

V textových soubrech pak byla matice 0 a 1. Abych vyloučil další chyták, zkusil jsem matici různě převracet. Byla to ale zbytečná práce navíc, protože jen při čtení zhora zleva data měla pravidelný vzor po 8 bitech.

Neodhalil jsem ale přidané kalibrační bity. Takže jsem se nedostal hned k ASCII znakům a v ryzím zoufalství jsem sáhl po hrubé síle, dal jsem dohromady několik možných modifikací a data jsem prohnal kartézským součinem jejich variací:

  • inverze bitu,
  • přidaný bitový padding na začátek řetězce v délce 0-7 bitů,
  • převrácení vstupního retězce,
  • převrácení bitových vah.

Ve výstupním texťáku tak byla hromada variant, mezi kterými se ukrývala okem snadno viditelná perla. Kód konvertoru se bohužel po prohýřené noci nedochoval.

Hrozně mě potrápila diakritika kódovaná v UTF-8. Ta totiž čitelný text v hromadě kovových pilin důkladně schovala:

�er�ou�ký ků� vymýšlí �ábel

Kdyby to byla „běžná věta“ s průměrnou kadencí nabodeníček v textu, tak by asi snáze vynikla, ale kouzlo bratří barevných koní zde mělo nebezpečně velkou moc. Poslední krok mě stál nejméně hodinu života.

Až nějaké manuální hraní v nejrůznějších online konvertorech nečekaně vydalo text s nebývale velkým množtvím znaků Ã, Å a Ä. Každý kdo dělal cokoliv s weby před ~10 lety, tak je okamžitě doma.

@jakubboucek

This comment has been minimized.

Copy link

jakubboucek commented Dec 23, 2018

reply

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment