Hur man skapar en Caesar-chiffer och dekrypterare i C

Senaste uppdateringen: 04/12/2025
Författare: Isaac
  • Caesarchiffern ersätter varje bokstav med en annan som förskjutits ett fast antal positioner, definierade av en nyckel.
  • I C implementeras det genom att konvertera bokstäver till numeriska koder, tillämpa summor och modulo 26 och respektera stora och små bokstäver.
  • Funktioner som isalpha, isupper, islower, strlen och en modulär design underlättar ett interaktivt program för kryptering, dekryptering och brute-forcing.
  • Det är en historiskt relevant men kryptografiskt svag algoritm, idealisk som en pedagogisk och inlärningsövning. programmering.

Caesar-chifferprogram i C

Om du börjar med C och vill ha ett praktiskt projekt, Skapa ett program för kryptering och dekryptering med hjälp av Caesarchiffer. Det är ett perfekt alternativ. Det är enkelt, det tvingar dig att manipulera strängar, arbeta med tecken och tänka i matematiska termer, men utan att göra dig galen med komplexitet.

Förutom att fungera som en programmeringsövning, Caesar-chiffern är en utmärkt ingång till kryptografins världDu kommer att förstå vad en nyckel är, varför vissa system är svaga och hur man attackerar kryptering med brute force. Vi tittar på det steg för steg, med teori, exempel och flera implementeringsmetoder i C.

Vad är Caesar-chiffern och var kommer den ifrån?

Samtalet Caesar chifferSkiftchiffern, eller skiftchiffern, är ett av de äldsta kryptografiska systemen som finns. Dess namn kommer från Julius Caesar, som han sägs ha använt för att befalla kamouflerade militära meddelanden till sina generaler, så att om någon avlyssnade texten kunde de inte förstå den vid första anblicken.

Idén är väldigt enkel: Varje bokstav i det ursprungliga meddelandet ersätts av en annan som är ett fast antal positioner längre fram eller bak i alfabetet.Det antalet positioner är klöv sönderTill exempel, med tangent 3 blir A D, B blir E, C blir F och så vidare tills Z, där alfabetet "vänder" och börjar om med A.

Detta system tillhör monoalfabetiska substitutionschifferNärhelst samma bokstav förekommer i klartexten omvandlas den till samma krypterade bokstav. Detta gör den mycket enkel att förstå och implementera, men också mycket lätt att bryta med lite analys.

Skiftat alfabet i Caesar-chiffer

Matematiska grunder för Caesar-chiffern

Bakom denna klassiska metod ligger en mycket kompakt matematisk formulering. Vi numrerade varje bokstav från 0 till n-1 (där n är alfabetets storlek), kan vi uttrycka chiffern som:

C = (P + k) mod n

var P är originalbrevets position, C är positionen för den krypterade bokstaven, k är nyckeln till förflyttning och n är det totala antalet symboler i alfabetet (26 i det engelska alfabetet utan ñ). Operatorn mod Det säkerställer att räkningen börjar om från början när alfabetet når slutet.

För att hämta meddelandet, helt enkelt omvänd operationen:

P = (C − k) mod n

I praktiken, när vi implementerar det i C, arbetar vi inte med abstrakta positioner, utan med teckennumeriska koder (ASCII- eller UTF-8-kompatibla)Stora bokstäver A till Ö upptar värdena 65 till 90, och små bokstäver aa till z sträcker sig från 97 till 122. Genom att utnyttja dessa intervall kan vi subtrahera baskoden ('A' eller 'a'), tillämpa skiftet med modulo 26 och lägga tillbaka basen.

En viktig detalj: Den modulära funktionen garanterar alfabetets "cirkulära effekt"Om du flyttar Z tre positioner med tangent 3 i versalområdet får du C, eftersom beräkningen görs inom intervallet 0-25 och sedan konverteras tillbaka till ASCII-kod.

Grundläggande kryptografikoncept du behöver

Att arbeta med Caesar-chiffern låter dig internalisera flera klassiska kryptografikoncept utan att ännu fördjupa sig i avancerad matematik eller moderna algoritmer.

  Omfattande tips för rengöring och skötsel av din musmatta: Komplett guide för varje materialtyp

Vi kallar det ursprungliga okrypterade meddelandet plantextDet här är vad du vill kommunicera: till exempel "Hej då" eller en fullständig fras. Resultatet efter att ha tillämpat kryptering är chiffertext o kryptogram, vilket ser ut som en rad meningslösa bokstäver, som "Dglrv".

Processen att omvandla klartext till chiffertext kallas kryptering, medan den inversa operationen kallas dekrypteringI båda fallen, en klöv söndervilket i Caesar-chiffern helt enkelt är ett heltal mellan 1 och 26 (eller mellan 0 och 25, beroende på hur man definierar det i programmet), och dess tillämpning i tjänster som gmail.

En intressant poäng är att även om resultatet kan verka säkert för en användare utan kunskap, Den faktiska säkerheten för Caesar-chiffern är praktiskt taget noll.Det finns bara 25 möjliga nycklar i det latinska alfabetet, så en angripare kan prova dem alla på millisekunder med ett brute-force-program.

Exempel på Caesar-kryptering och dekryptering

ASCII, ordinaler och konvertering mellan bokstäver och siffror

För att implementera detta system i C behöver du ha god förståelse för hur datorer representerar teckenHistoriskt sett användes huvudsakligen ASCII, vilket tilldelar ett heltal mellan 0 och 127 till varje symbol, även om i praktiken används de utskrivbara intervallen från 32 till 126 mestadels.

Som vi redan har kommenterat, Stora bokstäver AZ har koder från 65 till 90Och de små bokstäverna az från 97 till 122Siffrorna 0-9 sträcker sig från 48 till 57. Numera är det vanligt att arbeta med UTF-8, men för enkla tecken bibehåller den samma värden som ASCII, så vår kod kommer fortfarande att vara giltig.

Det vanliga knepet är att konvertera en bokstav till dess numeriska kodmanipulera talet med addition, subtraktion och modulooperationer, och sedan konvertera det tillbaka till ett tecken. Python Detta görs med funktionerna ord () y chr(); i C existerar de inte som sådana, men Själva teckentypen kan behandlas som ett heltal, och teckenkonstanter som 'A' eller 'a' fungerar som numeriska värden.

Till exempel, för att flytta bokstaven 'A' tre positioner framåt i C, kan du tänka så här: 'A' har kod 65, du lägger till 3 och du får 68, vilket motsvarar 'D'När du arbetar med versaler, subtrahera först 'A' för att normalisera intervallet till 0-25, använd offset modulo 26 och lägg sedan till 'A' igen för att återställa rätt kod.

Allmän design av ett C-program för Caesar-chiffer

Ett C-program som implementerar Caesar-kryptering och dekryptering följer vanligtvis alltid en mycket likartad strukturäven om detaljerna kan ändras beroende på författarens stil:

  • Begäran om text från användarenen sträng begärs som är meddelandet som ska krypteras eller dekrypteras.
  • Läsa den numeriska tangentenAnvändaren anger offseten, vanligtvis ett heltal mellan 1 och 26.
  • Lägesval: kryptera, dekryptera eller till och med brute force om du vill lägga till det extra.
  • Huvudöversättningsfunktiontar emot meddelandet, nyckeln och läget, går igenom strängen och genererar det bearbetade resultatet.
  • SkärmutgångDet återställda kryptogrammet eller klartexten skrivs ut.

Kärnan i algoritmen är alltid densamma: gå igenom strängen tecken för tecken.Kontrollera om varje symbol är en bokstav och, om så är fallet, använd lämplig omvandling, med hänsyn till både stora och små bokstäver. Allt som inte är en bokstav (mellanslag, skiljetecken, siffror etc.) lämnas vanligtvis som det är.

C-kod för Caesar-chiffer

Använda standard C-funktioner för att arbeta med tecken

För att göra koden renare och mer robust rekommenderas det starkt att förlita sig på headern. , som erbjuder flera mycket användbara funktioner för att klassificera tecken.

  Stoppa Safari från att packa upp nedladdad information på Mac

Funciones klav:

Specifikt, för Caesar-chiffern, kommer du att vara särskilt intresserad av:

  • isalfa(c)returnerar ett värde som inte är noll om c är en bokstav (stor eller liten bokstav), och noll annars.
  • isupper(c): kontrollerar om c är en stor bokstav.
  • är lägre (c): kontrollerar om c är en liten bokstav.

Med dessa funktioner kan enkelt filtrera vilka tecken som ska bearbetasOm isalpha(c) är falskt kopierar du helt enkelt symbolen till resultatet och går vidare till nästa. Om det är en bokstav bestämmer du lämpligt intervall (AZ eller az) enligt isupper eller islower och tillämpar skiftet utan att vara rädd för att gå utanför motsvarande alfabet.

Parallellt behöver du rubriken för funktioner som strlen()vilket låter dig veta strängens längd och använda den i en loop för o medan genom att iterera över meddelandet.

Exempel på en grundläggande Caesar-chifferimplementering i C

En mycket vanlig version av C-programmet definierar en funktion, som vi till exempel skulle kunna anropa upphöra(), ansvarig för transformera den mottagna strängen på plats eller för att generera en krypterad kopia från en indatabuffert.

Typiskt flöde:

  • En main ()Användaren ombeds att bearbeta texten.
  • Förskjutningsnyckeln begärs och den valideras för att säkerställa att den ligger inom det tillåtna intervallet.
  • Krypteringsfunktionen anropas genom att texten och nyckeln skickas.
  • Resultatet visas på skärmen.

Intern struktur:

  • Beräkna textens längd med hjälp av strlen() för att ställa in loopgränserna.
  • Gå igenom strängen tecken för tecken med hjälp av ett heltalsindex.
  • Kontrollera om varje tecken är en stor bokstav, en liten bokstav eller inte är alfabetiskt.
  • Tillämpa förskjutningen med lämplig formel och %-operatorn 26.
  • Lämna icke-alfabetiska tecken oförändrade.

Operatörens användning % 26 är avgörande för resultatet håll dig inom alfabetetSåledes, om du flyttar z-tangenten med tangent 3, får du c istället för en konstig ASCII-kodsymbol.

Strängmanipulation i C: scanf, fgets och buffertar

En av de knepigaste aspekterna av att skriva dessa program i C är inte själva krypteringen, utan sättet att läsa strängen från standardinmatningenÄven om `scanf` med "%s" verkar lockande, har det flera problem: det avbryter läsningen vid första mellanslaget, det kontrollerar inte buffertstorleken väl, och det är lätt att orsaka överflöden om man inte är försiktig.

Det är därför många moderna exempel väljer att använda fgets() att läsa hela rader. Denna funktion tar emot bufferten, dess maximala storlek och inmatningskällan (vanligtvis stdin) och säkerställer att gränserna inte överskrids. Avvägningen är att Den lämnar vanligtvis radbrytningen i slutet av strängenSå det är oftast en bra idé att rensa den manuellt genom att gå igenom strängen och ersätta '\n' med '\0' när den visas.

I vilket fall som helst är krypteringsalgoritmen oberoende av hur du erhöll strängen: Du kan inkapsla Caesars logik i en funktion som tar emot en förberedd char[], och bestäm sedan i main om du vill fylla den arrayen med fgets, scanf eller någon annan metod enligt dina behov.

Fullständig implementering av Caesar-chiffer i C

Strukturen för ett komplett interaktivt program

Utöver den grundläggande krypteringsfunktionen kan man bygga en ganska omfattande interaktivt program som låter användaren välja om man vill kryptera, dekryptera eller till och med prova alla möjliga nycklar (brute-force-läge).

En mycket tydlig organisation består av att separera logiken i flera funktioner:

  • getMode()frågar användaren om de vill kryptera, dekryptera eller använda brute force och returnerar ett tecken eller en kort sträng som representerar det valda läget.
  • getMessage(): ansvarar för att begära att texten ska bearbetas och returnera den.
  • getKey()begär en nyckel från användaren, tvingar användaren att ange ett värde mellan 1 och ett maximalt värde (till exempel 26) och returnerar det heltalet.
  • getTranslatedMessage(läge, meddelande, nyckel): tillämpar krypterings- eller dekrypteringslogiken enligt läget och returnerar den transformerade texten.
  Hur man reparerar en skadad papperskorg

I dekrypterat läge är det väldigt bekvämt fungera med samma funktion som för krypteringMen nyckelns tecken ändras. Det vill säga, om användaren väljer att dekryptera multipliceras nyckeln med -1 och samma algoritm som används för kryptering tillämpas. På så sätt undviker man att duplicera kod.

Brute force-läget tillför en anmärkningsvärd kuriositet: automatiserar processen att testa alla möjliga nycklarProgrammet loopar från 1 till den maximala nyckelstorleken, anropar översättningsfunktionen i dekrypteringsläge vid varje iteration och visar varje resultat tillsammans med den använda nyckeln. Användaren behöver helt enkelt observera vilka rader som är begripliga på spanska för att härleda vilken shift som ursprungligen användes.

#omfatta // För printf och scanf #include // För strlen // Funktion som tillämpar Caesar-chiffern void caesar_cipher(char *text, int shift) { for (int i = 0; i < strlen(text); i++) { char c = text[i]; // aktuellt tecken // Om det är en stor bokstav if (c >= 'A' && c <= 'Z') { text[i] = ((c - 'A' + shift) % 26) + 'A'; } // Om det är en liten bokstav annars if (c >= 'a' && c <= 'z') { text[i] = ((c - 'a' + shift) % 26) + 'a'; } // Om det inte är en bokstav, lämna den som den är } } int main() { char message[100]; // buffert för texten int shift; // värde för shift printf("Ange meddelandet som ska krypteras: "); scanf("%99[^\n]", message); // Läser upp till 99 tecken inklusive mellanslag printf("Ange offset (t.ex. 3): "); scanf("%d", &offset); // Använd krypteringen caesar_cipher(message, offset); printf("Krypterat meddelande: %s\n", message); return 0; }

Hantera stora bokstäver, små bokstäver och specialtecken

Något som ofta förbises i början är vikten av Respektera bokstävernas form och förstör inte textenEtt bra Caesar-chiffreringsprogram bör behandla stora och små bokstäver separat och lämna intakta symboler som inte hör till alfabetet.

Typisk logik är:

  • Om symbolen inte klarar kontrollen isalpha ()Den kopieras direkt till resultatet utan några ändringar.
  • Om det är en stor bokstav, så normaliserar värdet genom att subtrahera 'A'Förskjutningen tillämpas i modulo 26 och sedan läggs 'A' till igen.
  • Om det är en liten bokstav görs samma sak men med intervallet baserat på 'a'.
  • Om du går över intervallet (bortom 'Z' eller 'z') när du adderar nyckeln, subtrahera 26; om du går under när du subtraherar, lägg till 26.

På så sätt kan du göra texter som "Hejdå" med tangent 3 till "Dglrv" med avseende på den första versalen och resten med gemener, och att man vid dechiffreringen återgår exakt till originalet.

Det är också viktigt att vara medveten om att Caesar-chiffern ändrar inte mellanslag eller skiljeteckenDetta gör att den visuella strukturen i meningar och stycken bibehålls, men gör att meddelandets längd och relativa position för ord fortfarande är synliga för en angripare.

säkrare krypterings- och hashalgoritmer
Relaterad artikel:
Säkrare krypterings- och hashalgoritmer: en komplett guide