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

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 » 09 čer 2017 15:34

Klidně ho zveřejni, já to moje dneska trochu otestuji a pokud se dostaví očekávatelný výsledek, večer ho sem hodím. A budou lítat hromy blesky :lol:



[ot]Pan matematik si neuvědomuje, že 5() není totéž co 5*()...[/ot]
"Král Lávra má dlouhé oslí uši, král je ušatec!

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

Reklama
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 » 09 čer 2017 18:02

https://pastebin.com/cBzdtFkM
https://pastebin.com/UsfG5M8s
https://pastebin.com/YmSjH8kK

Nejsem kdoví jaký programátor. Moje hodnocení:

  • Komentáře chybí záměrně (psát kód, aby mu jiní porozuměli bez komentářů je výzva!).
  • Knihovní funkce také nevyužívám záměrně (kod by pak byl příliš krátký a my se učíme programovat, že...).
  • Implementace Vernamovy šifry není bezchybná. Při příliš krátkém klíči může nastat segfault kvůli přístupu do stringu. Protože je zadáním zaručena bezchybnost klíče, neřeším (jsem líný řešit :lol: )
  • Implementace Caesarovy a Vernamovy šifry není efektivní, kvůli opakovanému volání funkce pro samotný posuv znaků. Ať se s tím popere optimalizátor.
  • Hlavičkový soubor je zde zbytečný, mám ho spíš jen pro ukázku.
  • Není manuál a program neumožňuje výpis chybových zpráv.
  • Není možnost zapnout ladící výpisy (kdybych to dělal, tak bych nejspíše využil preprocesor a podmíněný překlad).
  • Jelikož jde o crypto program, tak by možná bylo vhodné určité proměnné nulovat.

Tak do mě. Jakákoli konstruktivní kritika vítána.

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 » 09 čer 2017 21:00

Šifruješ sice jenom alfabetické znaky, ale klíč načítáš na všechny, není to trochu zbytečné? Ve svých ranných pokusech o Vigenérovu šifru jsem to dělal stejně, ale výsledek neodpovídal ručnímu zpracování, což je podle mě chyba.

Takže testy vyšly, tady je moje řešení:

Kód: Vybrat vše

#include <stdio.h>
#include <ctype.h>

int main(int c,char **v)
    {
    int z,a=(v[1][2]&1<<2),o=a?(v[2][1]&2<<1)?v[3]=v[4],v[2][1]&1:2:3,p=v[2][1]&2<<1?v[2][1]%2?3:~2:!sscanf(v[3],"%d",&z)+z;
    char r;
    FILE *k=a?fopen(v[3],"r"):NULL;

    while (EOF!=(z=getchar())) putchar(a?o&2?fgetc(k)^z:isupper(z)?fscanf(k,"%d%c",&p,&r),z+=(o?p:-p)%26,isupper(z)?z:isupper(z+26)?z+26:z-26:islower(z)?fscanf(k,"%d%c",&p,&r),z+=(o?p:-p)%26,islower(z)?z:islower(z+26)?z+26:z-26:z:isupper(z)?z+=p%26,isupper(z)?z:isupper(z+26)?z+26:z-26:islower(z)?z+=p%26,islower(z)?z:islower(z+26)?z+26:z-26:z);

    return k?fclose(k):!!k;
    }


Pár poznámek:
  • Kód je samodokumentující, a ono tam vlastně není co komentovat. Bylo těžké to vymyslet, takže bude ještě těžší to pochopit :lol:
  • Předpokládají se bezchybné vstupní údaje. V opačném případě je chování programu nepředpokládatelné.
  • Vzhledem k tomu že alfabetickou "Vernamovu" šifru vytvořil Vernamův kolega Joseph Mauborgne (vlastně je to Vigenérova šifra s nekonečným heslem), implementoval jsem i skutečnou binární Vernamovu šifru: --vernam -k soubor (ekvivalentně k parametrům Caesarovy šifry).
  • Něco by se dalo ještě zjednodušit, ale tolik času tomu věnovat nechci.

P.S. Varoval jsem že to nebude vhodné pro oči a nervy učitelů :twisted:
"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 » 20 čer 2017 10:51

Kód sice vypadá strašně cool, cílem tohoto seriálu má být něco jiného - nestačí pouze funkční kód. Kód by měl být přehledný a měly by se uplatnít dobré programátorské praktiky. Kromě toho ani nefunguje zcela správně. To, že nejsou správně zpracovány a validovány parametry nevadí. Neošetření chybových stavů vadí trochu víc, ale pořád v pohodě. Co vadí je, že Vernamova šifra moc dobře nefunguje.

Jsem zklamaný, že nikdo jiný nedokázal předvést svoje řešení. Během dnešního dne uveřejním druhé kolo, které pojmu trošku jinak. Spoustu lidí nejspíš odradily přísné striktní specifikace, takže dnes se bude pouze doplňvat kód funkcí.

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 » 20 čer 2017 16:39

S tím bych si dovolil nesouhlasit.

O validování parametrů nebyla v zadání ani zmínka, naopak jsi tvrdil že soubor s klíčem bude vždy správný, což nemůžeš v reálu zajistit. Stačí drobná chyba paměťového média... Takže testovat by se muselo stejně úplně všechno včetně klíče. Správné parametry jsou zpracovány přesně podle zadání, jsou-li nesprávné, nic se neděje, program funguje v mezích možností dál, nebo rovnou spadne dřív než může způsobit nějakou škodu. I to je použitelný způsob reakce na chybu. (Četl jsi Programátorské poklesky od K&K?)

Troufám si tvrdit že to co ty nesprávně nazýváš "Vernamova šifra" v mém programu pracuje správně, a ve tvém špatně. Porovnej výsledky na textu který obsahuje jenom písmena, bez mezer a jiných znaků. Nemůžu posoudit tvoje znalosti kryptografie (podle toho co jsi předvedl v zadání bych je tedy moc vysoko nehodnotil), já sám se o tenhle obor zajímám víc než tři desetiletí, a nepokládám se za odborníka. Ale ten šifrovací mechanizmus bych navrhl úplně jinak. (Četl jsi aspoň Knihu kódů a šifer od Singha?)

Ohledně "dobrých" programátorských praktik, jejich důsledkem je obvykle to že programy jsou pomalejší a zabírají víc paměti. Mnohonásobně víc. Schválně si zkus mým a tvým programem prohnat vstupní soubor velký 1TiB, a sleduj co se bude dít. Já vím o několika místech v mém kódu, která ho zpomalují a také jak by se dal několikanásobně urychlit. A rozhodně si nemyslím že je cool, právě naopak, je to pouze minimální řešení vzniklé k okamžitému zpracování aktuálního problému. Ideální pro takovéhle akce je jazyk Perl, nikoliv C. (Četl jsi Umění programování v Unixu od ESR?)

Ještě k tomu zadání, Sun-c’ pravil: "Nebyly-li rozkazy správně pochopeny, je to vždy chyba velitele."
"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 » 20 čer 2017 19:29

V zadání bylo řečeno pouze to, že je zaručena bezchybnost souboru s klíčem. Sice máš pravdu, že v reálu to tak být nemusí, ale my nedělali aplikaci pro reálné použití, že?
Validování vstupních parametrů jinak beru jako samozřejmost, proto jsem jeho nutnost nezmiňoval a naopak jsem řekl, kdy se dělat nemusí. Pokud píšeš pár prográmků pro sebe, tak věřím, že nutnost validace vstupů nevidíš, ale v případě, že máš programování jako zaměstnání je situace jiná.

Ano, ta pravá Vernamova šifra se dělá pomocí XOR. V zadání však bylo vysvětleno, že se má použít textová varianta. Bitová varianta je až příliš jednoduchá a v podstatě na ni není co vymýšlet, proto byla zvolena o (malinko) složitější textová varianta.

Máš pravdu, moje implementace nefunguje správně. Původně jsem dělal šifrování pro všechny znaky a pak předělával a kód jsem už dál neupravil. Díky za upozornění.

Nemůžu posoudit tvoje znalosti kryptografie (podle toho co jsi předvedl v zadání bych je tedy moc vysoko nehodnotil)

Věta měla končit slovem kryptografie, pak bych souhlasil. Ostatně tento seriál je o programování, nikoli o kryptografii.

Ohledně "dobrých" programátorských praktik, jejich důsledkem je obvykle to že programy jsou pomalejší a zabírají víc paměti.

Souhlasím! Ale zkus tvůj kód vyrobit v rámci zakázky. Programátor musí umět spolupracovat v týmu a musí umět svůj kód udržovat.

Ideální pro takovéhle akce je jazyk Perl, nikoliv C.

Možná ano, ale my neprogramujeme reálnou aplikaci.

A konečně, ne, žadnou ze jmenovaných knih jsem nečetl. Stojí za to?

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 » 20 čer 2017 21:35

Všechny čtyři stojí za to, včetně té poslední, staré dva a půl tisíce let. Divil by ses jak moc z válečného umění starověku platí ve dnešní IT science! A nejen v ní, jsou to obecně platná pravidla a rady, dokonalý systém řízení od vojevůdce, který nikdy neutrpěl porážku.
"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
atari
Level 6
Level 6
Příspěvky: 3195
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

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

Příspěvekod atari » 30 srp 2017 15:43

Faraon díky za skvělý tip. :thumbup: Koupil jsem si Knihu kódů a šifer od Singha, a začal jsem ji číst v sobotu a ve středu jsem ji dočetl.

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 » 30 srp 2017 16:52

Slušný výkon, mě to trvalo asi o půl dne déle :lol:
"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
atari
Level 6
Level 6
Příspěvky: 3195
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

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

Příspěvekod atari » 31 srp 2017 10:14

Já měl dovolenou u vody, takže jsem četl dopoledne i večer, jinak bych to nedal.... :lol:


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 2 hosti