Programátorský víceboj 0. díl - Šifrujeme

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

cpp
nováček
Příspěvky: 41
Registrován: červen 17
Pohlaví: Muž
Stav:
Offline

Programátorský víceboj 0. díl - Šifrujeme

Příspěvekod cpp » 05 čer 2017 14:03

Ahoj kolegové,

nikdo se nestal dobrým programátorem tím, že by se koukal do knížek. Nejvíc užitečných věcí poznáš samozřejmě při programování. Proto bych Vám rád představil Programátorský víceboj, který má za cíl obohatit všechny soutěžící o nové poznatky. Inspirací mi byla Malá hra velkého Bajta.

Protože je pondělí a myšlenkami jsme ještě u bohužel již minulého slunečného víkendu, dáme něco lehkého, jenom tak na rozehřátí.

Zadání
Naprogramujte konzolovou aplikaci pro šifrování a dešifrování s možností výběru následujících algoritmů:


Při operaci šifrování bude ze standardního vstupu čten plaintext a na standardní výstup vypisován šifrovaný text (při dešifrování naopak). Výběr operace a případné zadání klíče bude realizováno pomocí argumentů příkazové řádky.

U Caesarovy šifry pracujte pouze s písmeny a-Z, A-Z anglické abecedy (bez diakritiky), jiné znaky nešifrujte.

Syntaxe
crypto ALG [OPTION] [-k KEY]

ALG specifikuje šifrovací algoritmus (--caesar) nebo (--vernam) a je povinný.
OPTION specifikuje zda má jít o šifrování (-e) nebo dešifrování (-d) a je povinný pro základní variantu Caesarovy šifry a pro Vernamovu šifru. Pro rozšířenou Caesarovu šifru nesmí být uvedený.
KEY není uváděn pro základní variantu Caesarovy šifry, ale je povinný pro rozšířenou variantu Caesarovy šifry (kde jde o celé číslo specifikující posun) a pro Vernamovu šifru (kde specifikuje cestu k souboru s klíčem).

Příklady použití

Kód: Vybrat vše

#cat plaintext.txt | ./crypto --caesar -e
#cat plaintext.txt | ./crypto --caesar -d
#cat plaintext.txt | ./crypto --caesar -k -8
#cat plaintext.txt | ./crypto --caesar -k 10
#cat liebesbrief.txt | ./crypto --vernam -e -k "key.txt"
#cat encrypted_liebesbrief.txt | ./crypto --vernam -d -k "key.txt"


Poznámka k Vernamově šifře
Klíč k Vernamově šifře je obsažen v souboru specifikovaném parametrem -k. Soubor bude textový a bude obsahovat číselné hodnoty (celá nezáporná čísla) udávající hodnotu posunu pro každý znak vstupního textu. Jednotlivá čísla budou od sebe oddělena pouze středníkem (bez mezer). Soubor musí obsahovat nejméně tolik čísel jako vstupní text (při testování bude zaručeno, nemusíte kontrolovat) a bude zaručena jeho validnost.

Vypracování
Víceboj je zaměřen především na jazyk C, ale k řešení můžete použít libovolný jazyk.

V případě jazyka C je dopuručena kompilace s parametry:

Kód: Vybrat vše

-Wall -Wextra -Werror -std=c99 -pedantic


Řešení vložte do fóra nebo na pastebin (a podobné služby).

Zpětná vazba
Zpětná vazba je to nejdůležitější. Prosím proto všechny řešitele a náhodné kolemjdoucí, aby kód řešení svých kolegů komentovali. Kontruktivní kritika se cení!

Vzorové řešení bude uveřejněno po skončení první disciplíny. Hodně zdaru při řešení!

EDIT:

Základní varinta Caesarovy šifry je myšlena varianta s posunem o 3 znaky. Děkuji faraonovi za poznámku.

Příklad souboru s klíčem pro Vernamovu šifru:

Kód: Vybrat vše

