Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Romper cifrado transposición por grupos + xor

Estas en el tema de Romper cifrado transposición por grupos + xor en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 31/01/2017, 08:43
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 10 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
  #2 (permalink)  
Antiguo 22/02/2017, 15:45
 
Fecha de Ingreso: junio-2009
Mensajes: 64
Antigüedad: 15 años, 5 meses
Puntos: 6
Respuesta: Romper cifrado transposición por grupos + xor

Una consulta con que estas compilando el código?. Te pregunto porque si lo dejo en la declaración de los procedimientos (funciones void) como

const char *cadena

me dice que es una asignación ilegal, y me genero duda porque es bastante lógico, no se con que estas compilando. Muchas gracias.

Última edición por PercevalCiro; 22/02/2017 a las 15:55
  #3 (permalink)  
Antiguo 24/02/2017, 10:47
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 10 meses
Puntos: 3
Respuesta: Romper cifrado transposición por grupos + xor

En C++Builder pero eso es totalmente estándar ya que eso indica que se pasa un puntero a una cadena constante y es bueno pasarlo cómo constante para evitar que se pueda modificar dentro de la función ya que si lo hiciéramos de forma accidental daría una excepción.
En el móvil usando c4droid compila y funciona a la perfección.
  #4 (permalink)  
Antiguo 27/02/2017, 09:48
 
Fecha de Ingreso: junio-2009
Mensajes: 64
Antigüedad: 15 años, 5 meses
Puntos: 6
Respuesta: Romper cifrado transposición por grupos + xor

Entiendo, en CygWin da error, y en el estandar gcc también me da error. Realizando esa modificación me permite compilar; en realidad personalmente creo que como cuestión lógica no tendría sentido pasar algo como referencia e indicarle que sea constante, la solución sencilla sería no enviarlo como referencia y si dentro de una variable, o depositarlo en el argumento de la función. Esto no quiere decir que yo diga que no debería compilar, digo que si lo pienso muy apresuradamente me parece una redundancia, o sea, me parece que correcto que de error. Pero gracias por la aclaración del compilador hace muchisiiiiimo que no uso el Builder.

Saludos!!

Etiquetas: cifrado, grupos, int, main
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:51.