Hola amigos, hace tiempo vi el cifrado cesar y el vigenese y ahora he visto el método de transposición por grupos el cual imagino que seria muy sencillo de romper y por eso se me ocurrió xorear cada carácter con el valor de su posición en la clave y funciona pero no se que tan fuerte seria este método a la hora de romper el cifrado.
Pongo el código por si alguien quiere verlo:
Código C:
Ver original#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAM 100
#define TAM_CLAVE 5
enum {encript=1,decript};
//---------------------------------------------------------------------------
void solicitar_frase(char *cadena)
{
//TITULO
printf("\t ---------------------------------\n"); printf("\t| TRANSPOSICION POR GRUPO |\n"); printf("\t ---------------------------------\n"); printf("Ingresa un mensaje para cifrar: "); fgets(cadena
,TAM
-1,stdin
); }
//---------------------------------------------------------------------------
int solicitar_accion(void)
{
int op;
printf("Seleccione una de las acciones a realizar: "); return op;
}
//---------------------------------------------------------------------------
//Esta funcion da el formato correcto y ademas retorna el largo de la cadena formateada
int dar_formato(const char *original, char *formateada, const int size_clave)
{
int i=0,j=0,caracteres_restantes=0;
while (original[i]!='\0' && original[i]!='\n')
{
if (original[i]==' ')
{
i++;
}
formateada[j]=original[i];
i++;
j++;
}
if(j%size_clave!=0)
caracteres_restantes =size_clave-(j%size_clave);
for (i=0;i<caracteres_restantes;i++)
{
formateada[j]='X';
j++;
}
formateada[j]='\0';
return j;
}
//---------------------------------------------------------------------------
void encriptar (const char *cadena, const int largo, const int clave[], const int size_clave)
{
int i,j,k=0,l=0;
char *aux;
aux
=malloc (size_clave
* sizeof (char));
for (i=0;i<largo;i++)
{
aux[k]=cadena[l*size_clave + clave[k]-1]^clave[k];
if (k==size_clave-1){
for (j=0; j<size_clave;j++)
{
cadena[l*size_clave + j]=aux[j];
}
l++;
k=0;
}else{
k++;
}
}
}
//---------------------------------------------------------------------------
void desencriptar (const char *cadena, const int largo, const int clave[], const int size_clave)
{
int i,j,k=0,l=0;
char *aux;
aux
=malloc (size_clave
* sizeof (char));
for (i=0;i<largo;i++)
{
aux[clave[k]-1]=cadena[i]^clave[k];
if (k==size_clave-1){
for (j=0; j<size_clave;j++)
{
cadena[l*size_clave + j]=aux[j];
}
l++;
k=0;
}else{
k++;
}
}
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
//Variables necesaria
const int clave[TAM_CLAVE]={4,3,5,2,1}; //los arrais de enteros no necesitan un espacio extra como pasa con los arrais de caracteres
char frase[TAM];
char frasenueva[TAM];
int largo,accion;
switch(argc)
{
case 1:
//Obtengo la cadena
solicitar_frase(frase);
//doy formato a la frase
largo=dar_formato(frase,frasenueva,TAM_CLAVE);
//Solicito la accion a realizar con dicha frase
do{
accion=solicitar_accion();
}while(accion != encript && accion != decript);
printf ("Frase formateada:\n%s\n\n",frasenueva
);
switch(accion)
{
case encript:
encriptar(frasenueva,largo,clave,TAM_CLAVE);
printf("Frase encriptada:\n%s\n\n",frasenueva
); break;
case decript:
desencriptar(frasenueva,largo,clave,TAM_CLAVE);
printf("Frase desencriptada:\n%s\n\n",frasenueva
); break;
}
break;
case 3:
//doy formato a la frase
largo=dar_formato(argv[2],frasenueva,TAM_CLAVE);
printf ("\nFrase formateada:\n%s\n\n",frasenueva
);
{
//la desencripto
desencriptar(frasenueva,largo,clave,TAM_CLAVE);
printf("Frase desencriptada:\n%s\n\n",frasenueva
); }else if(strcmp(argv
[1],"-e")==0){ //la encripto
encriptar (frasenueva,largo,clave,TAM_CLAVE);
printf("Frase encriptada:\n%s\n\n",frasenueva
); }else{
printf("La accion solicitada no existe\n"); }
break;
default:
printf("Numero de parametros erroneo\n"); }
return 0;
}
//---------------------------------------------------------------------------