2025(e)ko martxoaren 21(a), ostirala

Ariketa 49 | Zesar zifratze-sistema

ZER DAKIDAN:
Karaktere-kate bat teklatuz irakurtzen dakit.



ZER IKASIKO DUDAN:
Karaktere-kate baten char datu-motako elementuak banan-banan prozesatuko ditut. Enkriptazio algoritmo bat aplikatuko dut hasierako mezua ezkutatzeko.


Kriptografian, Zesarren zifratze-sistema (edo Zesar zifratzea) mezuak enkriptatzeko teknikarik zaharrenetarikoa da, baita erabilienetako bat ere. Ordezkatze-metodo bat da, non hasierako mezuaren letra bakoitza beste letra batengatik ordezkatzen den: Alfabetoan 3 posizio aurrerago dagoen letrarengatik. Horrela, A letra D letra bihurtuko litzateke, B-a E etab. Metodo honek Julio Zesar ospetsuaren ohorean dauka izena, zeinek bere jeneralekin komunikatzeko erabiltzen zuen.




Eskatzen den programaren zifratze-sistemak ASCII taularen ondoko karaktereak onartuko ditu:

  • A-tik Z-ra bitarteko letra larriak
  • a-tik z-ra bitarteko letra xeheak
  • 0-tik 9-ra bitarteko zifrak
  • ASCCI taulan jarraian dauden bost karaktere hauek:   *     +     ,     -     .

Koloretako laukietan dauden karaktereak mezuan agertzen badira zifratuko dira,
mezuaren bestelako karaktereak ez dira zifratuko.


Programaren lehen bertsio honek Zesar zifratzea delako enkriptazio teknika erakusten du, emaitza pantailaratzen du baina ez du aldagai berria sortzen emaitza gordetzeko:

/* Ariketa-49a_ZesarZifratzea: mezuak enkriptatzeko teknika */

// Zesar zifratze-teknikan letra bakoitzaren desplazamendua 3 da. Baina
// programa honek desplazamenduaren neurria hautatzeko aukera ematen du.

// cKaraktereBatZifratu() funtzioari esker emaitza pantailan
// idazten da baina ez da inon gordetzen.

#include <stdio.h>
#include <string.h>  // strlen() funtzioarako

// karaktere bat zifratzeko funtzioa
char cKaraktereBatZifratu(char cKarak, int iDesplazamendua);


int main()
{
    char sMezua[100]; // 99 karaktere biltegitzeko tokia
    int iDesplazamendua;

    printf("Ezkutatu nahi den mezua sartu (gehienez 99 karaktere): ");
    fgets(sMezua, 100, stdin);
    printf("Sarrerako mezua ezkutatu aurretik: |%s|\n", sMezua);
    printf("Ondorioz, katearen bukaera hau da: \\n\\0 \n");
    sMezua[strlen(sMezua)-1] = '\0';      // INTRO karakterea kentzeko
    printf("Mezu bera INTRO karaktererik gabe: |%s|\n", sMezua);
    
    printf("\nEnkriptatze-gakoa sartu (oso bat): ");
    scanf("%d", &iDesplazamendua);
    if (iDesplazamendua < 0)  // gako negatiboa bada positibo jarri
        iDesplazamendua = iDesplazamendua * (-1);

    printf("Sartutakoaren mezu ezkutua hau da: |");
    for (int iKont = 0; sMezua[iKont] != '\0'; iKont++)
    {
            printf("%c", cKaraktereBatZifratu(sMezua[iKont], iDesplazamendua));
    }
    printf("|\n\n");

    return 0;
}


char cKaraktereBatZifratu(char cKarak, int iDesplazamendua)
{
    if (cKarak >= 'a' && cKarak <= 'z')
    {
        return ((cKarak - 'a' + iDesplazamendua) % 26) + 'a';
        // a-tik abiatu (+) desplazamendua eta 26 letra xehe
    }
    else if (cKarak >= 'A' && cKarak <= 'Z')
    {
        return ((cKarak - 'A' + iDesplazamendua) % 26) + 'A';
        // A-tik abiatu (+) desplazamendua eta 26 letra larri
    }
    else if (cKarak >= '0' && cKarak <= '9')
    {
        return ((cKarak - '0' + iDesplazamendua) % 10) + '0';
        // 0-tik abiatu (+) desplazamendua eta 10 zifra

    }
    else if (cKarak >= '*' && cKarak <= '.')   // *  +  ,  -  .
    {
        return ((cKarak - '*' + iDesplazamendua) % 5) + '*';
        // *-tik abiatu (+) desplazamendua eta 5 karaktere

    }
    return cKarak; // onartzen ez den bestelako karakterea bada aldatu gabe itzuli
}

Programaren bigarren bertsio honek Zesar zifratzea delako enkriptazio teknika erakusten du, emaitza pantailaratzeko lehenik katea den aldagai berri bate elikatzen du:

/* Ariketa-49b_ZesarZifratzea: mezuak enkriptatzeko teknika */

// Zesar zifratze-teknikan letra bakoitzaren desplazamendua 3 da. Baina
// programa honek desplazamenduaren neurria hautatzeko aukera ematen du.

// sMezuaZifratu() funtzioari esker emaitza kate batean gordetzen da.

#include <stdio.h>
#include <string.h>  // strlen() eta strcpy() funtzioetarako

// karaktere-kate osoa zifratzeko funtzioa
void sMezuaZifratu(char sMezua[], int iDesplazamendua, char *sEmaitza);


int main()
{
    char sMezua[100];         // 99 karaktere biltegitzeko tokia
    char sEmaitza[100] = "";  // kate hutsa
    int iDesplazamendua;

    printf("Ezkutatu nahi den mezua sartu (gehienez 99 karaktere): ");
    fgets(sMezua, 100, stdin);
    sMezua[strlen(sMezua)-1] = '\0';      // INTRO karakterea kentzeko

    printf("Enkriptatze-gakoa sartu (kopuru oso bat): ");
    scanf("%d", &iDesplazamendua);
    if (iDesplazamendua < 0)  // gako negatiboa bada positibo jarri
        iDesplazamendua = iDesplazamendua * (-1);

    sMezuaZifratu(sMezua, iDesplazamendua, sEmaitza);
    printf("\nMezua ezkutatu aintzin: |%s|", sMezua);
    printf("\nMezua ezkutatu ondoren: |%s|", sEmaitza);
    printf("\n\n");

    return 0;
}


void sMezuaZifratu(char sMezua[], int iDesplazamendua, char *sEmaitza)
{
    // hasieran sEmaitza kateak sMezua katearen edukia gordetzen du, for aginduan
    // sMezua[iKont] karakterea onartzen den bat ez bada (letra bat, zifra bat edo
    // bost karaktere berezietatik bat  *  +  ,  -  .) sEmaitza kateari dagokion
    // iKont-garren karakterea ez da aldatuko
    strcpy(sEmaitza, sMezua);
    for (int iKont = 0; sMezua[iKont] != '\0'; iKont++)
    {
        if (sMezua[iKont] >= 'a' && sMezua[iKont] <= 'z')
        {
            sEmaitza[iKont] = ((sMezua[iKont] - 'a' + iDesplazamendua) % 26) + 'a';
            // a-tik abiatu (+) desplazamendua eta 26 letra xehe
        }
        else if (sMezua[iKont] >= 'A' && sMezua[iKont] <= 'Z')
        {
            sEmaitza[iKont] = ((sMezua[iKont] - 'A' + iDesplazamendua) % 26) + 'A';
            // A-tik abiatu (+) desplazamendua eta 26 letra larri
        }
        else if (sMezua[iKont] >= '0' && sMezua[iKont] <= '9')
        {
            sEmaitza[iKont] = ((sMezua[iKont] - '0' + iDesplazamendua) % 10) + '0';
            // 0-tik abiatu (+) desplazamendua eta 10 zifra
        }
        else if (sMezua[iKont] >= '*' && sMezua[iKont] <= '.')   // *  +  ,  -  .
        {
            sEmaitza[iKont] = ((sMezua[iKont] - '*' + iDesplazamendua) % 5) + '*';
            // *-tik abiatu (+) desplazamendua eta 5 karaktere
        }
        // onartzen ez den bestelako karakterea bada, sEmaitza aldagaian aldatu gabe utzi
    }
}


Bigarren bertsioko aurreko programan sMezuaZifratu() funtzioa ikusi da, orain bere osagarria garatuko dugu sMezuaDeszifratu() delako funtzio, zeinek enkriptatutako mezu bati dagokion hasierako testua itzultzen duen.

Enkriptatzen: Abiatzeko oinarria A da eta gakoarekin + egitean A-tik Z-ra ibiltzen gara, balioari %26 egitean ziurtatuta dago bi muga horien artean ibiliko garela
Desenkriptatzen: Abiatzeko oinarria Z da eta gakoarekin - egitean Z-tik A-ra ibiltzen gara, balioari %26 egitean ziurtatuta dago bi muga horien artean ibiliko garela
/* Ariketa-49c_ZesarZifratzea: mezuak enkriptatzen eta desenkriptatzen */

// Zesar zifratze-teknikan letra bakoitzaren desplazamendua 3 da. Baina
// programa honek desplazamenduaren neurria hautatzeko aukera ematen du.

// sMezuaZifratu() funtzioari esker emaitza kate batean gordetzen da.
// sMezuaDeszifratu() funtzioak emaitzatik hasierako mezua itzultzen du.


#include <stdio.h>
#include <string.h>  // strlen() eta strcpy() funtzioetarako

// karaktere-kate osoa zifratzeko funtzioa
void sMezuaZifratu(char sMezua[], int iDesplazamendua, char *sEmaitza);
// karaktere-kate osoa deszifratzeko funtzioa
void sMezuaDeszifratu(char sMezua[], int iDesplazamendua, char *sEmaitza);


