Hoe maak je een Caesar-cijfer en decryptor in C?

Laatste update: 04/12/2025
Auteur: Isaac
  • Bij het Caesarcijfer wordt elke letter vervangen door een andere letter die een vast aantal posities opzij wordt gezet, bepaald door een sleutel.
  • In C wordt dit geïmplementeerd door letters om te zetten in numerieke codes, door sommen en modulo 26 toe te passen en door hoofdletters en kleine letters te respecteren.
  • Functies zoals isalpha, isupper, islower, strlen en een modulair ontwerp maken een interactief programma mogelijk voor encryptie, decryptie en brute force-aanvallen.
  • Het is een historisch relevant, maar cryptografisch zwak algoritme, ideaal als educatieve en leeroefening. programmering.

Caesar-cijferprogramma in C

Als je met C begint en een praktisch project wilt, Maak een programma voor het versleutelen en ontsleutelen met behulp van de Caesar-cijfermethode. Het is een perfecte optie. Het is simpel, het dwingt je om strings te manipuleren, met karakters te werken en wiskundig te denken, maar zonder je gek te maken van complexiteit.

Naast het dienen als een programmeeroefening, De Caesar-cijfer is een geweldig instappunt in de wereld van cryptografieJe begrijpt wat een sleutel is, waarom sommige systemen zwak zijn en hoe je encryptie met brute force kunt aanpakken. We bekijken het stap voor stap, met theorie, voorbeelden en verschillende implementatiebenaderingen in C.

Wat is het Caesarcijfer en waar komt het vandaan?

Het telefoontje Caesar-cijferDe shift cipher, of schakelcijfer, is een van de oudste cryptografische systemen die er bestaan. De naam komt van Julius Caesar, waarvan wordt gezegd dat hij het gebruikte om het bevel te voeren gecamoufleerde militaire berichten aan zijn generaals, zodat als iemand de tekst zou onderscheppen, hij deze niet in één oogopslag zou kunnen begrijpen.

Het idee is heel eenvoudig: Elke letter van het oorspronkelijke bericht wordt vervangen door een andere letter die een vast aantal posities verder naar voren of naar achteren in het alfabet staat.Dat aantal posities is de kliefdeBijvoorbeeld, met toets 3 wordt A D, B wordt E, C wordt F enzovoort tot Z, waarna het alfabet 'omdraait' en opnieuw begint met A.

Deze regeling behoort tot de monoalfabetische substitutiecijfersWanneer dezelfde letter in de platte tekst voorkomt, wordt deze omgezet naar dezelfde gecodeerde letter. Dit maakt het heel gemakkelijk te begrijpen en te implementeren, maar ook heel gemakkelijk te kraken met een beetje analyse.

Verschoven alfabet in Caesarcijfer

Wiskundige grondslagen van het Caesarcijfer

Achter deze klassieke methode schuilt een zeer compacte wiskundige formulering. We hebben elke letter genummerd van 0 tot n-1 (waarbij n de grootte van het alfabet is), kunnen we de code als volgt uitdrukken:

C = (P + k) mod n

waarin P is de positie van de originele brief, C is de positie van de gecodeerde letter, k is de sleutel tot verplaatsing en n is het totale aantal Symbolen van het alfabet (26 in het Engelse alfabet zonder ñ). De operator mod Hiermee wordt ervoor gezorgd dat, zodra het alfabet is afgelopen, de telling weer vanaf het begin begint.

Om het bericht op te halen, hoeft u alleen maar: de bewerking omkeren:

P = (C − k) mod n

In de praktijk werken we bij de implementatie in C niet met abstracte posities, maar met numerieke codes (ASCII of UTF-8 compatibel)De hoofdletters A tot en met Z beslaan de waarden 65 tot en met 90, en de kleine letters aa tot en met z variëren van 97 tot en met 122. Door gebruik te maken van deze bereiken kunnen we de basiscode ('A' of 'a') aftrekken, de verschuiving modulo 26 toepassen en de basis weer optellen.

Een belangrijk detail: De modulaire werking garandeert het ‘cirkelvormige effect’ van het alfabetAls u Z drie posities opschuift met toets 3 in het hoofdletterbereik, komt u uit op een C, omdat de berekening wordt uitgevoerd binnen het bereik van 0-25 en vervolgens weer wordt omgezet naar ASCII-code.

Basisbegrippen van cryptografie die u nodig hebt

Door met de Caesar-cijfer te werken, kunt u verschillende klassieke cryptografische concepten zonder dat we ons nog op geavanceerde wiskunde of moderne algoritmes hebben gericht.

  Fout Oplossing Deze app werkt niet op uw apparaat

We noemen het originele ongecodeerde bericht vliegtuig tekstDit is wat u wilt communiceren: bijvoorbeeld "Tot ziens" of een complete zin. Het resultaat na het toepassen van encryptie is de cijfertekst o cryptogram, dat eruitziet als een reeks betekenisloze letters, zoals "Dglrv".

Het proces van het omzetten van platte tekst naar cijfertekst wordt genoemd encryptie, terwijl de inverse bewerking wordt genoemd decoderingIn beide gevallen is een kliefdewat in de Caesar-cijfer gewoon een geheel getal is tussen 1 en 26 (of tussen 0 en 25, afhankelijk van hoe u het in het programma definieert), en de toepassing ervan in diensten zoals Gmail.

Een interessant punt is dat, hoewel het resultaat veilig kan lijken voor een gebruiker zonder kennis, De werkelijke veiligheid van het Caesarcijfer is praktisch nul.Er zijn slechts 25 mogelijke sleutels in het standaard Latijnse alfabet, dus een aanvaller kan ze allemaal binnen milliseconden uitproberen met een brute-force-programma.

Voorbeeld van Caesar-versleuteling en -ontsleuteling

ASCII, rangtelwoorden en conversie tussen letters en cijfers

Om dit systeem in C te implementeren, moet je het goed begrijpen hoe computers karakters weergevenHistorisch gezien werd voornamelijk ASCII gebruikt, waarbij aan elk symbool een geheel getal tussen 0 en 127 wordt toegewezen. In de praktijk worden echter meestal de afdrukbare bereiken van 32 tot 126 gebruikt.

Zoals we al hebben opgemerkt, De hoofdletters AZ hebben codes van 65 tot 90En de kleine letters az van 97 tot 122De cijfers 0-9 lopen van 48 tot en met 57. Tegenwoordig werken we meestal met UTF-8, maar voor basistekens worden dezelfde waarden aangehouden als voor ASCII. Onze code is dus nog steeds geldig.

De gebruikelijke truc is om een letter omzetten in zijn numerieke codedat getal manipuleren met optel-, aftrek- en modulo-bewerkingen en het vervolgens terug converteren naar een teken. Python Dit gebeurt met de functies ord () y chr (); in C bestaan ​​ze niet als zodanig, maar Het char-type zelf kan worden behandeld als een geheel getalen tekenconstanten zoals 'A' of 'a' fungeren als numerieke waarden.

Om bijvoorbeeld de letter 'A' drie posities naar voren te verplaatsen in C, kunt u het volgende doen: 'A' heeft code 65, je telt er 3 bij op en je krijgt 68, wat overeenkomt met 'D'Wanneer u met hoofdletters werkt, trekt u eerst 'A' af om het bereik te normaliseren naar 0-25. Vervolgens past u de offset modulo 26 toe en telt u vervolgens 'A' weer op om de juiste code te krijgen.

Algemeen ontwerp van een C-programma voor Caesar-cijfer

Een C-programma dat Caesar-encryptie en -decryptie implementeert, volgt meestal altijd een zeer vergelijkbare structuurhoewel de details kunnen veranderen afhankelijk van de stijl van de auteur:

  • Verzoek om tekst van de gebruiker: er wordt een tekenreeks opgevraagd die het te versleutelen of ontsleutelen bericht zal zijn.
  • Het lezen van de numerieke toets: de gebruiker voert de offset in, meestal een geheel getal tussen 1 en 26.
  • Modusselectie: versleutelen, ontsleutelen of zelfs brute force gebruiken als je dat extraatje wilt toevoegen.
  • Hoofdvertaalfunctie: ontvangt het bericht, de sleutel en de modus, doorloopt de string en genereert het verwerkte resultaat.
  • SchermuitvoerHet herstelde cryptogram of de platte tekst wordt afgedrukt.

De kern van het algoritme is altijd hetzelfde: Doorloop de tekenreeks teken voor teken.Controleer of elk symbool een letter is en pas zo ja de juiste transformatie toe, waarbij rekening wordt gehouden met hoofdletters en kleine letters. Alles wat geen letter is (spaties, leestekens, cijfers, enz.) blijft meestal zoals het is.

C-code voor Caesarcijfer

