Colabora
 

Encriptar y Dencriptar

Código para Encriptar y Dencriptar en VB6

Fecha: 20/Oct/2008 (06-10-08)
Autor: Wagner, Ariel Alejandro - arielwagner@hotmail.com

 


Introducción

El siguiente artículo se trata de un algoritmo que permite encriptar y dencriptar texto, cadenas a través de una clave personal de un usuario. Este algoritmo puede utilizarse para cifrar datos para una base de datos, un archivo o fichero, contraseñas, etc. En breve hago un detalle del mismo.

Algunas Puntualizaciones

Antes de comenzar a detallar este algoritmo, he revisado en la Web con el objeto de hallar algún algoritmo que fuere fácil de interpretar y desarrollar. Lamentablemente, la mayoría de los algoritmos que alcance a ver, resultaron muy complejos. De hecho, opte por descartarlos, aunque quiero puntualizar que estos eran excelentes desarrollos. Quizá para un nivel más avanzado.

De tanto revisar, encontré casi por azar, un artículo del indiscutido Harvey Triana que hacía mención de este tema y cómo él acopió un material antiguo escrito por otro desarrollador, el cual, no pudo identificar su tutoría. No obstante, publico el artículo y lo corrigió, según él, algunos errores que presentaban puesto que, supongo, hizo una migración del Basic tradicional a Visual Basic, cosa que resulta en toda una tarea casi artesanal.

Respecto a mi trabajo, yo he analizado el código de Harvey Triana y me propuse a optimizarlo y, dicho del paso, lograr que este fuera menos complejo puesto que el autor utiliza muchos vectores. A mi juicio, el uso de vectores y redimensionamiento como él utilizó en este ejemplo, no me convencen demasiado puesto que consumen muchos recursos en la memoria. El uso abusivo de ReDim puede ser perjudicial. Yo particularmente, evado este tipo de técnicas, las cuales, no son objeto de este artículo que en otra oportunidad podría dar a conocer con muchísimo gusto.

El Algoritmo y su Origen

El siguiente código que he desarrollado realiza los dos procesos de Encripción y Dencripsión. Existe un parámetro en la función que se encarga de controlar este comportamiento. La función se encuentra dentro de una clase, la cual, he llamado ClsEcrypt. El algoritmo es que se muestra a continuación:

 


Public Function Encrypt(ByVal Word As String, ByVal Key As String, _
Optional ByVal Mode As Boolean = False) As String
Dim w As Long, k As Long, p As Long, j As Long, NuChr As Long
Dim Cd As String, Kd As String, Rd As String
w = Len(Word)
k = Len(Key)
' Modalidad de Encripción...
If Mode = False Then
For j = 1 To w
Cd = Mid(Word, j, 1)
If p = k Then p = 0
p = p + 1
Kd = Mid(Key, p, 1)
NuChr = Asc(Cd) + Asc(Kd)
If NuChr > 255 Then
NuChr = NuChr - 255
End If
Rd = Rd & Chr(NuChr)
Next
Encrypt = Rd
Exit Function
End If
' Modalidad de Dencripción...
If Mode = True Then
For j = 1 To w
Cd = Mid(Word, j, 1)
If p = k Then p = 0
p = p + 1
Kd = Mid(Key, p, 1)
NuChr = Asc(Cd) - Asc(Kd)
If NuChr < 0 Then
NuChr = NuChr + 255
End If
Rd = Rd & Chr(NuChr)
Next
Encrypt = Rd
Exit Function
End If
End Function

¿Cómo Funciona?

El parámetro Mode, según sea True o False, es utilizado para optar por el modo de Encripción o Dencripción. Los dos siguientes parámetros, Word y Key, son utilizados para trasladar los datos hacia la estructura de proceso de codificación.

Suponiendo que el parámetro Mode sea False, el algoritmo procederá a realizar el proceso de encripción. A su vez, tomará de los parámetros Word y Key la cadena de dato y la clave para procesarla y encriptar el mensaje. Analizando el proceso que se encuentra dentro de una estructura de desición, vemos que se produce un proceso muy interesante. La variable w es utilizada para determinar la cantidad de caracteres posee la frase a encriptar, que se encuentra almacenada en la variable Word. Así mismo, la variable k, hace lo mismo para la variable Key que resulta en la clave de cifrado. Ahora, la función Mid en la línea Mid(Word, j, 1), es utilizada para recorrer, caracter por caracter, la frase almacenada en la variable Word. Cada uno de estos caracteres, se almacena en la variable temporal Cd por cada paso o avance de lectura de la fución Mid. Unas líneas más adelante, vemos que el caracter almacenado en Cd es casteado "convertido" a un valor numérico. Dicho valor numérico se corresponde a la carta de codificación ASCII. Luego, este número más su homólogo proceso con la clave, me refiero a la variable Key, sufre el mismo proceso de casteo. Todo este proceso final da como resultado otro caracter que se supone es el cifrado.

El problema que existe en este proceso es superar el valor de 255. Como se dará cuenta, la cartilla ASCII codifica caracters en formato oscila entre los valores 0 y 255. Dado que se trata de una cartilla basada en un código binario de 8 bits, 2 elevado a 8 resulta 256. Por tanto, resulta entonces que el código contempla 256 caracteres, los cuales figuran las teclas, funciones, fines de carro, espacio, intro, etc.

Para evitar superar esta cota, se procede a restar el número obtenido por 255. De esta forma, se salva el peso de los bits en el buffer del caracter y se evita a su vez un error de excepsión. Cada vez que la suma supere esta cifra, se procederá con la resta, de lo contrario, se dejará el resultado tal cual como está.

Por último, la variable Rd más la concatenación de la variable NuChr casteada a caracter, ensamblan la frase cifrada para el proceso final.

El proceso de dencripción, es similar al de encripción salvo que se produce una suma del valor 255 y una comparación para determinar si el valor de la varialbe NuChr resulta menor que cero. En el link con el fichero ejemplo, dejo el programa completo para que lo prueben.

Ojala sea de gran utilidad. Hasta pronto...

 



Compromiso del autor del artículo con el sitio del Guille:

Lo comentado en este artículo está probado (y funciona) con la siguiente configuración:

El autor se compromete personalmente de que lo expuesto en este artículo es cierto y lo ha comprobado usando la configuración indicada anteriormente.

En cualquier caso, el Guille no se responsabiliza del contenido de este artículo.

Si encuentras alguna errata o fallo en algún link (enlace), por favor comunícalo usando este link:

Gracias.


Código de ejemplo (comprimido):

 

Fichero con el código de ejemplo: arielwagner_Encriptar_Dencriptar.zip - 3.08 KB

(MD5 checksum: AB2ADA0FD8164A3103CEB18141BC466F)

 


Ir al índice principal de el Guille