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ů:
- Caesarova šifra (https://cs.wikipedia.org/wiki/Caesarova_%C5%A1ifra)
- Vernamova šifra - textová varianta(https://cs.wikipedia.org/wiki/Vernamova_%C5%A1ifra)
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;