Standaard C-functies gebruiken om met tekens te werken

Om de code overzichtelijker en robuuster te maken, is het sterk aan te raden om gebruik te maken van de header. , die verschillende zeer nuttige functies biedt voor het classificeren van karakters.

  Wat is de nieuwe Google-app voor Windows: functies, snelkoppelingen en beschikbaarheid?

Functies clave:

Wat het Caesarcijfer betreft, bent u vooral geïnteresseerd in:

  • isalfa(c): retourneert een waarde die niet nul is als c een letter is (hoofdletter of kleine letter), en anders nul.
  • isupper(c): controleert of c een hoofdletter is.
  • islager(c): controleert of c een kleine letter is.

Con estas funciones puedes eenvoudig filteren welke tekens verwerkt zullen wordenAls isalpha(c) onwaar is, kopieer je het symbool gewoon naar het resultaat en ga je verder met de volgende. Als het een letter is, bepaal je het juiste bereik (AZ of az) op basis van isupper of islower en pas je de verschuiving toe zonder bang te zijn dat je buiten het corresponderende alfabet komt.

Tegelijkertijd heb je de header nodig voor functies zoals strlen()waarmee u de lengte van de string kunt weten en deze in een lus kunt gebruiken besteld, o en door over het bericht te itereren.

Voorbeeld van een eenvoudige Caesar-cijferimplementatie in C

Een veelvoorkomende versie van het C-programma definieert een functie, die we bijvoorbeeld kunnen aanroepen ophouden(), belast met transformeer de ontvangen string ter plekke of om een ​​gecodeerde kopie te genereren vanuit een invoerbuffer.

Typische stroming:

  • En hoofd()De gebruiker wordt gevraagd om de tekst te verwerken.
  • De verplaatsingssleutel wordt aangevraagd en gevalideerd om er zeker van te zijn dat deze binnen het toegestane bereik valt.
  • De encryptiefunctie wordt aangeroepen door de tekst en de sleutel door te geven.
  • Het resultaat wordt op het scherm weergegeven.

Interne structuur:

  • Bereken de lengte van de tekst met behulp van strlen() om de luslimieten in te stellen.
  • Doorloop de tekenreeks teken voor teken met behulp van een geheel getalindex.
  • Controleer of elk teken een hoofdletter, een kleine letter of geen alfabet is.
  • Pas de verplaatsing toe met de juiste formule en de %-operator 26.
  • Laat niet-alfabetische tekens ongewijzigd.

Het gebruik door de operator 26% is essentieel voor het resultaat blijf binnen het alfabetAls je dus de z met toets 3 verschuift, krijg je c in plaats van een vreemd ASCII-codesymbool.

Stringmanipulatie in C: scanf, fgets en buffers

Een van de lastigste aspecten van het schrijven van deze programma's in C is niet de encryptie zelf, maar de manier om de string van de standaardinvoer te lezenHoewel `scanf` met "%s" verleidelijk lijkt, heeft het een aantal problemen: het breekt het lezen af ​​bij de eerste spatie, het controleert de buffergrootte niet goed en er kunnen gemakkelijk overflows ontstaan ​​als je niet voorzichtig bent.

Daarom kiezen veel moderne voorbeelden ervoor om fgets() om hele regels te lezen. Deze functie ontvangt de buffer, de maximale grootte en de invoerbron (meestal stdin) en zorgt ervoor dat de limieten niet worden overschreden. Het nadeel is dat Meestal wordt de regelafbreking aan het einde van de string geplaatstDaarom is het doorgaans een goed idee om het handmatig op te schonen door de tekenreeks te doorlopen en '\n' te vervangen door '\0' wanneer deze voorkomt.

In ieder geval is het encryptiealgoritme onafhankelijk van hoe u de string hebt verkregen: Je kunt Caesars logica inkapselen in een functie die een vooraf voorbereide char[] ontvangt, en beslis vervolgens of u de array wilt vullen met fgets, scanf of een andere methode, afhankelijk van uw behoeften.

Volledige implementatie van het Caesar-cijfer in C

Structuur van een compleet interactief programma

Naast de basis-encryptiefunctie kan men een redelijk uitgebreid interactief programma waarmee de gebruiker kan kiezen of hij wil versleutelen, ontsleutelen of zelfs alle mogelijke sleutels wil uitproberen (brute force-modus).

