Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-10-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Asi he dejado el codigo:
Main.cpp:
Código PHP:
//---------------------------------------------------------------------------
#include <iostream>
#include <fstream.h>
#include "Vigenere.h"
//---------------------------------------------------------------------------

using namespace std;

void InfoUso();
void Desencriptar(char *nameFileInchar *semillachar *nameFileOut);
void Encriptar(char *nameFileInchar *semillachar *nameFileOut);

int main(int argcchar *argv[])
{
   if(
argc == 5){
      if(
argv[1][0] == 'e' && argv[1][1] == '\0'){
         
Encriptar(argv[2],argv[3],argv[4]);
         
cout << "Operacion finalizada." << endl;
      }else if(
argv[1][0] == 'd' && argv[1][1] == '\0'){
         
Desencriptar(argv[2],argv[3],argv[4]);
         
cout << "Operacion finalizada." << endl;
      }else{
         
cout << "Opcion no valida." << endl;
         
InfoUso();
      }
   }else if(
argc<5){
      
cout << "Faltan argumentos." << endl;
      
InfoUso();
   }else{
      
cout << "Sobran argumentos." << endl;
      
InfoUso();
   }
   return 
0;
}

void InfoUso()
{
   
cout << "Vigenere.exe [operacion] [archivo] [semilla]" << endl;
   
cout << "operacion: 'd' desencriptar. 'e' encriptar." << endl;
   
cout << "archivo: ruta completa del archivo o solo el nombre si esta junto a este ejecutable." << endl;
   
cout << "semilla: la cadena que va a ser usada como semilla para encriptar/desencriptar el archivo." << endl;
}

//Funcion que encripta el archivo
void Encriptar(char *nameFileInchar *semillachar *nameFileOut)
{
   
ifstream origen;
   
ofstream salida;
   
char *cadena;

   
origen.open(nameFileIn,ios::binary);

   if(
origen.good()){
      
origen.seekg(0,ios::end);
      
int length origen.tellg();
      
origen.seekg(0,ios::beg);
      
cadena = new char[length+1];
      
Vigenere *vig = new Vigenere;
      
salida.open(nameFileOut,ios::binary ios::trunc);

      if(
salida.good()){
         
origen.read(cadena,length);
         
cadena[length]='\0';
         
salida.write(vig->cifrar(cadenasemilla).c_str(),length);
         
salida.close();
      }
      
delete vig;
      
delete(cadena);
      
origen.close();
   }
}

