/**********************************************
* Nombre : garbo.c
* Author : S[e]C
* Date : 30-06-09
* Description : Code/Decode Cifrado Garbo
***********************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*
* Alfabeto original y los 5 alfabetos de cifrado
*/
char alfabeto[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
char alf1[] ="GHIJKLMNOPQRSTUVWXYZABCDEFghijklmnopqrstuvwxyzabcdef";
char alf2[] ="EFGHIJKLMABCDNOPQRSTZUVWXYefghijklmabcdnopqrstzuvwxy";
char alf3[] ="AZYBXCWDVEFUTGHSRIJQKPLMONazybxcwdvefutghsrijqkplmon";
char alf4[] ="QRSTUVWXYZBACEDFHGJILKMONPqrstuvwxyzbacedfhgjilkmonp";
char alf5[] ="DEGFIHJABCKOLMNPRQTSVUZXYWdegfihjabckolmnprqtsvuzxyw";
//Prototipo funciones cifrado y descifrado
void cifra(char *text);
void descifra(char *text);
int main(void)
{
char cad[50];
fprintf(stdout
,"Cadena a cifrar\t:"); cifra(cad); //primera pasada
cifra(cad); //segunda pasada
printf("Cadena codificada\t:%s\n",cad
); descifra(cad); //revierte primera pasada
descifra(cad); //revierte segunda pasada
printf("\nCadena decodificada\t:%s\n",cad
); return 0;
}
void cifra(char *text)
{
int i,k,modulo;
for(i=0;*(text+i)!='\0';i++)
{
modulo=(i+1)%5; /* Obtengo el modulo de la posicion+1 ya que se considera desde
la letra Nº 1 de la cadena, no la posicion numero 0 de ella. */
switch(modulo)
{
case 0: //si el modulo es 0 uso el alfabeto 5
for(k=0;*(alfabeto+k)!='\0';k++) //miro cada letra del alfabeto
{
if(*(text+i)==*(alfabeto+k)) //y comparo con la primera letra de la cadena
{ //si son iguales:
*(text+i)=*(alf5+k); //le asigno el valor del alfabeto de cifrado correspondiente(alfX)
break; //salgo del ciclo.
}
}
break;
case 1: //si el modulo es 1 uso el alfabeto 1
for(k=0;*(alfabeto+k)!='\0';k++)
{
if(*(text+i)==*(alfabeto+k))
{
*(text+i)=*(alf1+k);
break;
}
}
break;
case 2: // si el modulo es 2 uso el alfabeto 2
for(k=0;*(alfabeto+k)!='\0';k++)
{
if(*(text+i)==*(alfabeto+k))
{
*(text+i)=*(alf2+k);
break;
}
}
break;
case 3: // si el modulo es 3 uso el alfabeto 3
for(k=0;*(alfabeto+k)!='\0';k++)
{
if(*(text+i)==*(alfabeto+k))
{
*(text+i)=*(alf3+k);
break;
}
}
break;
case 4: // si el modulo es 4 uso el alfabeto 4
for(k=0;*(alfabeto+k)!='\0';k++)
{
if(*(text+i)==*(alfabeto+k))
{
*(text+i)=*(alf4+k);
break;
}
}
break;
default: // si el modulo es 4 uso el alfabeto 4
for(k=0;*(alfabeto+k)!='\0';k++)
{
if(*(text+i)==*(alfabeto+k))
{
*(text+i)=*(alf5+k);
break;
}
}
}
}
}
void descifra(char *text)
{
int i,k,modulo;
for(i=0;*(text+i)!='\0';i++)
{
modulo=(i+1)%5; //Obtengo el modulo, IDEM que en el proceso de cifrado
switch(modulo)
{
case 0: //si el modulo es 0 decodifico la letra buscando en el alfabeto 5
for(k=0;*(alf5+k)!='\0';k++) //miro cada letra del alfabeto X
{ //( X = alfabeto correspondiente al modulo )
if(*(text+i)==*(alf5+k)) //comparo con la primera letra de la cadena
{ //si son iguales:
*(text+i)=*(alfabeto+k); //Le asigno la letra correspondiente
break; //en el alfabeto Original, y salgo del ciclo.
}
}
break;
case 1: //si el modulo es 0 decodifico la letra buscando en el alfabeto 1
for(k=0;*(alf1+k)!='\0';k++)
{
if(*(text+i)==*(alf1+k))
{
*(text+i)=*(alfabeto+k);
break;
}
}
break;
case 2: //si el modulo es 0 decodifico la letra buscando en el alfabeto 2
for(k=0;*(alf2+k)!='\0';k++)
{
if(*(text+i)==*(alf2+k))
{
*(text+i)=*(alfabeto+k);
break;
}
}
break;
case 3: //si el modulo es 0 decodifico la letra buscando en el alfabeto 3
for(k=0;*(alf3+k)!='\0';k++)
{
if(*(text+i)==*(alf3+k))
{
*(text+i)=*(alfabeto+k);
break;
}
}
break;
case 4: //si el modulo es 0 decodifico la letra buscando en el alfabeto 4
for(k=0;*(alf4+k)!='\0';k++)
{
if(*(text+i)==*(alf4+k))
{
*(text+i)=*(alfabeto+k);
break;
}
}
}
}
}