Een zeer heldere organisatie bestaat uit het scheiden van de logica in verschillende functies:

  • getMode(): vraagt ​​de gebruiker of hij wil versleutelen, ontsleutelen of brute force wil gebruiken en retourneert een teken of korte tekenreeks die de gekozen modus vertegenwoordigt.
  • getMessage(): is verantwoordelijk voor het aanvragen van de te verwerken tekst en het retourneren ervan.
  • getKey(): vraagt ​​een sleutel op bij de gebruiker, dwingt de gebruiker een waarde tussen 1 en een maximum (bijvoorbeeld 26) in te voeren en retourneert dat gehele getal.
  • getTranslatedMessage(modus, bericht, sleutel): past de logica voor encryptie of decryptie toe op basis van de modus en retourneert de getransformeerde tekst.
  Leer hoe u het informatiegebruik op een Android-telefoon kunt controleren

In de gedecodeerde modus is het erg handig werken met dezelfde functie als voor encryptieMaar het teken van de sleutel wordt gewijzigd. Dat wil zeggen, als de gebruiker ervoor kiest om te decoderen, wordt de sleutel vermenigvuldigd met -1 en wordt hetzelfde algoritme toegepast dat voor de encryptie is gebruikt. Zo voorkom je dat code wordt gedupliceerd.

De brute force-modus voegt een opmerkelijke nieuwsgierigheid toe: automatiseert het proces van het testen van alle mogelijke sleutelsHet programma loopt van 1 tot de maximale sleutellengte, waarbij de vertaalfunctie bij elke iteratie in de decryptiemodus wordt aangeroepen en elk resultaat samen met de gebruikte sleutel wordt weergegeven. De gebruiker hoeft alleen maar te kijken welke regels in het Spaans logisch zijn om af te leiden welke shift oorspronkelijk is gebruikt.

#erbij betrekken // Voor printf en scanf #include // Voor strlen // Functie die de Caesar-cijfer toepast void caesar_cipher(char *text, int shift) { for (int i = 0; i < strlen(text); i++) { char c = text[i]; // huidig ​​teken // Als het een hoofdletter is if (c >= 'A' && c <= 'Z') { text[i] = ((c - 'A' + shift) % 26) + 'A'; } // Als het een kleine letter is else if (c >= 'a' && c <= 'z') { text[i] = ((c - 'a' + shift) % 26) + 'a'; } // Als het geen letter is, laat het dan zoals het is } } int main() { char message[100]; // buffer voor de tekst int shift; // waarde van de shift printf("Voer het te versleutelen bericht in: "); scanf("%99[^\n]", message); // Leest maximaal 99 tekens inclusief spaties printf("Voer de offset in (bijv. 3): "); scanf("%d", &offset); // Pas de versleuteling toe caesar_cipher(message, offset); printf("Versleuteld bericht: %s\n", message); return 0; }

Omgaan met hoofdletters, kleine letters en speciale tekens

Iets wat vaak in het begin over het hoofd wordt gezien, is het belang van Respecteer de vorm van de letters en vernietig de tekst nietEen goed Caesarcijferprogramma behandelt hoofdletters en kleine letters apart en laat symbolen die niet tot het alfabet behoren intact.

Typische logica is:

  • Als het symbool de controle niet doorstaat isalpha ()Het wordt direct en zonder enige wijziging naar het resultaat gekopieerd.
  • Als het een hoofdletter is, normaliseert de waarde door 'A' af te trekkenDe verplaatsing wordt modulo 26 toegepast en vervolgens wordt 'A' opnieuw toegevoegd.
  • Als het een kleine letter betreft, wordt hetzelfde gedaan, maar dan met het bereik op basis van 'a'.
  • Als u bij het optellen van de sleutel boven het bereik uitkomt (voorbij 'Z' of 'z'), trekt u 26 af. Als u bij het aftrekken onder het bereik uitkomt, telt u 26 op.

Zo kun je teksten als "Tot ziens" met toets 3 tot een "Dglrv" met respect voor de beginhoofdletter en de rest in kleine letters, en dat je bij het ontcijferen precies terugkomt bij het origineel.

Het is ook belangrijk om te weten dat Het Caesarcijfer verandert geen spaties of leestekensHierdoor blijft de visuele structuur van zinnen en alinea's behouden, maar blijven de berichtlengte en de relatieve positie van woorden zichtbaar voor een aanvaller.

veiligere encryptie- en hashing-algoritmen
Gerelateerd artikel:
Veiligere encryptie- en hashing-algoritmen: een complete gids