[C] Code/Decode Cifrado Garbo

Iniciado por S[e]C, Marzo 31, 2010, 03:28:05 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Marzo 31, 2010, 03:28:05 PM Ultima modificación: Febrero 08, 2014, 06:12:18 PM por Expermicid
CitarJuan Pujol García (Barcelona, España, 14 de febrero de     1912 - Caracas, Venezuela, 10 de octubre de 1988) conocido por su     nombre en clave británico Garbo, y por su nombre en     clave alemán Arabel, fue un agente doble español     que desempeñó un papel clave en el éxito del Desembarco de     Normandía al final de la Segunda Guerra Mundial. La información     falsa que Pujol proporcionó a Alemania ayudó a convencer a Hitler     de que el ataque principal sería más tarde y en otro lugar, lo que     resultó en su decisión de reducir las tropas en la zona del     desembarco.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Durante su desempeño como agente doble Garbo empleo entre otros
algoritmos de cifrado, el que veremos a continuación:

La base del algoritmo son los siguiente alfabetos:



Para cifrar un texto mediante este algoritmo se siguen los siguientes pasos:

Supondremos la siguiente cadena: "ARABEL"

1º- Se considera como indice de cada letra de la cadena su respectiva
posicion, es decir:



2º- se Obtiene para cada letra, su indice módulo 5, y para indices
menores que cinco solo se considera su indice, es decir:



3º-
Ahora dependiendo el modulo obtenido para cada letra, se decide con
que alfabeto sera cifrada(este proceso se realiza dos veces, se cifra cada caracter dos veces), por lo tanto para nuestro ejemplo seria:



Links sobre el tema: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta - No tienes permitido ver los links. Registrarse o Entrar a mi cuenta - No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Una implementacion del cifrado y descifrado del mismo algoritmo en lenguaje C por mi, aca:

Código: c

/**********************************************
* 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:");
    fscanf(stdin,"%s",cad);
    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);
    setbuf(stdin,NULL);
    getchar();
    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;
                      }
                       
                }
          }
     }
}
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Buen aporte men! pero me pregunto..esto es para que en general?  ???

Dices el porque de cifrar los mensajes ? o a que te refieres especificamente?
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



de 10 el code , prefiero mi encriptacion tiene menos lio y es mas potente (?)
S4lut3s

pues quisiera opinar pero no entiendo de que se trata ::)