6;9;5;23;8;3;16;7;10;19;22;1;2;17;0;4;13;25;24;18;20;11;26;21;2;6;12;14;25;21;15;5;13;17;0;9;20;19;23;16;4;22;8;3;1;26;7;18;10;24;11;22;23;2;19;20;15;5;4;26;8;3;16;14;1;0;21;13;18;24;7;10;25;12;6;9;17;23;20;2;16;12;6;21;15;11;22;10;9;18;24;25;14;1;26;0;18;16;12;19;3;14;5;1;24;25;21;4;2;9;11;13;17;15;7;8;20;23;10;22;6;11;20;5;22;15;10;0;17;21;16;14;7;12;24;4;23;1;19;3;2;8;18;9;25;26;13;6;17;12;8;20;21;3;25;9;13;18;15;22;0;11;14;5;23;1;16;24;6;26;7;10;19;4;2;22;5;0;16;6;20;13;3;14;2;11;21;18;4;8;19;12;26;25;1;7;9;17;23;10;15;24;8;12;23;9;25;18;2;19;13;22;0;17;14;4;1;6;3;10;16;5;20;7;15;11;21;24;26;20;19;7;4;1;23;26;25;2;3;12;5;14;15;21;18;8;13;24;0;22;17;10;16;11;9;6;
Naposledy upravil(a) cpp dne 06 čer 2017 20:54, celkem upraveno 3 x.

Reklama
Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23591
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 0. díl - Šifrujeme

Příspěvekod ITCrowd » 05 čer 2017 14:29

Muhehe :-) Prý inspirován :lol:
Neděláš nic jiného, než sprostě upravuješ faraonovo zadání. Ledaže bys to měl zadáno jako domácí úkol do školy a snažíš se nás oblafnout :-)
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router

someoneFromSomewhere
nováček
Příspěvky: 20
Registrován: květen 17
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 0. díl - Šifrujeme

Příspěvekod someoneFromSomewhere » 05 čer 2017 16:47

Ono, inspirovat se můžeš. Ale je zbytečné vymýšlet něco na principu, který tady už byl (šifrování), a když tu pořád běží hra o Velkého bajta (běží == někdo ještě aktivně řeší).

Co se tohohle zadání týče, tak nejsložitější část je čtení vstupních parametrů, zbytek jsou jen lehké věci (oba dva typy jsou si podobné a nevidím v tom žádnou zapeklitost).

Dále, jakou máme záruku, že jsi doopravdy schopný něco funkčního naprogramovat? Je slušné nejdřív dokázat, že tvůrce soutěže má na to co zadává dalším.
-m
std::endl není nový řádek!

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 0. díl - Šifrujeme

Příspěvekod faraon » 05 čer 2017 17:55

Teda, to je opravdu originální způsob jak si nechat udělat domácí úkol, a zasluhuje ocenění! Takže se zapojím, ale odevzdávat můj program ve škole bych fakt neradil, předem upozorňuji že nebude vhodný pro oči (ani nervy) učitelů :twisted:

Ten popis Vernamovy šifry na Wikipedii není úplně dokonalý, původní mechanizmus patentovaný v roce 1919 používal dvě pětistopé děrné pásky do dálnopisu, a ty mezi sebou ve shodných stopách XORoval pěti obyčejnými relátky (borci si můžou zkusit nakreslit vlastní schéma). Stejně fungovala i ta zmíněná horká linka mezi Kremlem a Bílým domem, byl to úplně obyčejný dálnopis, jenom na vstupu a výstupu linky byla přidaná aparatura s páskou obsahující "heslo". A papaláši si mohli chatovat, úplně stejně jako starší z nás svého času přes (nešifrované) ICQ.

Co se nerozluštitelnosti týče, je daná právě tím náhodným heslem. Ale i mnohem starší Vigenérova šifra může být nerozluštitelná, pokus se dodrží tři známé bezpečnostní zásady, platící pro šifrování obecně. Její prolamování je založené na počtu opakování hesla, a čím blíže jedničce je, tím těžším se stává. Viz šifra Nihilistů.

K zadání, co je myšleno tím "základní varianta Caesarovy šifry"? Posun +3, který se uvádí v dnešní literatuře, nebo +5 udávaný ve starší, a údajně používaný i samotným Julkem? Údajně, protože fakt nebyl takový blbec aby milostné dopisy Kleopatře šifroval stejným posunem jako rozkazy generálům, a navíc těch šifer používal víc, substitučních i transpozičních.

