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

Ariketa 48 | XOR zifratze-teknika

ZER DAKIDAN:
Array datu-mota ezagutzen dut, eta kateak deritzen char datu-motako elementuen arrayak ezagutzen ditut ere.



ZER IKASIKO DUDAN:
Oinarrizko enkriptazio-teknika bat ikasiko dut. Mezu bat xor operadorearen bitartez zifratzen eta deszifratzen ikasiko dut.

Zifratze simetrikoa

Gako kriptografiko bera erabiltzen duen zifratze-mota, hots, mezua zifratzeko eta deszifratzeko gako kriptografiko bera erabiltzen da.

Zifratze simetrikoaren algoritmo-mota desberdinak daude. Guztietan, mezu enkriptatua ikustean, lehen begiratuan, ausazko mezua dela pentsa daiteke, baina erraz deszifratzeko moduko mezua. Horregatik, gaur egun, zifratze simetrikoak gutxi erabiltzen diren metodoak dira komunikazioaren segurtasuna ez delako bermatzen.

Kriptografia zientzian, zifratzea (edo enkriptatzea) informazioa kodetzeko prozesua da

XOR Zifratze simetrikoa

Zifratze simetrikoen artean programatzeko errazena da eta xor (or elkar baztertzailea) operadorean oinarritzen da. Ikus dezagun xor operadorearen egia-taula jakinik bit arteko operadorea dela:

XOR operadorearen egia-taula
Sarrera Sarrera Irteera
0
0
0
0
1
1
1
0
1
1
1
0

xor operadorea adierazteko sinboloa erabiltzen da elektronikan eta ^ sinboloa C lengoaian.

Dakigunez bit batek har ditzaken balioak 0 eta 1 dira eta xorek bi bit alderatzen dituela, emaitza honela lortzen da:

  • Bi bitak berdinak badira, emaitza 0 da.
  • Bi bitak desberdinak badira, emaitza 1 da.

Bitekin ezezik karaktereekin ere lan egin dezake xor operadoreak. Bi karaktereen artean xor operadorea aplikatuz beste karaktere bat lortuko da. Karaktereak bit sortak direlako, bi karaktereen artean xor operadorea aplikatzeko, karaktere bakoitzaren bitak binaka hartuz eta alderatuz lortuko da emaitza. Adibidez, (E karakterea) xor (1 karakterea) egitean emaitza t karakterea da:

      karaktere1    E    10 00101        sinboloak xor operadorea adierazten du
      karaktere2    1    01 10001        eta C lengoaian ^ sinboloz adierazten da
                 ------------------   
      emaitza      E^1   11 10100   (t karakterea) 

Eragigaiak aldatuz bigarren adibide hau ikus dezagun, m karakterearen eta 7 karakterearen arteko xor emaitza Z karakterea da:

      karaktere1    m    11 01101        sinboloak xor operadorea adierazten du
      karaktere2    7    01 10111        eta C lengoaian ^ sinboloz adierazten da
                 ------------------   
      emaitza      m^7   10 11010   (Z karakterea) 

ASCII taula honetan karaktereen bit segidak ikus daitezke:

Taula handiago ikusteko bere gainean klik egin


Programa honek XOR zifratze-teknika delako enkriptazio metodoa erakusten du, mezuaren muga 255 karaktereetan dago eta gako kriptografikoa zifrak izango dira. Programaren hasieran mezua eskatzen da karaktere-kate bat bezala, ondoren gako kriptografikoa eskatzen da (derrigorrez zifrak izango dira), gero mezuaren enkriptazioa burutzen da eta amaieran hasierako mezua berreskuratzen da. Hona hemen programaren kodea:

/* Ariketa-48a_XOR-zifratze-teknika: enkriptazio simetrikoa, karaktere-kateak */

// Enkriptazio Simetrikoa: enkriptazioa eta desenkriptazioa
//                         gako kriptografiko berberarekin.

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

#define MAX 256

int GakoaZifrakDira(char sGakoa[]);

void xor_EnkriptazioDesenkriptazio(const char sGarbia[],
                                   const char sGakoa[],
                                         char sIluna[]);

int main()
{
    char sDatuGarbia[MAX];           // enkriptatu beharreko katea
    char sGakoa[MAX];                // gakoa, zifrak izango dira
    char sDatuIluna[MAX];            // enkriptatzearen emaitza
    char sBerreskuratuta[MAX] = "";  // hasierako datua berreskuratzeko aldagaia

    printf("Enkriptatu beharreko testua eman: ");
    fgets(sDatuGarbia, sizeof(sDatuGarbia), stdin);   // fgets(sDatuGarbia, MAX, stdin);
    sDatuGarbia[strcspn(sDatuGarbia, "\n")] = '\0';   // lerro berria karakterea kendu

    do
    {
        printf("Enkriptazio-gakoaren zifrak eman: ");
        fgets(sGakoa, sizeof(sGakoa), stdin);         // fgets(sGakoa, MAX, stdin);
        sGakoa[strcspn(sGakoa, "\n")] = '\0';         // lerro berria karakterea kendu
    } while (GakoaZifrakDira(sGakoa) == 0);

    // testua enkriptatzen...
    xor_EnkriptazioDesenkriptazio(sDatuGarbia, sGakoa, sDatuIluna);
    printf("\n");
    printf("Testu enkriptatua: \n\t\t|%s|\n", sDatuIluna);

    // testua desenkriptatzen...
    xor_EnkriptazioDesenkriptazio(sDatuIluna, sGakoa, sBerreskuratuta);
    printf("Testu desenkriptatua: \n\t\t|%s|\n", sBerreskuratuta);

    return 0;
}


int GakoaZifrakDira(char sGakoa[])
{
    int iKont;
    int iEmaitza;  // 1 bada, gakoa onargarria da
                   // 0 bada, gakoa ez da zifraz osatzen

    iEmaitza = 1;
    for (iKont = 0; iKont < strlen(sGakoa); iKont++)
    {
        if (sGakoa[iKont] < '0' || sGakoa[iKont] > '9')
            iEmaitza = 0;

    }
    return iEmaitza;
}


// XOR operadorearen bitarteko enkriptatzea/desenkriptatzea
void xor_EnkriptazioDesenkriptazio(const char sGarbia[],
                                   const char sGakoa[],
                                         char sIluna[])
{
    int iDatuLuzera = strlen(sGarbia);
    int iGakoLuzera = strlen(sGakoa);

    for (int iKont = 0; iKont < iDatuLuzera; iKont++)
    {
        sIluna[iKont] = sGarbia[iKont] ^ sGakoa[iKont % iGakoLuzera]; // mezuaren karakterea XOR
    }                                                                 // gakoaren karakterea
}


Zifratze simetriko tekniketan mezua zifratzeko eta deszifratzeko gako kriptografiko bakarra dagoenez, funtzio bakarra ere programatu behar da, xor_EnkriptazioDesenkriptazio() delako funtzioa aztertzen ari garen adibide-programan:

/* Ariketa-48a_XOR-zifratze-teknika proiektuko xor_EnkriptazioDesenkriptazio() funtzioa */

// XOR operadorearen bitarteko enkriptatzea/desenkriptatzea
void xor_EnkriptazioDesenkriptazio(const char sGarbia[],
                                   const char sGakoa[],
                                         char sIluna[])
{
    int iDatuLuzera = strlen(sGarbia);
    int iGakoLuzera = strlen(sGakoa);

    for (int iKont = 0; iKont < iDatuLuzera; iKont++)
    {
        sIluna[iKont] = sGarbia[iKont] ^ sGakoa[iKont % iGakoLuzera]; // mezuaren karakterea XOR
    }                                                                 // gakoaren karakterea
}

Zifratu beharreko mezua sGarbia sarrerako parametroaren bitartez heltzen da funtzioara eta gako kriptografikoa sGako sarrerako parametroaren bitartez; aldiz, irteerakoa den sIluna parametroa funtzioaren emaitza da, hots, bilatzen den mezu zifratua.

Demagun zifratu beharreko mezua «Astigarraga» dela (11 karaktere guztira), eta gakoa «5087» dela (4 karaktere guztira). Honelaxe lan egingo du xor_EnkriptazioDesenkriptazio() funtzioak:

      iKont      sGarbia[]      iKont % iGakoLuzera      sGakoa[]      sIluna[]
      =====      =========      ===================      ========      ========     
        0            A              0 % 4 = 0                5             t
        1            s              1 % 4 = 1                0             C
        2            t              2 % 4 = 2                8             L
        3            i              3 % 4 = 3                7             ^
      -----      ---------      -------------------      --------      --------
        4            g              4 % 4 = 0                5             R
        5            a              5 % 4 = 1                0             Q
        6            r              6 % 4 = 2                8             J
        7            r              7 % 4 = 3                7             E
      -----      ---------      -------------------      --------      --------
        8            a              8 % 4 = 0                5             T
        9            g              9 % 4 = 1                0             W
       10            a             10 % 4 = 2                8             Y

