La criptografía es el arte de cifrar y descifrar información para que sólo pueda ser leída por la persona a la que va dirigida. El documento presenta un algoritmo de cifrado en C++ que suma las representaciones numéricas de los dígitos de la clave y el texto en claro para obtener el texto cifrado. También muestra el código para el proceso inverso de descifrado. Finalmente, indica que estos codificadores y decodificadores sólo pueden cifrar archivos de texto, pero el algoritmo podría implementarse para cifrar cualquier tipo de archivo binario
1. Criptografía
“κρύπτω krypto, «oculto» + γράφω graphos, «escribir» = «escritura oculta»”
Este curioso arte se avoca a cifrar y descifrar información mediante técnicas
especiales, con el fin de que un mensaje sólo pueda ser leído por la persona
a la que va dirigido.
Ahora veremos el desarrollo e implementación de un algoritmo de cifrado en
C++, empecemos con esta idea:
Vamos a sumar las representaciones numéricas del primer dígito de la clave
y el primer dígito del „texto en claro‟ (mensaje legible en la jerga de la
criptografía) obteniendo así el primer dígito del texto cifrado. Este proceso se
realiza de igual forma con todos los dígitos del archivo tal y como muestra la
imagen:
Ahora, vamos a implementar esto en un programa de C++:
// CIDESOFT/Fredy Rojas/codificador1.cpp
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<fstream>
using namespace std;
const int MAXNOMB = 255; //maximo de caracteres para el
nombre
int main()
{
char archivo_original[MAXNOMB];
char extension[10];
char archivo_cifrado[MAXNOMB];
char clave[255];
char car;
int ch;
2. cout<<"Ingrese el nombre del archivo a cifrar(sin
extension): ";
cin>>archivo_original;
cout<<"Ingrese la extension del archivo a cifrar: ";
cin>>extension;
strcpy(archivo_cifrado,archivo_original);
strcat(archivo_original,".");
strcat(archivo_original,extension);
strcat(archivo_cifrado,".cifx");
ifstream archivo_in;
ofstream archivo_out;
archivo_in.open(archivo_original);
archivo_out.open(archivo_cifrado);
if (archivo_in.fail()) //verificar si se abrio con
exito
{
cout<<"El archivo no se puede abrir con exiton"
<<" verifique si el archivo en realidad existen";
system("PAUSE");
exit(1);
}
if (archivo_out.fail()) //verificar si se creo con
exito
{
cout<<"El archivo no se puede crear con exiton";
system("PAUSE");
exit(1);
}
cout<<"Ingrese clave: ";
cin>>clave;
cout<<endl<<endl;
int idc; //indice de la ubicacion de la letra de la
clave
idc=0;
int lon; //longitud de la clave
lon = strlen(clave)-1;
while( ( ch = archivo_in.peek() ) != EOF )
{
archivo_in.get(car);
car = car + clave[idc];
if( idc == lon )
idc = -1;
idc++;
archivo_out<<car;
3. }
archivo_in.close();
archivo_out.close();
cout<<"nEl archivo ha sido cifrado
satisfactoriamenete."<<endl<<endl;
system ("PAUSE");
return 0;
}
Muy bien, esto ha sido el cifrado, veamos ahora descifrado, ya que es
simplemente el proceso inverso, solo les presento la idea y el código:
// CIDESOFT/Fredy Rojas/decodificador1.cpp
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<fstream>
using namespace std;
const int MAXNOMB = 255; //maximo de caracteres para el
nombre
int main()
{
char archivo_original[MAXNOMB];
char extension[10];
char archivo_cifrado[MAXNOMB];
char clave[255];
char car;
int ch;
cout<<"Ingrese el nombre del archivo a descifrar(sin
extension): ";
cin>>archivo_cifrado;
4. cout<<"Ingrese la extension del archivo original: ";
cin>>extension;
strcpy(archivo_original,archivo_cifrado);
strcat(archivo_original,".");
strcat(archivo_original,extension);
strcat(archivo_cifrado,".cifx");
ifstream archivo_in;
ofstream archivo_out;
archivo_in.open(archivo_cifrado);
archivo_out.open(archivo_original);
if (archivo_in.fail()) //verificar si se abrio con
exito
{
cout<<"El archivo no se puede abrir con exiton"
<<" verifique si el archivo en realidad existen";
system("PAUSE");
exit(1);
}
if (archivo_out.fail()) //verificar si se creo con
exito
{
cout<<"El archivo no se puede crear con exiton";
system("PAUSE");
exit(1);
}
cout<<"nIngrese clave: ";
cin>>clave;
cout<<endl<<endl;
int idc; //indice de la ubicacion de la letra de la
clave
idc=0;
int lon; //longitud de la clave
lon = strlen(clave)-1;
while( ( ch = archivo_in.peek() ) != EOF )
{
archivo_in.get(car);
car = car - clave[idc];
if( idc == lon )
idc = -1;
idc++;
archivo_out<<car;
}
archivo_in.close();
5. archivo_out.close();
cout<<"nEl archivo ha sido descifrado
satisfactoriamenete."<<endl<<endl;
system ("PAUSE");
return 0;
}
Este „codificador‟ y „decodificador‟ tratan el archivo a cifrar como un archivo
de texto, por ello es que solamente pueden cifrar y descifrar archivos de este
tipo.
Se puede implementar el mismo algoritmo en C++, pero tratando el archivo
a cifrar como un archivo binario, esto significa cifrar cada BIT del archivo sin
importar que sea texto o alguna otra codificación, lo que nos permitiría cifrar
absolutamente cualquier tipo de archivo („.txt‟, „.jpg‟, „.mp3‟, „.wmv‟, etc.)
¿Quieres saber cómo?, visita:
http://cidesoft.com.pe/blogs/integrantes/fredy-rojas-frants/