Bylo by od tebe hezké, kdybys sem vložil ukázkové soubory s textem a heslem, ušetřil bys tím všem práci.

A rád bych znal termín ukončení kola, ať vím jak hodně mám spěchat (momentálně mě vytěžuje spíš hardware než software). Malá hra o Velkého bajta nemá žádné ukončení, kdokoliv v budoucnu si může zahrát s námi, a zkusit ukázat svoje řešení, nebo nějaký jiný/nový přístup k vybrané úloze.

P.S. O tom slunečném víkendu jsem pěkně zmoknul, v neděli tu byl slejvák že nadskakovaly poklopy na kanálech :lol:
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

cpp
nováček
Příspěvky: 41
Registrován: červen 17
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 0. díl - Šifrujeme

Příspěvekod cpp » 05 čer 2017 18:08

Jak je psáno v zadání. Vzorové řešení mám a bude uveřejněno.

ITCrowd píše:sprostě upravuješ faraonovo zadání.


Co v tom nevidím něco sprostého?

Do školy už nějaký ten pátek nechodím. Programuju teď úplně jiné věci. :|

Zapojíš se do soutěže?

someoneFromSomewhere píše:Ale je zbytečné vymýšlet něco na principu, který tady už byl (šifrování)


Nedej se zmást podobným tématem, cíl snažení by měl být trošku jiný. Účelem nultého dílu není řešit složitý problém, ale ukázat si dobré techniky při programování. I u triviálních programů se projeví špatné programátorské techniky.

V dalších kolech se samozřejmě bude složitost stupňovat.

someoneFromSomewhere píše:Dále, jakou máme záruku, že jsi doopravdy schopný něco funkčního naprogramovat? Je slušné nejdřív dokázat, že tvůrce soutěže má na to co zadává dalším.


Tomu se říká výstřel do tmy. :D

someoneFromSomewhere
nováček
Příspěvky: 20
Registrován: květen 17
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 0. díl - Šifrujeme

Příspěvekod someoneFromSomewhere » 05 čer 2017 21:03

Jak můžeme u člověka s 2mi posty (kde jenom zadává) zjistit, jak je schopný programátor. Takhle to opravdu zní, jako cesta udělat jednoduše domácí úkol. Třeba výše faraon má více než dostatečné znalosti k tomu, aby nás mohl testovat, což dokazuje každým druhým příspěvkem k těmto tématům.

Jak podezřele to pak vypadá?

Mám práce nad hlavu, ale klidně tu řešení hodím až bude volná chvíle.
std::endl není nový řádek!

cpp
nováček
Příspěvky: 41
Registrován: červen 17
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 0. díl - Šifrujeme

Příspěvekod cpp » 05 čer 2017 21:59

Já ale nechci nikoho testovat. Cílem "hry" je, aby si všichni zvýšili programátorský skill. Kód si budeme hodnotit navzájem.

someoneFromSomewhere píše:Jak můžeme u člověka s 2mi posty (kde jenom zadává) zjistit, jak je schopný programátor.


Hodnotit programátora podle počtu příspěvků ve fóru? To je zajímavá metrika. :shock: A proč vůbec chceš zjišťovat, jak jsem dobrý programátor? :roll:

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 0. díl - Šifrujeme

Příspěvekod faraon » 05 čer 2017 22:24

Zbytečná hádka, prostě mu to dokaž, ať má radost: viewtopic.php?f=61&t=168696
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23591
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 0. díl - Šifrujeme

Příspěvekod ITCrowd » 06 čer 2017 08:21

"Jak je psáno v zadání. Vzorové řešení mám a bude uveřejněno." - až ti ho vě škole dá učitel :-)
"Co v tom nevidím něco sprostého?" - každá krádež je sprostá
"Zapojíš se do soutěže?" - jistěže ne.
"Hodnotit programátora podle počtu příspěvků ve fóru? To je zajímavá metrika." - My se tady už nějakou dobu známe, víme, co kdo umí a co ne, do jakých témat přispívá, i co ho třeba zajímá. Tedy logicky - čím více příspěvků, tím více ho známe. Což bys asi jako programátor měl pochopit :-).
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router

