ENCRIPTAR DESENCRIPTAR EN VISUAL C++
Construimos una aplicación de windows MFC, SDI, con todos los pasos por defecto y en el último establecemos la clase base del tipo FormView. En ella introducimos todos los controles siguientes:
En el fichero de cabecera de la vista se introducen las siguientes variables, asociandolas con el Class Wizard a cada uno del os componentes CheckBox, TextField, la accion se introduce a mano:
public:
//{{AFX_DATA(CEncriptView)
enum
{ IDD = IDD_ENCRIPT_FORM };
BOOL m_guardar;
BOOL m_abrir;
CString m_clave;
CString m_texto1;
CString m_texto2;
BOOL m_accion;
Y se añade el código correspondiente en el fichero de cabecera:
En el constructor inicializamos los valores de las variables:
CEncriptView::CEncriptView()
: CFormView(CEncriptView::IDD)
{
//{{AFX_DATA_INIT(CEncriptView)
m_guardar = FALSE;
//asociada al Check1 (el de debajo)
m_abrir = FALSE; //asociada al Check2 (el de arriba)
m_accion = TRUE//indicara la accion:
(true=encriptar, false=desencriptar);
m_clave = _T("");//asociada
al cuadro de texto de la clave
m_texto1 = _T("");//asociada
al cuadro de texto del texto a encriptar
m_texto2 = _T("");/asociada
al cuadro de texto a desencriptar
//}}AFX_DATA_INIT
// TODO: add construction code here
}
En la funcion OnInitialUpdate insertamos los cambios que se producirán cada vez que se abre un documento nuevo.
void CEncriptView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
GetDocument()->m_accion=m_accion;
GetDocument()->m_abrir=m_abrir;
GetDocument()->m_guardar;
if (m_abrir)
{
m_texto2=GetDocument()->m_texto;
}
else
{
m_texto1=GetDocument()->m_texto;
}
UpdateData(false);
}
Las siguientes funciones estan asociadas a los componentes excepto la funcion o Update que se debe añadir y se ejecuta cada vez que hay una actualización de datos.:
void CEncriptView::OnButton1()
{
// TODO: Add your control notification handler code
here
UpdateData(true);
if(m_clave=="")
{
m_clave="Introduzca la clave";
UpdateData(false);
return;
}
if (m_accion)
{
if(m_texto1=="")
{
m_texto1="Introduzca texto a encriptar";
UpdateData(false);
return;
}
EncriptCadena enc;
enc.accion=m_accion;
enc.clave=m_clave;
enc.texto=m_texto1;
enc.Encriptar();
m_texto2= enc.retorno;
}
else
{
if(m_texto2=="")
{
m_texto2="Introduzca texto a encriptar";
UpdateData(false);
return;
}
EncriptCadena enc;
enc.accion=m_accion;
enc.clave=m_clave;
enc.texto=m_texto2;
enc.Desencriptar();
m_texto1=enc.retorno;
}
if (m_guardar)
{
GetDocument()->m_texto=m_texto2;
}
else
{
GetDocument()->m_texto=m_texto1;
}
UpdateData(false);
}
void CEncriptView::OnRadio1()
{
// TODO: Add your control notification handler code
here
m_accion=true;
UpdateData(true);
}
void CEncriptView::OnRadio2()
{
// TODO: Add your control notification handler code
here
m_accion=false;
UpdateData(true);
}
void CEncriptView::OnCheck1()
{
// TODO: Add your control notification handler code
here
UpdateData(true);
GetDocument()->m_guardar= m_guardar;
if (m_guardar)
{
GetDocument()->m_texto=m_texto2;
}
else
{
GetDocument()->m_texto=m_texto1;
}
UpdateData(false);
}
void CEncriptView::OnCheck2()
{
// TODO: Add your control notification handler code
here
UpdateData(true);
GetDocument()->m_abrir=m_abrir;
}
void CEncriptView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call
the base class
if(m_abrir)
{
m_texto2=GetDocument()->m_texto;
}
else
{
m_texto1=GetDocument()->m_texto;
}
UpdateData(FALSE);
}
void CEncriptView::OnButton2()
{
// TODO: Add your control notification handler code
here
m_texto1 = _T("");
m_texto2 = _T("");
UpdateData(FALSE);
}
Se necesita una nueva clase que encriptarà y desencriptara la llamaremos EncriptCadena
Y se crearan dos ficheros: EncriptCadena.h y EncriptCadena.cpp así que:
// EncriptCadena.h: interface for the EncriptCadena class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_ENCRIPTCADENA_H__EE128996_FAA9_444E_9D73_587C361016A8__INCLUDED_)
#define
AFX_ENCRIPTCADENA_H__EE128996_FAA9_444E_9D73_587C361016A8__INCLUDED_
#if _MSC_VER > 1000
#pragma
once
#endif
// _MSC_VER > 1000
class EncriptCadena
{
public:
//virtual EncriptCadena();
virtual ~EncriptCadena();
CString clave, texto, accion,
retorno;
void Encriptar();
void Desencriptar();
};
#endif
// !defined(AFX_ENCRIPTCADENA_H__EE128996_FAA9_444E_9D73_587C361016A8__INCLUDED_)
Y el fichero EncriptCadena.cpp
#include "stdafx.h"
#include "encript.h"
#include "EncriptCadena.h"
#ifdef
_DEBUG
#undef
THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
EncriptCadena::~EncriptCadena()
{
}
void EncriptCadena::Encriptar()
{
int i=0,j=0,temp=0;
int ic,it;
EncriptCadena::retorno.Format("%s",EncriptCadena::texto);
ic = EncriptCadena::clave.GetLength();
it = EncriptCadena::texto.GetLength();
if( ic
> 0 && it >0)
{
for(i=0,j=0; i<it;i++)
{
if(j>=ic) j=0;
temp = (int) (EncriptCadena::texto.GetAt(i)+EncriptCadena::clave.GetAt(j));
if(temp
>255)temp = temp - 255;
EncriptCadena::retorno.SetAt(i,toascii((char)
temp));
j++;
}
}
}
void EncriptCadena::Desencriptar()
{
int i=0,j=0,temp=0;
int
ic,it;
EncriptCadena::retorno.Format("%s",EncriptCadena::texto);
ic = EncriptCadena::clave.GetLength();
it = EncriptCadena::texto.GetLength();
if( ic
> 0 && it >0)
{
for(i=0,j=0; i<it;i++)
{
if(j>=ic) j=0;
temp = (int) (EncriptCadena::texto.GetAt(i)- EncriptCadena::clave.GetAt(j));
if(temp
<0)temp = temp + 256;
EncriptCadena::retorno.SetAt(i,toascii((char)
temp));
j++;
}
}
}
Por último hacemos que se pueda guardar la información a traves de la serialización de la clase document del programa:
Al fichero encriptDoc.h se le añade las siguientes variables aunque m_guardar y m_abrir no las vayamos a utilizar:
public:
BOOL m_guardar;
BOOL m_abrir;
CString m_texto;
BOOL
m_accion;
Y en el fichero fuente se añade en el código en negrita.:
// encriptDoc.cpp :
implementation of the CEncriptDoc class
//
BOOL CEncriptDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
m_guardar = FALSE;
m_abrir = FALSE;
m_accion = TRUE;
m_texto = _T("");
// TODO: add reinitialization
code here
// (SDI documents will reuse this document)
return TRUE;
}
void CEncriptDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
ar<<m_texto;
}
else
{
// TODO: add loading code here
ar>>m_texto;
}
}