Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/01/2017, 08:43
aguml
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Romper cifrado transposición por grupos + xor

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
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define TAM 100
  6. #define TAM_CLAVE 5
  7.  
  8. enum {encript=1,decript};
  9. //---------------------------------------------------------------------------
  10.  
  11. void solicitar_frase(char *cadena)
  12. {
  13.     //TITULO
  14.     printf("\t ---------------------------------\n");
  15.     printf("\t|             Cifrado             |\n");
  16.     printf("\t|     TRANSPOSICION POR GRUPO     |\n");
  17.     printf("\t ---------------------------------\n");
  18.     printf("Ingresa un mensaje para cifrar: ");
  19.     fgets(cadena,TAM-1,stdin);
  20. }
  21. //---------------------------------------------------------------------------
  22.  
  23. int solicitar_accion(void)
  24. {
  25.     int op;
  26.     printf("1-Encriptar\n");
  27.     printf("2-Desencriptar\n");
  28.     printf("Seleccione una de las acciones a realizar: ");
  29.     scanf("%i",&op);
  30.     return op;
  31. }
  32. //---------------------------------------------------------------------------
  33.  
  34. //Esta funcion da el formato correcto y ademas retorna el largo de la cadena formateada
  35. int dar_formato(const char *original, char *formateada, const int size_clave)
  36. {
  37.     int i=0,j=0,caracteres_restantes=0;
  38.  
  39.     while (original[i]!='\0' && original[i]!='\n')
  40.     {
  41.         if (original[i]==' ')
  42.         {
  43.             i++;
  44.         }
  45.         formateada[j]=original[i];
  46.         i++;
  47.         j++;
  48.     }
  49.     if(j%size_clave!=0)
  50.         caracteres_restantes =size_clave-(j%size_clave);
  51.  
  52.     for (i=0;i<caracteres_restantes;i++)
  53.     {
  54.         formateada[j]='X';
  55.         j++;
  56.     }
  57.     formateada[j]='\0';
  58.     return j;
  59. }
  60. //---------------------------------------------------------------------------
  61.  
  62. void encriptar (const char *cadena, const int largo, const int clave[], const int size_clave)
  63. {
  64.     int i,j,k=0,l=0;
  65.     char *aux;
  66.    
  67.     aux=malloc (size_clave * sizeof (char));
  68.  
  69.     for (i=0;i<largo;i++)
  70.     {
  71.         aux[k]=cadena[l*size_clave + clave[k]-1]^clave[k];
  72.         if (k==size_clave-1){
  73.             for (j=0; j<size_clave;j++)
  74.             {
  75.                 cadena[l*size_clave + j]=aux[j];
  76.             }
  77.             l++;
  78.             k=0;
  79.         }else{
  80.             k++;
  81.         }
  82.     }
  83.     free (aux);
  84. }
  85. //---------------------------------------------------------------------------
  86.  
  87. void desencriptar (const char *cadena, const int largo, const int clave[], const int size_clave)
  88. {
  89.     int i,j,k=0,l=0;
  90.     char *aux;
  91.    
  92.     aux=malloc (size_clave * sizeof (char));
  93.  
  94.     for (i=0;i<largo;i++)
  95.     {
  96.         aux[clave[k]-1]=cadena[i]^clave[k];
  97.         if (k==size_clave-1){
  98.             for (j=0; j<size_clave;j++)
  99.             {
  100.                 cadena[l*size_clave + j]=aux[j];
  101.             }
  102.             l++;
  103.             k=0;
  104.         }else{
  105.             k++;
  106.         }
  107.     }
  108.     free (aux);
  109. }
  110. //---------------------------------------------------------------------------
  111.  
  112. int main(int argc, char* argv[])
  113. {
  114.     //Variables necesaria
  115.     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
  116.     char frase[TAM];
  117.     char frasenueva[TAM];
  118.     int largo,accion;
  119.  
  120.     switch(argc)
  121.     {
  122.         case 1:
  123.             //Obtengo la cadena
  124.             solicitar_frase(frase);
  125.  
  126.             //doy formato a la frase
  127.             largo=dar_formato(frase,frasenueva,TAM_CLAVE);
  128.  
  129.             //Solicito la accion a realizar con dicha frase
  130.             do{
  131.                 system("CLS");
  132.                 accion=solicitar_accion();
  133.             }while(accion != encript && accion != decript);
  134.             system("CLS");
  135.             printf ("Frase formateada:\n%s\n\n",frasenueva);
  136.  
  137.             switch(accion)
  138.             {
  139.                 case encript:
  140.                     encriptar(frasenueva,largo,clave,TAM_CLAVE);
  141.                     printf("Frase encriptada:\n%s\n\n",frasenueva);
  142.                     break;
  143.                 case decript:
  144.                     desencriptar(frasenueva,largo,clave,TAM_CLAVE);
  145.                     printf("Frase desencriptada:\n%s\n\n",frasenueva);
  146.                     break;
  147.             }
  148.             break;
  149.         case 3:
  150.             //doy formato a la frase
  151.             largo=dar_formato(argv[2],frasenueva,TAM_CLAVE);
  152.             printf ("\nFrase formateada:\n%s\n\n",frasenueva);
  153.  
  154.             if(strcmp(argv[1],"-d")==0)
  155.             {
  156.                 //la desencripto
  157.                 desencriptar(frasenueva,largo,clave,TAM_CLAVE);
  158.                 printf("Frase desencriptada:\n%s\n\n",frasenueva);
  159.             }else if(strcmp(argv[1],"-e")==0){
  160.                 //la encripto
  161.                 encriptar (frasenueva,largo,clave,TAM_CLAVE);
  162.                 printf("Frase encriptada:\n%s\n\n",frasenueva);
  163.             }else{
  164.                 printf("La accion solicitada no existe\n");
  165.             }
  166.             break;
  167.         default:
  168.             printf("Numero de parametros erroneo\n");
  169.     }
  170.     system("PAUSE");
  171.     return 0;
  172. }
  173. //---------------------------------------------------------------------------

Última edición por aguml; 31/01/2017 a las 08:53