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;

                }

}