Artículo | Encriptación con Visual Basic |
Autor / Fuente | Harvey Triana |
Tema | Programación General |
Creado | Julio 2 1998 |
La Encriptación, es un tema de la programación bien
interesante, de hecho se trata de una alta ciencia de la informática, que pasa
por arte, inclusive hoy se trata de una tecnología. Encriptación es una
palabra rara en español, quizá fea, no obstante se emplea en documentación
técnica.
Buscando en el cajón de los recuerdos, encontré un par de procedimientos para Codificación / Decodificación con QuickBasic. Desaforadamente desconozco al programador de tales procedimientos. Después de traducir las rutinas para que trabajasen en Visual Basic me di cuenta que tenían fallas de programación, sin embargo la documentación del código me llevo a captar la idea del autor y ponerla a funcionar perfectamente. Tales procedimientos se exponen en este documento.
Algo de Teoría
Como elemento clave en las comunicaciones, la importancia de mantener la privacidad de la información, aumenta día a día, y más aun cuando nos aproximamos a la Super Autopista de la Información, nos lo ha dicho el Sr. Gates.
Recuerdo que alguien comentaba que codificar era muy sencillo, simplemente cambias unas letras por otras, y el receptor del mensaje conoce este secreto. También, aumentar o disminuir un número discreto a los códigos ASCII, suele ser otra sugerencia. Estas estrategias pasan a ser infantiles tratamientos del problema, y no presentan problema alguno para un decodificador experto y malo.
La encriptación se hace a través de la aplicación de cierto tratamiento a los códigos ASCII de los mensajes, de manera que el tratamiento inverso será el único camino práctico para decodificar el mensaje.
¿Cómo se mantiene indescifrable una cadena codificada?. Se trata de combinar la clave de encriptación con el mensaje de manera que las probabilidades de decodificar el mensaje, sin conocer la clave, sean virtualmente infimas, es decir, el tan prolongado el trabajo de desciframiento que no existen esperanzas próximas. Por ejemplo cuando un cristal ornamental se rompe violentamente, es casi imposible volver a juntar las piezas para obtener la pieza original.
Como una cita teórica, uno de los algoritmos de codificación se basa en la función números primos. Por ejemplo resulta fácil multiplicar dos números primos, sean a = 11927 y b = 20903, de manera que a • b = c = 249310081. Pero resulta muy difícil determinar a y b a partir de c. Matemáticamente esto se hace a través del procedimiento conocido como Descomposición Factorial. En el ejemplo c viene a ser la codificación, mientras a y b son la clave de decodificación. Esta estrategia es la base de un ingenioso y sofisticado sistema de encriptación llamado Criptosistema RSA (en honor a sus autores). de hecho este es el mejor sistema de encriptación y es posible que sea aplicado en las comunicaciones masivas de Internet en un futuro. Siguiendo con mí ejemplo, en un caso real, se trata de cifras de alrededor de 250 dígitos, lo cual teóricamente requiere de millones de años para descomponer factorialmente. Una anécdota citada en el libro Camino al Futuro (2ª edición) de Mr. Gates, cuenta que un reto publico de descifrar una clave de 129 dígitos fue superado al coordinar un trabajo de varias computadoras e Internet, para finalmente lograr la respuesta en menos de un año. En el reto los autores predecían que su mensaje jamás sería desvelado. El libro mencionado hace una exposición más detallada de este tema. Por supuesto, este articulo no llegará tan lejos.
Dos Procedimientos de Encriptación
La Encriptación tiene dos elementos: Un mensaje, y una clave privada de acceso entre el emisor y el receptor, con la cual se puede descifrar el mensaje. El procedimiento de encriptación produce un mensaje o archivo cifrado. Presento dos procedimientos escritos en Visual Basic, catalogados como verdaderas maneras de encriptación.
Modelo EncryptionString
EncryptionString, es un clásico sistema el cual toma el mensaje y una clave del usuario, y a través de una combinación de estos dos parámetros se produce una cadena codificada. Mantengo la explicación original del método:
Texto a codificar: ENCRYPTION Caracteres del Texto: E N C R Y P T I O N Códigos ASCII: 69 78 67 82 89 80 84 73 79 78 Contraseña KEY: K E Y K E Y K E Y K Caracteres de KEY: 75 69 89 75 69 89 75 69 89 75 Suma de Códigos ASCII: 144 147 156 157 158 169 159 142 168 153 En caracteres: “ œ ? © Ÿ ? ¨ ™ Texto codificado: “œ?©Ÿ?¨™
El modo para usar la función EncryptionString es el siguiente:
'//Codifica TextoCodificado = EncryptString(TextoOriginal, Contraseña, ENCRYPT) '//Decodifica TextoOriginal = EncryptString(TextoCodificado, Contraseña, DECRYPT)
La ventaja de esta técnica es que es muy flexible de usar e intuitiva. Sin tener la máxima seguridad, es muy segura. Escribir un programa para encriptar archivos resulta bastante simple por aquello de la contraseña. No ocurre lo mismo con el siguiente procedimiento: ChrTran.
El código de EncryptionString es el siguiente:
DefInt A-Z Option Explicit '//For Action parameter in EncryptString Public Const ENCRYPT = 1, DECRYPT = 2 '--------------------------------------------------------------------- ' EncryptString ' Modificado por Harvey T. '--------------------------------------------------------------------- Public Function EncryptString( _ UserKey As String, Text As String, Action As Single _ ) As String Dim UserKeyX As String Dim Temp As Integer Dim Times As Integer Dim i As Integer Dim j As Integer Dim n As Integer Dim rtn As String '//Get UserKey characters n = Len(UserKey) ReDim UserKeyASCIIS(1 To n) For i = 1 To n UserKeyASCIIS(i) = Asc(Mid$(UserKey, i, 1)) Next '//Get Text characters ReDim TextASCIIS(Len(Text)) As Integer For i = 1 To Len(Text) TextASCIIS(i) = Asc(Mid$(Text, i, 1)) Next '//Encryption/Decryption If Action = ENCRYPT Then For i = 1 To Len(Text) j = IIf(j + 1 >= n, 1, j + 1) Temp = TextASCIIS(i) + UserKeyASCIIS(j) If Temp > 255 Then Temp = Temp - 255 End If rtn = rtn + Chr$(Temp) Next ElseIf Action = DECRYPT Then For i = 1 To Len(Text) j = IIf(j + 1 >= n, 1, j + 1) Temp = TextASCIIS(i) - UserKeyASCIIS(j) If Temp < 0 Then Temp = Temp + 255 End If rtn = rtn + Chr$(Temp) Next End If '//Return EncryptString = rtn End Function
Modelo ChrTran
ChrTran es violentamente complicado de violar, de hecho imposible. Virtualmente las probabilidades de descifrar un mensaje son del orden de 255! (255 factorial), un numero sin fin en la práctica (por ejemplo las calculadoras comunes soportan solo hasta 69!).
Tengo que confesar que tuve que reescribir ChrTran porque presentaba errores de programación y mucho código para optimizar, el resultado es sorprendente. Ni que decir que no tenía en cuenta que en español usamos tildes y eñes.
Como su abreviación lo dice ChrTran transpone caracteres, usa dos claves de 255 caracteres (la carta ASCII) y produce un texto codificado de origen aleatorio. Toma cada carácter del texto, encuentra su posición en la primera clave, e intercambia este carácter por el carácter en la misma posición de la segunda clave. Es complicado de asimilar.
Lo más difícil de ChrTran es el manejo de las claves. La primera clave (la sarta de búsqueda) podría ser publica (mejor debiera decir debe ser publica). Mientras que la segunda clave es una sarta aleatoria de la carta ASCII.
El modo de manejar ChrTran es el siguiente:
ClaveAleatoria = RandomChart() '// Se podría usar la sarta de búsqueda, ClaveDeBúsqueda, como '// otra cadena aleatoria con ClaveDeBúsqueda = RandomChart() '// aqui se mantiene un nivel de Encriptación flexible, más no '// inseguro, al hacer ClaveDeBúsqueda como la secuencia 0 a 255 '// de la carta ASCII: For i = 0 To 255 ClaveDeBúsqueda = ClaveDeBúsqueda + Chr$(i) Next '//Codifica TextoCodificado = ChrTran(TextoOriginal, ClaveDeBúsqueda, ClaveAleatoria) '//Decodifica TextoOriginal= ChrTran(TextoCodificado, ClaveAleatoria, ClaveDeBúsqueda)
En la primera línea se usa RandonChart, la cual es una función que retorna la carta ASCII en un orden aleatorio.
Como posiblemente se deduce, usar ChrTran para escribir un programa que trabaje encriptación, representa una labor bastante especializada, pero por supuesto nada del otro mundo.
El código de ChrTran es el siguiente:
DefInt A-Z Option Explicit '//--------------------------------------------- '// Return a random string of ASCII Chart. '// Used by ChrTran. By Harvey T. '//--------------------------------------------- Public Function RandomChart() As String Dim Char As String Dim RndStr As String Dim n As Integer Randomize Timer Do Char = Chr$(Int(Rnd * 256)) If InStr(RndStr, Char) = 0 Then n = n + 1 RndStr = RndStr + Char End If Loop Until n = 256 RandomChart = RndStr End Function '--------------------------------------------------------------------- ' ChrTran ' Optimizing by Harvey T. '--------------------------------------------------------------------- Public Function ChrTran(Text As String, SStr As String, EStr As String) As String Dim i As Integer Dim rtn As String For i = 1 To Len(Text) rtn = rtn + Mid$(EStr, InStr(SStr, Mid$(Text, i, 1)), 1) Next ChrTran = rtn End Function
Pequeño Reto
Los invito a decodificar la siguiente sarta encriptada con EncryptionString y una contraseña de 4 caracteres (demasiadas pistas):
·Æ™ÔÖâÈÓ胤åÄÖÝÌÂ
ASCIIS: 183, 198, 153, 212, 214, 226, 200, 211, 232, 131, 164, 229, 196, 214, 221, 204, 194. Me cuentan si lograron descifrar el mensaje.
Freeware
La figura que encabeza este articulo muestra la cara de la aplicación EncryptProject, la cual es una herramienta que utiliza las técnicas de encriptación descritas y lo creé con el propósito de proteger código Visual Basic. Es decir, supón que trabajas en un proyecto grande, en un equipo de programación y deseas mantener en privado ciertos módulos. Generalmente yo organizo mis proyectos por módulos, en carpetas aparte, así, EncryptProject tiene la finalidad de encriptar los módulos Visual Basic de esta carpeta. Así, cuando voy a trabajar, decodifico, cuando me voy encripto.
Si desea usar EncryptProject , debe tener en cuanta esta precuación:
Backup your files (in another disc or with password) before encrypt project.
No forget your password, it's without it reversing !
Encrypt only work over: Bas, Frm, Cls, Ctl, html files
Es decir, como una percusión, debiera tener al menos una copia aparte del proyecto. Pero no se atemorice, el programa es seguro, lo peor que le podría pasar al que lo use es olvidar la contraseña (EncryptProject pide verificación de la contraseña antes de codificar). Recomiendo para empezar, hacer una prueba sencilla con un proyecto simple.
Dos pasos y salimos. Hagamos una prueba simple. Cree una carpeta, copie o cree u proyecto Visual Basic en ella.
Encriptando
Abra EncryptProject, y escriba la trayectoria completa de la carpeta (si lo prefiere, arrastre un archivo cualquiera de la carpeta desde el Explorador de archivos de Windows a la caja de texto Project Folder).
Escriba la contraseña y use el comando [Encrypt]. Se pedirá la verificacion de la contraseña. Despues de confirmar, se encriptará el proyecto.
Decodificando
Abra EncryptProject, y escriba la trayectoria completa de la carpeta (si lo prefiere, arrastre un archivo cualquiera de la carpeta desde el Explorador de archivos de Windows a la caja de texto Project Folder).
Escriba la contraseña y use el comando [Decrypt]. Si la contraseñ es correcta, el proyecto de decodificará.
EncryptProject.zip. (23kb, - Requiere Runtime de Visual Basic5)
Harvey Triana
Microsoft Developer
MVP- Visual Basic
Derechos Reservados. Autorización solo
para programación
Ultima Actualización: Wednesday 02 de
April de 2003