Vymýšlení pláště neviditelnosti v JavaScriptu

Steganografie. Umění schovat něco přímo pod nosem. Od té doby, co jsou lidé naživu, se snažíme věci skrývat – ať už je to náš poslední kousek pizzy nebo umístění zakopaného pokladu. Pamatujete si na skvělý trik s neviditelným citronovým inkoustem, kdy jsme napsali tajnou zprávu citronem a zahřívali papír, abychom odhalili velké tajemství? No, to je to, co je Steganografie, v kostce, což nám umožňuje snadno utajit zprávy pouhým skrytím jejich existence.

Na počátku 20. století němečtí špióni infiltrovali občany Francie ve jménu obchodu. Jejich motivem však bylo pozorovat detaily francouzského obranného systému a pomoci Němcům při invazi do Francie. Chytře navržený francouzský obranný systém udržoval maximální důvěrnost i mezi jednotlivými regiony, takže pro jednoho špiona bylo obtížné shromáždit všechny informace. To vyžadovalo, aby několik špiónů shromáždilo informace z každého regionu a společně navrhli svůj herní plán. Místo setkání musí být z důvodu vysoké bezpečnosti sděleno pouze v ten den, ale jak se mělo během jednoho dne dostat do všech regionů? Vybrali si noviny, rychlý, ale velmi nejistý veřejný kanál! Ale na to už Němci mysleli. Místo tajného setkání zveřejnili ve zprávách o počasí pro daný den.

Vezmeme první písmeno každého slova a co dostaneme - místo setkání

Tehdy neviditelný inkoust, nyní neviditelné znaky.

V době informací je nejdůležitějším místem pro komunikaci internet. Aplikace pro zasílání zpráv, jako je messenger, Whatsapp, iMessage, a sociální média, jako je Twitter, Facebook, Instagram. Jak můžeme použít stejný problém zde a vyřešit jej nyní? No, mohli bychom začít s nulovou šířkou znaků.

'Copy me‌‌‌‌‌‌‌- vložte tento citát na https://www.textmagic.com/free-tools/unicode-detector, abyste viděli ZWC, které se celou dobu skrývají přímo před vámi.

Znaky s nulovou šířkou jsou netisknutelné znaky, které jsou součástí tabulky Unicode. Jak název napovídá, ani neukazují svou přítomnost. Používají se k umožnění zalamování řádků v dlouhých slovech, spojování emotikonů, kombinování dvou znaků do ligatury, zabránění jejich spojení atd.

Znaky zwj připojte se k emotikonům, ale nejsou viditelné

Tyto postavy si stále více našly cestu ve skrývání textu a jejich úplná neviditelnost je pozoruhodným prodejním argumentem. Nelze je zablokovat, protože jsou integrální ve více jazycích a emotikonech. A také se ukazuje, že ZWC nejsou jediné postavy, které jsou neviditelné, např. Neviditelný oddělovač — U+2063.

Tabulka, která obsahuje většinou používané neviditelné znaky.

Jeden malý problém s tímto stolem! Gmail blokuje U+200B (mezera s nulovou šířkou). Aby také ne, Twitter je známý blacklistem nepotřebných neviditelných znaků, žádná z postav v tabulce kromě U+200C, U+200D a U+180e nefunguje. Takže teď máme tři postavy!

Počkejte, U+180e není neviditelný a na iOS zařízeních se vykresluje divně. Nyní máme pouze 2 znaky.

Roztrháním tabulky Unicode, testováním každé možné Neviditelné postavy na její neviditelnost napříč platformami/webem jsme schopni přidat do našeho arzenálu 4 další postavy, celkem 6 neviditelných postav, které nyní můžeme použít ke skrytí našich tajemství v řetězcích.

const zwc = ['‌', '‍', '⁠', '⁢', '⁣', '⁤'] // 200c,200d,2060,2062,2063,2064 The digital equivalent invisible ink

Nyní, abychom mohli použít neviditelný inkoust, vše, co musíme udělat, je dát tajné „ahoj“, musíme jej reprezentovat binárně, tj. 01101000 011010001. Pak vezměte 4ZWC a namapujte je na dvoubitovou pravdivostní tabulku, tj. 00-200c ,01-200d,10-2060,2062-11. Pomocí pravdivostní tabulky převeďte binární soubor na neviditelný proud a vložte jej do jakékoli úvodní zprávy kdekoli.

Šifrování skrytého obsahu

Co když vetřelec nějakým způsobem zjistí přítomnost skrytých postav a pokusí se hrubou silou přinutit tabulku pravdy, aby odhalila tajemství.

Zde přichází na řadu Kerckhoffův princip:

Proto potřebujeme nějaký klíč k uzamčení našich tajemství. K tomu lze použít funkci generování klíčů na základě hesla k získání silného klíče, který se zase používá k šifrování našich zpráv. K zašifrování skrytého tajemství lze použít proudovou šifru AES-CTR s náhodnou IV a solí, protože má další výhodu v tom, že na rozdíl od blokových šifer nevyžaduje vyplnění, protože zvyšuje délku zprávy.

Komprese

Vzhledem k tomu, že toho děláme tolik se šifrováním, rozhodně potřebujeme maximální možnou kompresi.

Jak můžete vidět, i když jsme měli šest znaků ZWC, byly použity pouze 4, protože 6 není mocninou 2. Dva další znaky (U+2063, U+2064) lze použít k vytvoření další vrstvy abstrahované Huffmanovy komprese snížení redundance. Poté, co byl tajný kód převeden na ZWC, jsou určeny dva nejvíce se opakující ZWC v proudu, řekněme U+200D a U+2060. Nyní lze každé dva po sobě jdoucí výskyty U+200D a U+2060 nahradit jedním U+2063 nebo U+2064. Tím se hodně ušetří, protože často byla pozorována redundance.

Nyní máme dvě vrstvy komprese, které nejlépe využívají 6 neviditelných znaků! Skvělé!

Spojením všech těchto možností jsme se dvěma přáteli vytvořili StegCloak, čistě JavaScriptový steganografický modul navržený ve stylu funkčního programování, aby bylo dosaženo toho, co je řečeno výše.

Zde je jeho rychlá ukázka:

Doufáme, že se vám bude líbit stejně jako nám při jeho stavbě!

Pokladna StegCloak na Github nebo navštivte https://stegcloak.surge.sh.