cpp
nováček
Příspěvky: 41
Registrován: červen 17
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 0. díl - Šifrujeme

Příspěvekod cpp » 06 čer 2017 11:26

2ITCrowd

1. Školu už mám nějaký ten rok hotovou.
2. Žádné krádeže jsem se nedopustil.
3. Když se nechceš zapojit do soutěže, proč tu komentuješ?
4. A kvůli čemu mě potřebujete znát?

Mrzí mě, že když chci udělat něco pro ostatní, tak se tu objeví lidi, co musí mít negativní komentáře. Zvlášt když jeden z nich se ani nechce zapojit.

2faraon

Vůbec by mě nenapadlo, že mi bude někdo vyčítat zadání s podobným tématem, jako jsi měl Ty. Doufám, že jsem Tě nenaštval.

Na wiki to nemusí být úplně dokonalé (však máš možnost to upravit :-) ). Textovou variantu jsem před binární upřednostnil záměrně, přestože binární se mi líbí víc. Binární varianta má identické operace pro šifrování i dešifrování, což u textové neplatí. Ale zase na druhou stranu binární varianta by omezovala počet jazyků.

K zadání, co je myšleno tím "základní varianta Caesarovy šifry"? Posun +3, který se uvádí v dnešní literatuře, nebo +5 udávaný ve starší, a údajně používaný i samotným Julkem?


Díky za připomínku, doplním do zadání. Původně byl myšlen posun o 3.

Plaintexty, ciphertexty a klíče doplním.

Kolo žádné ukončení nemá, protože nejde soutěž v pravém slova smyslu, jak by se mohlo zdát z názvu. Cílem je vzájemně si ohodnotit kvalitu řešení, zatímco u Bajta šlo spíše o funkčnost (co jsem vypozoroval z komentářů). Proto jsem také zvolil úlohu tak, aby se projevily programátorské nešvary.
Zadání pro další kolo bude uveřejněno koncem týdne a bude se týkat matematiky.

Dodatečně přidáno po 2 hodinách 8 minutách 6 vteřinách:
Opravil jsem chyby v příkladech použití (> změněno na |).

Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23591
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 0. díl - Šifrujeme

Příspěvekod ITCrowd » 06 čer 2017 13:59

1. Školu už mám nějaký ten rok hotovou. - Budiž. Můžu věřit a nemusím
2. Žádné krádeže jsem se nedopustil. - Kopírování autorské myšlenky je trestné i dle našeho právního řádku.
3. Když se nechceš zapojit do soutěže, proč tu komentuješ? - Protože můžu
4. A kvůli čemu mě potřebujete znát? - My tě nepotřebujeme znát. Byla to odpověď na: "Hodnotit programátora podle počtu příspěvků ve fóru? To je zajímavá metrika." Programátor by asi pochopil, oč jde.
"Mrzí mě, že když chci udělat něco pro ostatní, tak se tu objeví lidi, co musí mít negativní komentáře. Zvlášt když jeden z nich se ani nechce zapojit." - Klidně udělej. Ale vlastního.

Mimochodem - žena říká programátorovi - "Kup chleba a jestli budou mít vejce, tak jich vezmi 10"
Co přinese programátor z obchodu? :lol:
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router

cpp
nováček
Příspěvky: 41
Registrován: červen 17
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 0. díl - Šifrujeme

Příspěvekod cpp » 06 čer 2017 14:47

1. Naštěstí mi je jedno, jestli mi věříš nebo ne.
2. Kopírovat myšlenky (zatím) nejde, kopírovat jde maximálně tak dílo. Pokud vím, tak faraon Caesarovu šifru ani Vernamovu šifru nevymyslel, stejně tak nevymyslel programátorské soutěže na fórech. Takže co jsem od něj zkopíroval?
3. Jistě, já ti nic nezakazuju, jenom mě zajímají tvoje myšlenkové pochody. Proč se musíš vyjadřovat k něčemu, co se tě netýká.

"Klidně udělej. Ale vlastního."
Však jsem také udělal něco vlastního.

"Co přinese programátor z obchodu? :lol:"
Starý vtip. Přinese 10 nebo 11 chlebů (záleží na to, jaký přiřazuješ význam jednotlivým slovům).


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti