10-01-2017, 15:11 door john west: Leg dit eens op een simpele manier uit ,ik heb n.l geen verstand van cryptografie.
Het gaat hierbij niet om cryptografie, maar om coderen en decoderen.
Zo hebben wij op de basisschool leren "coderen" hoe je de letter
a schrijft, uitspreekt en in woorden gebruikt. Computers hebben niets met letters maar werken met nullen en enen genaamd bits - meestal in groepjes van 8 (zo'n groepje noemen we een byte).
Voordat er computers waren werd er al serieel, bit voor bit dus, informatie overgedragen. Die informatie (meestal tekst) moest worden gecodeerd (in de juiste nullen en enen, en in de juiste volgorde) en aan de kant van de ontvanger weer worden gedecodeerd. Om dat reproducerend te kunnen doen werden afspraken gemaakt welk bitpatroon een bepaalde letter, cijfer of leesteken voorstelde.
Een uit dat tijdperk, maar nog steeds veelgebruikte standaard, is ASCII (American Standard Code for Information Interchange [1]). Elk "teken" in die "karakterset" is 7 bits breed, en dat past natuurlijk prima in een byte (van 8 bits).
Helaas verspil je daarbij elke keer een bit, en doordat een aantal "tekens" helemaal geen letters, cijfers of leestekens zijn, verspil je nog meer ruimte: de eerste 32 codes zijn namelijk non-printable besturingscodes waarvan er enkele nog veel worden gebruikt:
000 1001 (decimaal 9): tab
000 1010 (decimaal 10): line feed (ga naar de volgende regel)
000 1101 (decimaal 13): carriage return (ga naar het begin van de huidige regel)
Daarnaast zijn er tekens die, bij seriële overdracht, aangeven wanneer het bericht begint (STX, Start of Text) en wanneer het hele bericht is ontvangen (ETX, End of Text) - maar die worden nauwelijks nog gebruikt.
Met ASCII kun je, zei het wat verspillend bij 8 bits per karakter, prima platte tekst uitwisselen (en opslaan). Deze ASCII encoding werd al toegepast bij de eerste computers met o.a. MS-DOS en Unix, maar ook bij de eerste internetprotocollen waaronder UUCP, Telnet, FTP en SMTP.
En dat gaf al snel problemen, want er zijn veel talen met karakters die buiten de ASCII tekens vallen, en ook (andere) "binaire" data (waarbij alle 256 combinaties van bits in elke byte kunnen voorkomen, zoals bij foto's of MP3tjes) kun je niet zonder meer uitwisselen via een ASCII verbinding, iets dat nog steeds geldt voor SMTP (e-mail).
Om een binair bestand via e-mail te verzenden is een truc nodig: je moet bytes uit het bestand vóór verzending omzetten in een stroom "leesbare" ASCII tekens (leesbaar in de zin van dat je een nietszeggende reeks van letters, cijfers en leestekens ziet). De ontvanger moet het omgekeerde doen. Ook deze processen heten resp. coderen en decoderen (niet in de zin van versleutelen, maar omzetten of vertalen).
Daar zijn verschillende protocollen voor uitgevonden, waaronder uuencode [2]. Dat werkt, vereenvoudigd, als volgt:
- neem 3 bytes van het binaire bestand, 24 bits dus
- splits dit in 4 groepjes van 6 bits, en plaats deze in een buffer (tijdelijk stukje geheugen) van 4 bytes
- tel bij elk van die bytes decimaal 32 op
- verzend de 4 bytes (elk met een decimale waarde tussen 32 en 95, beide inclusief)
- herhaal dit tot het hele bestand verzonden is (indien het bestand geen veelvoud van 3 bytes lang is, gebruik je "vulbytes" en stuur je de werkelijke lengte er achteraan).
De ontvanger doet het omgekeerde en verkrijgt zo een exacte kopie van het binaire bestand. Als de ontvanger naar de "source" van de e-mail zou kijken, zou zij, in plaats van de bijlage, zo'n onsamenhangende reeks van letters, cijfers en leestekens zien.
Overigens is dit behoorlijk bandbreedte- en opslagruimteverspillend en het is exact de reden waarom e-mails met een grote bijlage (zoals een niet in-aantal-pixels verkleinde digitale foto) ca. anderhalf keer zo groot zijn (in MegaBytes) als de bijlage zelf op schijf.
En nu maar stemmen!
[1]
https://en.wikipedia.org/wiki/ASCII[2]
https://en.wikipedia.org/wiki/Uuencoding