Dev - C++ - Cifrado de transposicion por grupos en C

 
Vista:

Cifrado de transposicion por grupos en C

Publicado por Jonathan (6 intervenciones) el 24/01/2017 13:32:06
Muy buenas,

Me presento, soy nuevo en el foro y estoy introduciéndome en el mundo de la programación, estoy empezando con el lenguaje c
aunque me tenga que machacar la cabeza de pensar para resolver mis ejercicios planteados, no consigo dar con este cifrado, ya e hecho cifrado cesar y transposición inversa (cadena al revés) pero el de transposición por grupos no consigo hacerlo,
el planteamiento del problema es el siguiente:


La idea es que si yo ingreso una frase ejemplo: "EL CIFRADO ESTA CASI COMPLETO"
Esa frase se divida en grupos de 5 caracteres: "ELCIF RADOE STACA SICOM PLETO"
luego la clave es 43521. cada numero representa al orden de un caracter.
del primero grupo ELCIF
el 4 es la "I"
el 3 es la "C"
el 5 es la "F"
el 2 es la "L"
el 1 es la "E"

el resultado es : ICFLE
y asi en cada grupo el resultado completo y sin espacios es :
ICFLEODEARCAATSOCMISTEOLP

Como puedo dividir en gruos de cinco y cambiar el orden de los caracteres en cada grupo?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 982
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Cifrado de transposicion por grupos en C

Publicado por agustin (522 intervenciones) el 24/01/2017 15:53:48
Pues tan fácil o tan difícil como quieras plantearlo.
En tu ejemplo la clave para descifrar es 43521:
Cambias el valor de la posición 1 por el de la 4.
Cambias el valor de la posición 2 por el de la 3.
Cambias el valor de la posición 3 por el de la 5.
Y así con los 5 valores.
Por supuesto eso lo haces con un array auxiliar ya que cualquier cambio en el original modifica el resultado final.
Para restaurar tendrías que usar otra función que funcione de forma inversa que si no me confundo seria:
Cambia la 4 por la 1.
Cambia la 3 por la 2.
Cambia la 5 por la 3.
...
De igual manera hay que usar un array auxiliar por el mismo motivo.

Para que me entiendas mejor, en el caso de encriptar harías algo así como:
aux[i]=array[atoi(clave[i])-1];
Y para desencriptar:
aux[atoi(clave[i])-1]=array[i]
Donde i es el índice que usarías con un bucle for para recorrer el array, array seria la cadena con los 5 caracteres y aux seria el array auxiliar.
Intenta resolverlo y si ves que no das con la tecla pegas el código y te ayudamos seguro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Cifrado de transposicion por grupos en C

Publicado por Jhonla (6 intervenciones) el 27/01/2017 23:14:57
Lo e conseguido pero solo ingresando manualmente la cadena se imprime correctamente, necesito solicitarla para ser ingresada, pero me imprimen caracteres erroneos o basura que no debe ser, e probado con scanf y gets.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAM 30
 
int main()
 
