﻿<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="/cjs/examples.screen.xsl" media="screen"?>
<examples chapter="Steganografie" directory="steganografie">

  <theory>
    <p>
      Principem <strong>steganografie</strong> je uschovat uvnitř nosiče vlastní předmět komunikace. Zatímco zašifrovanou zprávu je možno poznat na první pohled, o steganograficky ukryté se velmi těžko zjišťuje, že vůbec existuje. Přitom je jasné, že čím „mohutnější“ nosič, tím snáze – a hůře detekovatelněji – se do něj tajná zpráva uschová. Bezvadným kandidátem jsou proto obrázky ^_~
    </p>
    <p>
      Příklad: Vezměmež si třeba jenom nejmenší možnou změnu obrazové informace – záměnu originálního nejméně významného bitu v každém barvovém kanále RGB-obrázku. Tím získáme na každé dva pixely obrázku šest bitů k uschování informace, to jest 64 hodnot – to bohatě stačí nejen na celou abecedu! Bude-li takto zapsaná zpráva ještě navíc zašifrovaná, nemáte prakticky šanci zjistit, že v tom kterém obrázku je vlastně vůbec ukrytá.
    </p>
  </theory>


  <example>
    <text>
      Po vzoru příkladu z <a href="https://en.wikipedia.org/wiki/Steganography" class="external">článku o steganografii na Wikipedii</a> jsem do následujícího obrázku uschoval obrázek jiný:
      <img src="_files/steganografie.1.png" width="500" height="375" alt="obrázek s obrázkem" class="imgcenter"/>
      Pouze jsem použil větší kvalitu kódování – spodní tři bity z osmi, takže změny v obrázku jsou při porovnání s originálem (který naleznete u jiných cvičení) již dobře znatelné. Princip dekódování tudíž je:
      <ul>
        <li>
          extrahovat ze zadaného obrázku spodní tři bity každého barvového kanálu (tedy osm odstínů pro každou barvu místo možných dvou set padesáti šesti);
        </li>
        <li>
          provést linearizaci takto získaných hodnot na celé dostupné spektrum (tedy provést „nafouknutí“ z rozsahu 0-7 na rozsah 0-255);
        </li>
        <li>
          získaná data zapsat jako obrázek stejného typu (a nestačit se divit ^_~).
        </li>
      </ul>
    </text>
    <hint>
      Výstupní obrázek schválně neuvádím – když ho najdete, určitě ho poznáte. S pomocí Numpy se dá rekonstrukce zapsat v podstatě na jednu řádku. Jen si dejte pozor, že hodnoty barev musí být celá čísla. Bod dvě, tedy linearizace rozsahu, se dá spočítat různě (složitě) – v podstatě jde o zesvětlení výsledného obrázku, takže se hodí téměř jakýkoli způsob.
    </hint>
  </example>

  <example>
    <text>
      Napište program pro výrobu (uschovaných) obrázků podle algoritmu z předchozího příkladu. Vstupem jsou tedy obrázky dva – nosič a tajný – a výstupem obrázek jeden, který se na první pohled tváří skoro jako nosič, ale už na ten druhý je toho v něm víc.
    </text>
    <hint>
      Příslušné operace jsou tedy doplňkem k těm z předchozího příkladu. Proto jsem také nepoužil čtyřbitovou kvalitu – u té by princip nebyl tak pěkně vidět.
    </hint>
  </example>

  <example>
    <text>
      Zkuste naimplementovat algoritmus z teoretického popisu – co dva pixely, to jedno písmeno (či ještě něco navíc). Bez šifrování, pouze čistý záznam textu a jeho zpětná extrakce.
    </text>
    <hint>
      Do komentářů připište, jaký rozsah znaků a jakým způsobem kódujete, ať to nemusím lovit jenom z kódu. Děkuji.
    </hint>
  </example>


</examples>