//Funcion que desencripta el archivo
void Desencriptar(char *nameFileInchar *semillachar *nameFileOut)
{
   
ifstream origen;
   
ofstream salida;
   
char *cadena;

   
origen.open(nameFileIn,ios::binary);

   if(
origen.good()){
      
origen.seekg(0,ios::end);
      
int length origen.tellg();
      
origen.seekg(0,ios::beg);
      
cadena = new char[length+1];
      
Vigenere *vig = new Vigenere;
      
salida.open(nameFileOut,ios::binary ios::trunc);

      if(
salida.good()){
         
origen.read(cadena,length);
         
cadena[length]='\0';
         
salida.write(vig->descifrar(cadenasemilla).c_str(),length);
         
salida.close();
      }
      
delete vig;
      
delete(cadena);
      
origen.close();
   }

Vigenere.h:
Código PHP:
//---------------------------------------------------------------------------
#ifndef VigenereH
#define VigenereH
//---------------------------------------------------------------------------
#include <cstring.h>

class Vigenere{
   private:
      
string texto,semilla,caracteresValidos;
      
string limpiar(string cadena);
      
//Las variables son privadas, el metodo limpiar
      //es privada ya que solo lo utilizan los otros
      //metodos para limpiar la entrada

   
public:
      
Vigenere();
      ~
Vigenere();
      
string cifrar(string origstring sem);
      
string descifrar(string origstring sem);
      
//Esto es publico porque es la unica forma de
      //accesar a los datos de la clase
};
//---------------------------------------------------------------------------
#endif 
Vigenere.h:
Código PHP:
/************************************************
*  Nombre : Vigenere.cpp                        *
*                                               *
*  Cifrado de cesar de sustitución multiple     *
*  por medio de sumas y restas del alfabeto     *
*                                               *
*  Fulapol                                      *
*  [email protected]                            *
*  my.opera.com/fulapol                         *
*                                               *
************************************************/

/************************************************
*                                               *
*  El Constructor que debe recibir la cadena a  *
*  tratar y la cadena semilla                   *
*                                               *
************************************************/
#include "Vigenere.h"

Vigenere::Vigenere(){
   
caracteresValidos "abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZáéíóúÁÉÍÓÚüÜ1234567890¿?¡!,;.:-_ \"\t\n\r\\<>(){}[]^çÇ=+*/&%$#@";
}

Vigenere::~Vigenere(){

}
/************************************************
*                                               *
*  El metodo cifrar, que regresa una cadena de  *
*  texto que solo despues de ser cifrada        *
*                                               *
************************************************/

string Vigenere::cifrar(string origstring sem){
   
string final;
   
unsigned int irotaciontotal;
   
int pospos2;
   
//Las variables serviran para registrar la posicion
   //de las letras y calcular la semilla

   
this->texto limpiar(orig);
   
this->semilla limpiar(sem);

   for(
i=0texto.length(); i++){
      
rotacion i%semilla.length();
      
pos caracteresValidos.find(texto.at(i));
      
pos2 caracteresValidos.find(semilla.at(rotacion));
      
total = (pos+pos2)%caracteresValidos.length();
      
//El total que marca la posicion de la letra y la
      //semilla sumadas

      
final.append(caracteresValidostotal1);
   }
   return final;
}

/************************************************
*                                               *
*  El metodo descifrar, que regresa una cadena  *
*  de texto que solo despues de ser descifrada  *
*                                               *
************************************************/

string Vigenere::descifrar(string origstring sem){
   
//La funcion es exactamente la misma que en el metodo
   //cifrar, solo que aqui las posiciones se restan para
   //eliminar la semilla del texto

   
string final;
   
unsigned int irotaciontotal;
   
int pospos2;

   
this->texto limpiar(orig);
   
this->semilla limpiar(sem);

   for(
i=0i<texto.length(); i++){
      
rotacion i%semilla.length();
      
pos caracteresValidos.find(texto.at(i));
      
pos2 caracteresValidos.find(semilla.at(rotacion));
      
total = (caracteresValidos.length() + pos pos2) % caracteresValidos.length();

      final.
append(caracteresValidostotal1);
   }
   return final;
}

/************************************************
*                                               *
*  El metodo limpiar, que regresa una cadena de *
*  texto que solo contiene los caracteres       *
*  soportados por la clase                      *
*                                               *
************************************************/

string Vigenere::limpiar(string cadena){
   
unsigned int i;
   
string final;
   for(
i=0cadena.length(); i++){
      if(
caracteresValidos.find(cadena.at(i)) != -1)
         final.
append(&cadena.at(i),1);
      
//Agregamos a la cadena final el caracter
      //si se encuentra en la variable letras
   
}
   return final;

Responder Con Cita
  #2  
Antiguo 25-10-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Ahora tengo otra duda. Si en vez de usar ese cifrado quisiese usar uno de desplazamientos, o sea tener un array con los caracteres válidos y a la función le meto una cadena y un valor de desplazamiento como por ejemplo encriptar ("hola",3). Cada caracter se desplazaría 3 posiciones en el array de letras con lo que quedaría "krñd". ¿como seria eso para cifrar y descifrar? Llevo toda la tarde y no doy con la forma correcta para que no desborde y de un resultado correcto.
He visto que ese cifrado se llama Cesar y vi esto: https://es.m.wikipedia.org/wiki/Cifrado_César
El problema con esas fórmulas es que imaginen que la letra es la z y el desplazamiento es 0:
Salida=(27+0)%27=0
Sí no hay desplazamiento debería dar 27 ¿no?

Última edición por aguml fecha: 25-10-2015 a las 21:41:20.
Responder Con Cita
  #3  
Antiguo 25-10-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por aguml Ver Mensaje
El problema con esas fórmulas es que imaginen que la letra es la z y el desplazamiento es 0:
Salida=(27+0)%27=0
Sí no hay desplazamiento debería dar 27 ¿no?
El problema es de concepto. La tabla de caracteres empieza en elemento 0, por lo que el último carácter es el 26 y no el 27.

Saludos.
Responder Con Cita
  #4  
Antiguo 25-10-2015
Avatar de BDWONG
BDWONG BDWONG is offline
Miembro
NULL
 
Registrado: nov 2013
Posts: 113
Poder: 13
BDWONG Va por buen camino
Porque harias un desplazamineto a cero

mira este codigo

Código:
#include <iostream>
using namespace std;


string cifrarCesar(const string cadena, const int rotacion){
   string sFinal=cadena;
   for(unsigned int i=0;i<cadena.length();i++){
        sFinal[i]=char(int(cadena[i])+(rotacion %256));
   }
   return sFinal;
}
string descifrarCesar(const string cadena, const int rotacion){
   string sFinal=cadena;
   for(unsigned int i=0;i<cadena.length();i++){
        sFinal[i]=char(int(cadena[i])-(rotacion %256));
   }
   return sFinal;
}


int main()
{
    string cadena=cifrarCesar("hola mundo",3);
    cout<<cadena<<endl;
    string descifrada=descifrarCesar(cadena,3);
    cout<<descifrada<<endl;
    return 0;
}
Responder Con Cita
  #5  
Antiguo 25-10-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por BDWONG Ver Mensaje
Porque harias un desplazamineto a cero
Al menos en teoría debe funcionar para cualquier desplazamiento sin preguntar si es o no cero, que es lo que se plantea aguml. La explicación que dí y que aplicas a tu código: el primer carácter es el 0 y el último 255, siendo en total 256.


Salidos.
Responder Con Cita
  #6  
Antiguo 25-10-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Después de analizar mi prueba creo que esto funciona correctamente:
Encriptar:
Código PHP:
int largo,posInicial,posFinal;
char Mensaje []="HOLA";
char Letras []="ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";
int numero=5;
 
largo strlen (Letras);
posInicial strchr (Letras,Mensaje [i]);
posFinal = (largo posInicial numero) % largo;
Mensaje [i]=Letras [posFinal]; 
Desecriptar:
Código PHP:
int largo,posInicial,posFinal;
char Mensaje []="MTPF";
char Letras []="ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";
int numero=5;
 
largo strlen (Letras);
posInicial strchr (Letras,Mensaje [i]);
posFinal = (largo posInicial numero) % largo;
Mensaje [i]=Letras [posFinal]; 
Largo da 27 mientras que el máximo de pos es 26. El fallo lo tenia porque a largo le quitaba 1.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
con FindComponent en una dll no compila aguml C++ Builder 3 30-12-2014 14:33:20
Pasar mi clase a una clase de 3 capas o lo mas parecido elarys OOP 2 07-04-2011 23:02:54
No compila FastReport Chogo Varios 3 18-06-2010 21:32:42
clase que contiene otra clase definida de forma posterior astwin OOP 5 20-02-2009 11:26:55
Mi aplicacion no compila Lizette Varios 2 08-11-2008 16:24:25


La franja horaria es GMT +2. Ahora son las 04:50:38.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi