Enrere Mòdul 6
Fonaments de programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 

Introducció a la Criptologia. El mètode de substitució de Juli Cèsar

En aquesta pràctica aprendrem una aplicació clàssica i senzilla de la manipulació de cadenes de caràcters.

 

Desenvolupament de la pràctica

Potser, el primer dels sistemes d'encriptació de missatges va tenir el seu origen en els temps de Juli Cèsar quan l'escriptura del llatí va començar a ser popular. Aquest sistema consistia simplement en substituir una lletra per la situada tres llocs a la dreta, suposat l'alfabet ordenat en el seu ordre natural. Per exemple, la lletra A es transforma en D, la B en E. En aquest mètode podem imaginar que darrera de la Z es troba l'A, per tant, la Y es transforma en B i la Z en C. 

Generalitzant, s'anomena mètode de Juli Cèsar al mètode d'encriptació que consisteix en substituir una lletra per la situada n llocs a la dreta, suposat l'alfabet ordenat en el seu ordre natural.

Podem, per simplificar, pensar en l'alfabet anglès de 26 caràcters, i només les lletres minúscules. Els codis ASCII d'aquests 26 símbols són els que van del 97 al 122. 

L'algorisme per substituir una lletra per una altra és: 

c Þ (c–97+n)%26+97

on c és el codi ASCII del caràcter a substituir.

Farem un programa que permeti encriptar i desencriptar missatges, de fet, si un missatge s'ha encriptat usant el codi n, el codi 26-n permetrà desencriptar-lo amb el mateix algorisme.

Definiu un projecte nou anomenat m6p03 i afegiu-li un arxiu de font C/C++ anomenat m6p03.cpp. Escriviu el següent codi:

//m6p03.cpp.   mètode Juli Cèsar

#include <stdio.h>
#include <ctype.h>

char *cesar(char *missatge, int n);

void main(){
    char missatge[100];
    int codi;

    printf("introduïu el missatge...\n");
    gets(missatge);

    printf("\n\nintroduïu el codi (0-25)...\n");
    scanf("%d", &codi);

    printf("\nel missatge modificat és..:\n%s\n\n",
         cesar(missatge,codi));
}


char *cesar(char*missatge, int n){
    int i=0;

    while(missatge[i]){

        if (missatge[i]!=' ')

            missatge[i]=(tolower(missatge[i])-97+n)%26+97;
        i++;
    }
    return missatge;
}

Explicació del programa

En aquesta pràctica, la introducció de la cadena pel teclat es fa amb la funció gets(). Aquesta és la forma habitual d'introduir cadenes de caràcters que no continguin caràcters de nova línia. 

La funció cesar() rep com argument un punter a la cadena missatge i un enter que correspon al codi fet servir per a l'encriptació (o desencriptació) del missatge. 

Aquesta funció es basa en el següent bucle:

 
    while(missatge[i]){
        if (missatge[i]!=' ')

            missatge[i]=(tolower(missatge[i])-97+n)%26+97;
        i++;
    }

La condició de la sentència while és una condició típica de C (és a dir, que no sembla una condició). Aquesta condició és un caràcter de la cadena, serà vertadera fins que es trobi el caràcter fi de cadena ('\0'), moment en què sortirà del bucle.

Per cada caràcter de la cadena es comprova si és l'espai en blanc. Aquest caràcter no és modifica, els altres sí. La funció tolower() fa que tots els caràcters de la cadena es converteixin en lletres minúscules.

El cos del bucle és la transformació abans esmentada. Recordeu que l'operador % és la resta de la divisió entera, per tant, l'expressió:(missatge[i]-97+n)%26+97; donarà un enter entre 97 i 97+25.