Dat klopt, maar…

Ik ben vooral bezig met cryptografie. Dan denk je… wat heeft dat er mee te maken? Nou vroeger werd er meestal gebruik gemaakt van init / update / final sequentie voor ciphers en hashes. Hierbij wordt er 1 keer init aangeroepen, meerdere keren update en tenslotte 1 x final. Deze data kan kun met zogenaamde chunks worden aangevoerd.

Hoe doe je dat met “higher level API’s”? Nou: cipher aanmaken en 1 keer encrypt aanroepen: alles moet dus eerst in 1 blok in het geheugen worden geladen. Beetje lullig als je 1 GiB groot bestand wil versleutelen: minimaal 1 GiB geheugen gebruik. Meestal willen ze dan ook nog iets naar tekst overzetten, dus dan komt er – meestal onnodig – nog even een base 64 encoding overheen, die nogmaals ~1,3 GiB meer nodig heeft.

Dan willen ze die tekst weer naar een bestand schrijven, dan converteren we die base 64 weer naar binary – natuurlijk in 1 blok – en schrijven we daarmee het bestand vol. Dus dat is meer dan 3,6 GiB geheugen gebruik terwijl 1 kiB – vooruit, laten we 1 MiB nemen – meer dan genoeg is.

Ik zie dit zelfs in C# terwijl die hele API gescheven is om streaming heen (hoewel de GCM class daar dan weer vanaf wijkt – zucht).

[Reactie gewijzigd door uiltje op 14 augustus 2022 19:54]