{		//TITULO
      printf("\t  ---------------------------------\n");
	  printf("\t |             Cifrado             |\n ");
	  printf("\t |     TRANSPOSICION POR GRUPO     |\n");
	  printf("\t  ---------------------------------\n\n");
    //Variables necesaria
int clave[6]={4,3,5,2,1},ordenado[6]={1,2,3,4,5};
char frase[TAM];
char letra;
char frasenueva[100], aux[6], aux2[6];
int i, j, k,l, espacios=0, caracteres_restantes;
 
printf("Ingresa un mensaje para cifrar: \n");
 
     gets (frase);
 
 
    while (frase[i]!='\0')
    {
        if (frase[i]==' ')
        {
            i++;
        }
        frasenueva[j]=frase[i];
        i++;
        j++;
    }
    caracteres_restantes =5-(j%5);
    for (int i=0;i<caracteres_restantes;i++)
    {
        frasenueva[j]='X';
        j++;
    }
    for (int i=0;i<j;i++)
    {
        aux[k]=frasenueva[i];
        ++k;
        if (k%5==0)
        {
            aux[k]='\0';
            for (int i=0;i<5;i++)
            {
                aux2[i]=aux[ordenado[i]-1];
            }
              aux2[6]='\0';
 
            printf("%s", aux2);
 
            k=0;
        }
    }
    printf("\n");
 
     for (int i=0;i<j;i++)
    {
        aux[k]=frasenueva[i];
        ++k;
        if (k%5==0)
        {
            aux[k]='\0';
            for (int i=0;i<5;i++)
            {
                aux2[i]=aux[clave[i]-1];
            }
              aux2[6]='\0';
 
            printf("%s ", aux2);
 
            k=0;
 
        }
    }
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Cifrado de transposicion por grupos en C

Publicado por Jhonla (6 intervenciones) el 28/01/2017 02:38:52
Ahora, como puedo hacer este mismo proceso en un array bidimensional, tengo estas pistas:

lo que necesitamos es dividir la cadena en posiciones de 5 caracteres por lo tanto tenemos que llenar la matriz en bloques de 5, para ello nos ayudaremos de dos for uno para el tamaño de la matriz (filas), y otro para cada posición de la matriz (columnas), que a su vez contendrá un if-else que comprobará el tamaño de la posición y si es más pequeña de cinco la rellenará con el carácter „X‟.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
or(i=0; i<tBloques; i++){
 
  for(j=0; j<5 ; j++){
   //Rellenamos la matriz con los caracteres si se cumple la condicion
   //en caso contrario lo llenamos con X;
   if((j+y)<tJuntos){
    bloques[i][j] = juntos[j+y];
   }else{
    bloques[i][j] = 'X';
   }
  }
  //Aumentamos el contador de 5 en 5
  y=y+5;
 
 }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 982
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Cifrado de transposicion por grupos en C

Publicado por agustin (522 intervenciones) el 28/01/2017 18:47:05
Tu codigo tenia varios errores como usar variables sin inicializar. Yo lo he planteado de otra forma corrigiendo esos errores:
Enlace a pastebin: http://pastebin.com/x4hGv3r8
Para hacer lo mismo pero con matrices lo ideal seria crear una cadena a la que le vas concatenando las cadenas de la matriz. Puedes hacerlo facilmente con un bucle for y dentro usas strcat y listo. Luego pasas esa cadena de igual manera que hacias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 982
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Cifrado de transposicion por grupos en C

Publicado por agustin (522 intervenciones) el 29/01/2017 21:17:04
Pongo el código pero en la parte de encriptado y desencriptado hago un xor con los valores de la clave con lo que añade más dificultad al proceso de desencriptado por fuerza bruta:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void encriptar (char *cadena, int largo, int clave[5])
{
    int i,j,k=0,l=0;
    char aux[5];
 
    for (i=0;i<largo;i++)
    {
        aux[k]=cadena[l*5 + clave[k]-1] ^ clave[k];
        if (k==4){
            for (j=0; j<5;j++)
            {
                cadena[l*5 + j]=aux[j];
            }
            l++;
            k=0;
        }else{
            k++;
        }
    }
}
//---------------------------------------------------------------------------
 
void desencriptar (char *cadena, int largo, int clave[5])
{
    int i,j,k=0,l=0;
    char aux[5];
 
    for (i=0;i<largo;i++)
    {
        aux[clave[k]-1]=cadena[i] ^ clave[k];
        if (k==4){
            for (j=0; j<5;j++)
            {
                cadena[l*5 + j]=aux[j];
            }
            l++;
            k=0;
        }else{
            k++;
        }
    }
}
//---------------------------------------------------------------------------
Cualquier cosa no dudes en preguntar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 982
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Cifrado de transposicion por grupos en C

Publicado por agustin (522 intervenciones) el 31/01/2017 10:05:48
Aquí con algunos cambios más para hacer más fácil el uso con diferentes tamaños de claves: http://pastebin.com/pw6r8QFA
Simplemente se pone la clave con el largo deseado y se le pone ese largo en TAM_CLAVE.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Cifrado de transposicion por grupos en C

Publicado por Jhonla (6 intervenciones) el 31/01/2017 16:29:52
Genial!! muchas gracias por la ayuda!! no lo podría haber hecho mejor jaja pero me a sido muy muy útil para entender muchas cosas sobre las funciones, te lo agradezco agustin! :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Manuel
Val: 10
Ha disminuido su posición en 3 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Cifrado de transposicion por grupos en C

Publicado por Manuel (6 intervenciones) el 31/01/2017 17:31:51
Agustín el código está muy bien y si no te importa, te invito a que lo agregues como ejemplo a esta web para otros. Le he echado un ojo (para mis pobres conocimientos de C) y me parece que está muy bien. Gracias por colaborar con la comunidad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 982
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Cifrado de transposicion por grupos en C

Publicado por agustin (522 intervenciones) el 01/02/2017 00:26:25
Pues gracias, me alegro que os gustara y os parezca útil. La verdad es que me parecería muy bien ponerlo donde dices pero no tengo ni idea de como hacerlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Cifrado de transposicion por grupos en C

Publicado por David (1 intervención) el 23/10/2018 02:25:05
Disculpa pero en que variables esta almacenando el cifrado y el descifrado para poder mostrar en la ejecución del programa?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar