Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Alejan_dro en 25 Marzo 2019, 21:42 pm



Título: Ayuda !! Cifrado vigenere
Publicado por: Alejan_dro en 25 Marzo 2019, 21:42 pm
Necesito ayuda !! me piden hacer un programa que le pida al usuario ingresar una palabra y la cifre utilizando el cifrado de cesar, eso es lo que hice hasta el momento. ejemplo:
palabra que ingresa el usuario: maria
palabra cifrada: pduld

Ahora me pide que realice el cifrado vigenere mediante una función utilizando estas dos palabras.
Ejemplo:
Palabra: maria  //guardada en cadenaOriginal
Clave: pduld     //guardada en cadenaCifrada
Resultado que debo obtener: cemue

COMO REALIZO ESTE CIFRADO VIGENERE UTILIZANDO EL CODIGO ASCII

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

#define LONGITUD_DEL_ALFABETO 26
#define INICIO_DEL_ALFABETO_MAYUSCULAS 65
#define INICIO_DEL_ALFABETO_MINUSCULAS 97

#define LONGITUD_CADENA 3000
#define MOD(i, n) (i % n + n) % n //para calcular el modulo positivo.



const char *alfabetominusculas = "abcdefghijklmnopqrstuvwxyz",
         *ALFABETOMAYUSCULAS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";



//Declaracion de funciones.
void cifrarMensaje(char *cadena, char *destinoCadena, int desplazamiento);
void descifrarMensaje(char *cadena, char *destinoCadena, int desplazamiento);
int ord(char varCaracter);
void saltarLinea();
void limpiarPantalla();

//Implementacion de funciones.
void cifrarMensaje(char *cadena, char *destinoCadena, int desplazamiento)
{
   int varIterador = 0;
   
   while(cadena[varIterador])
   {
      char varCaracterActual = cadena[varIterador];
      int varValorEnteroDe = ord(varCaracterActual);
      
      if (!isalpha(varCaracterActual))
      {
         destinoCadena[varIterador] = varCaracterActual;
         varIterador++;
         continue;
      }
      if (isupper(varCaracterActual))
      {
         destinoCadena[varIterador] = ALFABETOMAYUSCULAS[(varValorEnteroDe - INICIO_DEL_ALFABETO_MAYUSCULAS + desplazamiento) % LONGITUD_DEL_ALFABETO];
      }
      else
      {
         destinoCadena[varIterador] = alfabetominusculas[(varValorEnteroDe - INICIO_DEL_ALFABETO_MINUSCULAS + desplazamiento) % LONGITUD_DEL_ALFABETO];
      }
      varIterador++;
   }
}
void descifrarMensaje(char *cadena, char *destinoCadena, int desplazamiento)
{
   int varIterador = 0;
   
   while(cadena[varIterador])
   {
      char varCaracterActual = cadena[varIterador];
      int varValorEnteroDe = ord(varCaracterActual);
      
      if (!isalpha(varCaracterActual))
      {
         destinoCadena[varIterador] = varCaracterActual;
         varIterador++;
         continue;
      }
      if (isupper(varCaracterActual))
      {
         destinoCadena[varIterador] = ALFABETOMAYUSCULAS[MOD(varValorEnteroDe - INICIO_DEL_ALFABETO_MAYUSCULAS - desplazamiento, LONGITUD_DEL_ALFABETO)];
      }
      else
      {
         destinoCadena[varIterador] = alfabetominusculas[MOD(varValorEnteroDe - INICIO_DEL_ALFABETO_MINUSCULAS - desplazamiento, LONGITUD_DEL_ALFABETO)];
      }
      varIterador++;
   }
}

int ord(char varCaracter)
{
   return (int)varCaracter;
}
void saltarLinea()
{
   printf("\n");
}

void limpiarPantalla()
{
   system("cls");
}

//Funcion principal.
int main(void)
{
   char cadenaOriginal[LONGITUD_CADENA], cadenaCifrada[LONGITUD_CADENA], cadenaDescifrada[LONGITUD_CADENA];
   int varDesplazamiento;
   
   printf("\t\tIngrese el mensaje que desea cifrar[Utilice maximo %d caracteres]:  ", LONGITUD_CADENA - 1);
   fgets(cadenaOriginal, LONGITUD_CADENA, stdin);
   saltarLinea();
   
   printf("\t\tIngrese el factor de desplazamiento para el cifrado:  ");
   scanf("%d", &varDesplazamiento);
   //limpiarPantalla();
   saltarLinea();
   
   cifrarMensaje(cadenaOriginal, cadenaCifrada, varDesplazamiento);
   printf("\t\tEl mensaje cifrado es:  %s", cadenaCifrada);
   
   descifrarMensaje(cadenaCifrada, cadenaDescifrada, varDesplazamiento);
   printf("\t\tEl mensaje descifrado es:  %s", cadenaDescifrada);
   
   return 0;
}


Título: Re: Ayuda !! Cifrado vigenere
Publicado por: CalgaryCorpus en 26 Marzo 2019, 10:04 am
Modifica tu funcion cifrarMensaje y la otra para que reciba un parametro adicional: varIterador.

Eliminala desde dentro de las funciones y no hagas un while dentro. Elimina ese ciclo dentro.

Haz el nuevo ciclo fuera, en el main, ese ciclo es tan grande como la palabra que quieres cifrar.

Ese ciclo pasa como parametro la palabra a cifrar, el indice del ciclo y usa como desplazamiento el caracter i-esimo de la palabra clave (modulo el largo de la palabra clave).