Úloha 28: Šifra had (spirálová matice)

Pokročilý 2D matice / pole spirálový algoritmus transpozice cykly

Cíl úlohy

Vytvořte transpoziční šifrovací algoritmus Had. Text se zbaví mezer a zalomení řádků a zapíše se do čtvercové matice o rozměrech k×k po spirále směrem od vnějšího okraje ke středu (doprava → dolů → doleva → nahoru). Zbývající volná políčka se vyplní náhodnými písmeny. Šifrovaný text vznikne čtením matice po řádcích.

Určení minimálního čtverce a hranice matice

  • Rozměr matice: Pokud má zpráva N znaků, hledáme nejmenší celé číslo k takové, že k2≥N, tedy k=⌈N⌉.
  • Řízení okrajů (Borders): Spirálový pohyb udržuje 4 hranice:
    1. Pohyb doprava po horním okraji, následně horní okraj posuneme o 1 dolů ($horniOkraj++).
    2. Pohyb dolů po pravém okraji, následně pravý okraj posuneme o 1 doleva ($pravyOkraj--).
    3. Pohyb doleva po dolním okraji, následně dolní okraj posuneme o 1 nahoru ($dolniOkraj--).
    4. Pohyb nahoru po levém okraji, následně levý okraj posuneme o 1 doprava ($levyOkraj++).

Úvahy a doporučený postup řešení

  • Rozdělení UTF-8 řetězce: Pro české znaky použijte multibyte bezpečné rozdělení (např. mb_str_split() nebo regulární výraz preg_split('//u', $text, -1, PREG_SPLIT_NO_EMPTY)).
  • Zarážka konce textu: Aby příjemce poznal, kde končí původní zpráva a kde začíná náhodná výplň, za poslední znak původního textu vložíme hvězdičku *.

Doplňující otázky k zamyšlení a náměty na rozšíření

  • 1. Jak by fungoval reverzní dešifrovací algoritmus pro přečtení původní zprávy?
  • 2. Jaké další geometrické trasy zápisu do matice se v kryptografii historicky používaly (např. šachovnice, cik-cak / rail fence šifra)?

Vyzkoušejte funkční řešení: Otevřít vzorovou úlohu had.php