Autor Tema: Problema de cifrados en C

0 Usuarios y 1 Visitante están viendo este tema.

02 Enero, 2014, 02:24 am
Leído 2904 veces

MaKiNeKT

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 24
  • Karma: +0/-0
  • Sexo: Masculino

02 Enero, 2014, 05:19 am
Respuesta #1

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,797
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
El programa lo veo muy antiintuitivo, me cuesta un poco seguirlo.
Yo intentaría usar funciones más cortas y empaquetadas...

¿Cómo son las "claves", y cómo operan las matrices de encriptación y desencriptación?

Hay que describir esto en borrador, con claridad, y luego el algoritmo sale bien él solito.

Saludos

02 Enero, 2014, 11:38 am
Respuesta #2

MaKiNeKT

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 24
  • Karma: +0/-0
  • Sexo: Masculino
De este mismo modo, pero sin la V ---> http://www.matematicas.net/paraiso/cripto.php?id=adfgvx

es decir, matrices de 5x5 en lugar de 6x6, lo que hace que no se puedan encriptar minúsculas o números, sólo funciona con mayúsculas.

saludos y gracias.

02 Enero, 2014, 12:04 pm
Respuesta #3

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 58,907
  • País: es
  • Karma: +0/-0
Hola

 No tengo fresca la gramática del Lenguaje C, pero hay algunas cosas que chirrían en el programa. Me centro en el algortimo de encriptado:


char *encriptartext()
{
    int i=0,j=0,k=0,l=0;
    char sol[256],encrip[256];
    printf("\n               Introduexi el text a xifrar sense espais(MAJUSCULES): \n");
    scanf("%s", encrip);
    for (i=0;i<25;i++)                        (I)
    {
        if(encrip=='J')
            {
                encrip='I';
            }
    }
    for (i=0;i<25;i++)                        (II)

    {
        for(j=0;j<5;j++)
        {
            for(k=0;k<5;k++)
            {
                if (matriu[j][k]==encrip)
                    {
                        sol[l]=j;
                        l++;
                        sol[l]=k;
                        l++;
                    }
            }
        }
    }
    printf("\n               El text xifrat es: \n");
    for(i=0;i<l;i++)
    {

        if(sol==0)
        {
            sol='A';
        }
        else if(sol==1)
        {
            sol='D';
        }
        else if(sol==2)
        {
            sol='F';
        }
        else if(sol==3)
        {
            sol='G';
        }
        else if(sol==4)
        {
            sol='X';
        }
    }
    return sol;
}

 Fíjate en lo marcado en rojo. El ínidice i debe de recorrer los caracteres de la frase que quieres codificar, de encrip. ¿Por qué lo limitas en 25?. El límite debiera de ser la longitud de la cadena de caracteres encrip.

 Algo parecido ocurre cuando escribes la solución en sol. Le debes de añadir al final un caractér código de fin de cadena, para que el ordenador "sepa" cuando termina la cadena; en otro caso tenemos descontrolados los caracteres de sol que no has sobreescrito y pudieran valer cualquier cosa.

Saludos.

02 Enero, 2014, 01:39 pm
Respuesta #4

MaKiNeKT

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 24
  • Karma: +0/-0
  • Sexo: Masculino
Ante todo gracias.

La idea de poner el 25 viene a partir de el máximo de caracteres del abecedario corriente, que son 27 (y sin contar la "ñ" ni la "j"), es decir 25.

Por otra parte el texto cifrado siempre tendrá el doble de caracteres que el texto por cifrar, pues el programa se basa en cifrar mediante la localización de cada letra en la matriz, es decir, necesita la coordenada "X" y la "Y" (por decirlo de alguna manera).

Por ejemplo:


En esta matriz:


    A  D  F  G  X
A  A  B  C  D  E
D  F  G  H  I   K
F  L  M  N  O  P
G  Q  R  S  T  U
X  V  W X  Y  Z

Cifraríamos la palabra HOLA como: DFFGFAAA

Saludos.

02 Enero, 2014, 03:48 pm
Respuesta #5

Abdulai

  • Moderador Global
  • Mensajes: 3,044
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Hola buenas, les traigo un ejercicio en C que me han mandado para estas navidades y que no debe tener ni un error ni warnings. El caso es que tiene 6 advertencias y, ante todo, hay una de las opciones (la 2) que va mal.
...................................
...................................

Copypasteé tu programa y al compilarlo me encontré con una infinidad de Warnings, que a vos te hayan saltado 6 es por el compilador usado.  Salvo dos, el resto se debía a la manera de declarar e inicializar las variables. 

Pero había dos que eran gruesos y probablemente sean la causa de error en (2) , "probablemente" pues no lo he ejecutado.

En las rutinas:

char *encriptartext()
{
    int i=0,j=0,k=0,l=0;
    char sol[256],encrip[256];
..........................
..........................
..........................
    return sol;
}

char *desencriptartext()
{
    int i=0,j=0, k=0;
    char fin[256],desencrip[256];
..........................
..........................
..........................
    return desencrip;
}

Estás declarando sol y desencrip  como variables locales y devolviendo su dirección ==> las variables locales son "pisoteadas" ni bien se vuelve del subprograma, toda nueva variable local y todo nuevo llamado a subprograma les escribe encima.

Solución:   Declararlas como static char sol[256]   y  static char desencrip[256]

02 Enero, 2014, 05:45 pm
Respuesta #6

MaKiNeKT

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 24
  • Karma: +0/-0
  • Sexo: Masculino
Efectivamente! Muchaaas Graciaaaas, el error ya está solucionado y tengo 2 warnings menos... :)  Ahora ya podré hacer el trabajo escrito más tranquilo...

P.D.: Con el CodeBlocks me salían 6 warnings, ahora 4. Como dices, debe ser el tipo de compilador que usa cada programa.

GRACIAS A TODOS POR LA RÁPIDA CONTESTACIÓN!

BUEN AÑO!

02 Enero, 2014, 06:58 pm
Respuesta #7

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,797
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
MaKiNeKT:

Borraste el enunciado del problema, y ahora no se entiende nada.

No vuelvas a hacer eso.