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.
/* 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 } }
|
iruzkinik ez:
Argitaratu iruzkina