Portál AbcLinuxu, 8. května 2025 14:33
Na začátku o "bezpečnost kódu" nešlo
A to je právě to. Když ještě časopis Chip za něco stál (ročníky menší než 2000), tak tam vycházely seriály od jednoduché kódování až po kryptografii včetně detailního popisu algoritmu Rijndael, který tehdy zrovna vyhrál soutěž NISTu o AES (Advanced Encryption Standard -- dnes se zaměňuje AES a konkrétní šifra). Ty kódy byly tak přehledné, že jej mohl studovat ale hlavně implementovat i středoškolák (pochopitelně bez znalosti příslušné matematiky). Potom se na vysoké učí RSA v programu do 20 řádků zdrojového kódu.
Když se ale podíváte téměř na jakýkoliv kryptografický program, tak ten zdrojový kód mnohem více připomíná soutěž o maximální obfuskaci.
Přitom se to evidentně dá dělat jak funkčně, tak i čitelně (což je základ pro audit) a tím i s důrazem na bezpečnost.
neřeší nějakou vlastní alokaci paměti
Tohle bylo spíše způsobeno tím, že chtěli dělat implementace pro x různých platforem (mě překvapilo, že openssl je i pro dos), takže s nějakou obecnou dobrou alokací paměti v těch platformách nešlo počítat.
Ano, ale tím vyvracíte to, že záměrem bylo co nejrychleji poskytnout implementaci nezatíženou USA zákony. Pokud by tohle bylo záměrem, neřeší nějakou vlastní alokaci paměti a ty spousty dalších hacků, ale naprogramují to přímočaře a dříve, i když by výsledný kód byl pomalejší.Myslím, že si nerozumíme. Hned v té první poznámce jsem psal "rozumně rychle vyrobit použitelné volné silné crypto". Tu optimalizaci jsem měl zahrnutu ve slově použitelné. Crypto má bohužel (bohudík) tu vlastnost, že přímočará implementace může být klidně pomalejší v poměru 10^5, nebo 10^6. Což ji změní na nepoužitelnou. Bez optimalizace od základních myšlenek se s tím pracovat nedá. Asi před 15 lety jsem psal rutinu na čtení LZW komprimovaného TIFFu. Což je trochu podobná matika jako crypto. První pokus, přímočaré naprogramování algoritmu bylo tak pomalé, že bylo nepoužitelné, rychlost nižší než 10^4 proti rychlosti LZW dekomprese zipu. Trvalo mi asi 14 dní než jsem pochopil, jak to napsat lépe a i když to bylo pořád asi 8 krát pomalejší, bylo to už použitelné. Na druhou stranu je to v podstatě jedno. Buďme rádi, že openSSL máme.
Nevím jak Vy, ale mě se nikdy nepodařilo významně "optimalizovat kód". Ať už jsem programoval ve zmíněném Fortranu na matfyzu nějaké parciální rovnice či konečné prvky nebo později věci v C-čku. Buď jsem problém "viděl" jak ho zpracovávat optimálně, tedy měl vědomí z jakých počátečních datových struktur začít, jaké mít mezilehlé datové struktury a v jakých datových strukturách mít výstup, a jaké operace mezi jednotlivými kroky mít, a pak to běhalo rychle, nebo jsem to neviděl, udělal výpočet podle formálního popisu a bylo to výkonově strašné.
Přesně tak.
Mnoho lidí si vykládá špatně ono Knuthovské "optimalizace je kořenem všeho zla" a myslí si, že když místo správné datové struktury dají prostě nějakou libovolnou a místo správného algoritmu dají prostě nějaký vyhovující, že postupují přesně podle pravidla o předčasné optimalizaci. Tak to ale není. Programátor by měl vědět, jaký je rozdíl mezi O(a^n) a O(1) a měl by vědět, jaké složitosti mají které funkce. To není optimalizace, to je prostě známka toho, že vím co dělám.
Skutečná optimalizace není vůbec o tom, že vyměním jeden algoritmus za jiný (pokud ho tam nějaké prase na počátku použilo) nebo že změním datové struktury. Skutečná optimalizace nutně vyžaduje zcela jiný pohled na problém. Přičemž je snaha některé kroky zcela eliminovat.
Aneb nejrychlejší instrukce je ta, kterou vůbec nevolám.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.