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.
Wikipedia (http://es.wikipedia.org/wiki/Juan_Pujol_(Garbo))
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:
(http://i288.photobucket.com/albums/ll177/sh4k4/tabla.jpg)
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:
(http://i288.photobucket.com/albums/ll177/sh4k4/tabla2.jpg)
2º- se Obtiene para cada letra, su indice módulo 5, y para indices
menores que cinco solo se considera su indice, es decir:
(http://i288.photobucket.com/albums/ll177/sh4k4/tabla3.jpg)
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:
(http://i288.photobucket.com/albums/ll177/sh4k4/tabla4.jpg)
Links sobre el tema: [1] (http://es.wikipedia.org/wiki/Juan_Pujol_%28Garbo%29) - [2] (http://www.sinfocol.org/2008/12/cifrado-de-garbo-parte-i/) - [3] (http://es.wikipedia.org/wiki/MI5)
Una implementacion del cifrado y descifrado del mismo algoritmo en lenguaje C por mi, aca:
/**********************************************
* 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
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?