Gakoaren luzera iGakoLuzera=4 da. Mezuaren luzera iDatuLuzera=11 denez, for aginduak 0tik 10 arteko iterazioak emango ditu iKont kontagailuaren kontrolpean. Iterazio bakoitzean bi karaktereen arteko xor operazioa burutzen da, lehen eragigaia iGarbia katearen iKont-garren karakterea izango da eta bigarren eragigaia iGakoa katearen iKont%4 posizioko karakterea izango da (non 4 gakoaren luzera den). Hona hemen programaren irteera bi datu horiekin:



Programa honek, aurrekoak bezala, XOR zifratze-teknika delako enkriptazio metodoa erakusten du, mezuaren muga 255 karaktereetan dago eta gako kriptografikoa zifrak izango dira. Aurreko programaren bezala, bertsio honetan ere, mezua hasieran eskatzen da karaktere-kate bat bezala, ondoren gako kriptografikoa eskatzen da (derrigorrez zifrak izango dira), gero mezuaren enkriptazioa burutzen da eta amaieran hasierako mezua berreskuratzen da.

Bigarren bertsio honek aurrekoarekiko duen aldea xor_EnkriptazioDesenkriptazio() funtzioan datza, zeinek bi parametro behar dituen. Hona hemen funtzio berrituaren kodea:

/* Ariketa-48b_XOR-zifratze-teknika proiektuko xor_EnkriptazioDesenkriptazio() funtzioa */

// xor_EnkriptazioDesenkriptazio() funtzioak 2 parametro behar ditu:
//      1. parametroa: sMezua (sarrerakoa eta irteerakoa)
//      2. parametroa: sGakoa (sarrerakoa)

// XOR operadorearen bitarteko enkriptatzea/desenkriptatzea
void xor_EnkriptazioDesenkriptazio(      char sMezua[],
                                   const char sGakoa[])
{
    int iMezuLuzera = strlen(sMezua);
    int iGakoLuzera = strlen(sGakoa);

    for (int iKont = 0; iKont < iMezuLuzera; iKont++)
    {
        sMezua[iKont] = sMezua[iKont] ^ sGakoa[iKont % iGakoLuzera];  // mezuaren karakterea XOR
    }                                                                 // gakoaren karakterea
}


or elkar baztertzailea esaten zaio xor operadoreari. Horren zergatia ulertzeko gogora dakargun ezaguna den zerbait, or operadorearen egia-taula:

OR operadorearen egia-taula
Sarrera Sarrera Irteera  EDO 
0
0
0
0
1
1
1
0
1
1
1
1

Ikusten den bezala, or operadorearen emaitza egia da edozein eragigai egia denean eta baita ere bi eragigaiak egia direnean. Hizkuntza naturalera ekarrita, amak umeari esaten dionean «Zer nahi duzu? Izozkia edo Pastela», umeak bietariko bat jan beharko du (baita ere biak), baina amak ez dio onartuko ez jaterik. A sarrera Izozkia bada, 0 ez jan litzateke eta 1 jan litzateke; modu beretsuan, B sarrera Pastela bada, 0 ez jan litzateke eta 1 jan litzateke. Amak umeari bata edo bestea agintzen badio, onartzen ez diona da biak 0 izatea (jan gabe geratzea, alegia).

Hizkuntza naturalarekin jarraituz. Aldiz, amak umeari esaten dionean «Nora nahi duzu? Hondartzara ala Mendira», umeak bietariko bat aukeratu beharko du bestea alde batera utzita, ezingo ditu biak hautatu. Beraz, egoera hau or operadore antzeko bat da, non aukera batek bestea baztertzen duen eta, ondorioz, ezin dira biak aukeratu, A ala B egoera honi egokitzen zaion egia-taula xor operadorearena da:

XOR operadorearen egia-taula
Sarrera Sarrera Irteera  
Irteera  ALA 
0
0
0
0
1
1
1
0
1
1
1
0

Taulari begiratuz, amak ez du onartuko lehenengo errenkadako emaitza (hondartzara ez joatea ezta mendira ere); laugarren errenkadako emaitza ez du amak onartuko (hondartzara joatea eta mendira joatea ere). «Hondartzara ala Mendira» agindua luzatzean elkar baztertzen duten bi egoerak onartuko ditu amak, hauexek:

  • Bigarren errenkadako: mendira joatea (hondartzara joan gabe)
  • Hirugarren errenkadako: hondartzara joatea (mendira joan gabe)






  • Ariketa-48a_XOR-zifratze-teknika | main.c       [zifratze funtzioa 3 parametroekin]
  • Ariketa-48b_XOR-zifratze-teknika | main.c       [zifratze funtzioa 2 parametroekin]


 

iruzkinik ez:

Argitaratu iruzkina