int main()
{
    char sMezua[100];            // 99 karaktere biltegitzeko tokia
    char sEmaitza[100] = "";     // kate hutsa
    char sHasierakoa[100] = "";  // kate hutsa
    int iDesplazamendua;

    printf("Ezkutatu nahi den mezua sartu (gehienez 99 karaktere): ");
    fgets(sMezua, 100, stdin);
    sMezua[strlen(sMezua)-1] = '\0';      // INTRO karakterea kentzeko

    printf("Enkriptatze-gakoa sartu (kopuru oso bat): ");
    scanf("%d", &iDesplazamendua);
    if (iDesplazamendua < 0)  // gako negatiboa bada positibo jarri
        iDesplazamendua = iDesplazamendua * (-1);

    sMezuaZifratu(sMezua, iDesplazamendua, sEmaitza);
    printf("\nMezua ezkutatu aintzin: |%s|", sMezua);
    printf("\nMezua ezkutatu ondoren: |%s|", sEmaitza);
    sMezuaDeszifratu(sEmaitza, iDesplazamendua, sHasierakoa);
    printf("\nEzkutatua deszifratuta: |%s|", sHasierakoa);
    printf("\n\n");

    return 0;
}


void sMezuaZifratu(char sMezua[], int iDesplazamendua, char *sEmaitza)
{
    // hasieran sEmaitza kateak sMezua katearen edukia gordetzen du, for aginduan
    // sMezua[iKont] karakterea onartzen den bat ez bada (letra bat, zifra bat edo
    // bost karaktere berezietatik bat  *  +  ,  -  .) sEmaitza kateari dagokion
    // iKont-garren karakterea ez da aldatuko
    strcpy(sEmaitza, sMezua);
    for (int iKont = 0; sMezua[iKont] != '\0'; iKont++)
    {
        if (sMezua[iKont] >= 'a' && sMezua[iKont] <= 'z')
        {
            sEmaitza[iKont] = ((sMezua[iKont] - 'a' + iDesplazamendua) % 26) + 'a';
            // a-tik abiatu (+) desplazamendua eta 26 letra xehe
        }
        else if (sMezua[iKont] >= 'A' && sMezua[iKont] <= 'Z')
        {
            sEmaitza[iKont] = ((sMezua[iKont] - 'A' + iDesplazamendua) % 26) + 'A';
            // A-tik abiatu (+) desplazamendua eta 26 letra larri
        }
        else if (sMezua[iKont] >= '0' && sMezua[iKont] <= '9')
        {
            sEmaitza[iKont] = ((sMezua[iKont] - '0' + iDesplazamendua) % 10) + '0';
            // 0-tik abiatu (+) desplazamendua eta 10 zifra
        }
        else if (sMezua[iKont] >= '*' && sMezua[iKont] <= '.')   // *  +  ,  -  .
        {
            sEmaitza[iKont] = ((sMezua[iKont] - '*' + iDesplazamendua) % 5) + '*';
            // *-tik abiatu (+) desplazamendua eta 5 karaktere
        }
        // onartzen ez den bestelako karakterea bada, sEmaitza aldagaian aldatu gabe utzi
    }
}


void sMezuaDeszifratu(char sMezua[], int iDesplazamendua, char *sEmaitza)
{
    // hasieran sEmaitza kateak sMezua katearen edukia gordetzen du, for aginduan
    // sMezua[iKont] karakterea onartzen den bat ez bada (letra bat, zifra bat edo
    // bost karaktere berezietatik bat  *  +  ,  -  .) sEmaitza kateari dagokion
    // iKont-garren karakterea ez da aldatuko
    strcpy(sEmaitza, sMezua);
    for (int iKont = 0; sMezua[iKont] != '\0'; iKont++)
    {
        if (sMezua[iKont] >= 'a' && sMezua[iKont] <= 'z')
        {
            sEmaitza[iKont] = ((sMezua[iKont] - 'z' - iDesplazamendua) % 26) + 'z';
            // z-tik abiatu (-) desplazamendua eta 26 letra xehe
        }
        else if (sMezua[iKont] >= 'A' && sMezua[iKont] <= 'Z')
        {
            sEmaitza[iKont] = ((sMezua[iKont] - 'Z' - iDesplazamendua) % 26) + 'Z';
            // Z-tik abiatu (-) desplazamendua eta 26 letra larri
        }
        else if (sMezua[iKont] >= '0' && sMezua[iKont] <= '9')
        {
            sEmaitza[iKont] = ((sMezua[iKont] - '9' - iDesplazamendua) % 10) + '9';
            // 9-tik abiatu (-) desplazamendua eta 10 zifra
        }
        else if (sMezua[iKont] >= '*' && sMezua[iKont] <= '.')   // *  +  ,  -  .
        {
            sEmaitza[iKont] = ((sMezua[iKont] - '.' - iDesplazamendua) % 5) + '.';
            // .-tik abiatu (-) desplazamendua eta 5 karaktere
        }
        // onartzen ez den bestelako karakterea bada, sEmaitza aldagaian aldatu gabe utzi
    }
}






  • Ariketa-49a_ZesarZifratzea.cbp | main.c  
  • Ariketa-49b_ZesarZifratzea.cbp | main.c  
  • Ariketa-49c_ZesarZifratzea.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina