Está en la página 1de 4

Encriptacin

1 de 4

http://vexpert.mvps.org/articles/vbEncrypt.htm

Encriptacin de Cadenas
Algunos Procedimiento Visual Basic para Codificar y Decodificar Informacin
Por Harvey Triana
La Encriptacin, es un tema de la programacin bien interesante, de hecho se trata de una alta ciencia de la informtica, que pasa por
arte, inclusive hoy se trata de una tecnologa. Encriptacin es una palabra rara en espaol, quiz fea, no obstante se emplea en
documentacin tcnica.

Buscando en el cajn de los recuerdos, encontr un par de procedimientos para Codificacin / Decodificacin con QuickBasic.
Desaforadamente desconozco al programador de tales procedimientos. Despus de traducir las rutinas para que trabajasen en Visual
Basic me di cuenta que tenan fallas de programacin, sin embargo la documentacin del cdigo me llevo a captar la idea del autor y
ponerla a funcionar perfectamente. Tales procedimientos se exponen en este documento.

Algo de Teora
Recuerdo que alguien comentaba que codificar era muy sencillo, simplemente cambias unas letras por otras, y el receptor del mensaje
conoce este secreto. Tambin, aumentar o disminuir un nmero discreto a los cdigos 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 encriptacin se hace a travs de la aplicacin de cierto tratamiento a los cdigos ASCII de los mensajes, de manera que el tratamiento
inverso ser el nico camino prctico para decodificar el mensaje.
Cmo se mantiene indescifrable una cadena codificada?. Se trata de combinar la clave de encriptacin 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 prximas. 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 terica, uno de los algoritmos de codificacin se basa en la funcin nmeros primos. Por ejemplo resulta fcil multiplicar
dos nmeros primos, sean a = 11927 y b = 20903, de manera que a b = c = 249310081. Pero resulta muy difcil determinar a y b a partir
de c. Matemticamente esto se hace a travs del procedimiento conocido como Descomposicin Factorial. En el ejemplo c viene a ser la
codificacin, mientras a y b son la clave de decodificacin. Esta estrategia es la base de un ingenioso y sofisticado sistema de
encriptacin llamado Criptosistema RSA (en honor a sus autores). de hecho este es el mejor sistema de encriptacin 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 dgitos, lo cual tericamente requiere de millones de aos para descomponer factorialmente. Una ancdota citada en el
libro Camino al Futuro (2 edicin) de Mr. Gates, cuenta que un reto publico de descifrar una clave de 129 dgitos fue superado al
coordinar un trabajo de varias computadoras e Internet, para finalmente lograr la respuesta en menos de un ao. En el reto los autores
predecan que su mensaje jams sera desvelado. El libro mencionado hace una exposicin ms detallada de este tema. Por supuesto, este
articulo no llegar tan lejos.

Dos Procedimientos de Encriptacin


La Encriptacin 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 encriptacin produce un mensaje o archivo cifrado. Presento dos procedimientos escritos en
Visual Basic, catalogados como verdaderas maneras de encriptacin.

Modelo EncryptionString
EncryptionString, es un clsico sistema el cual toma el mensaje y una clave del usuario, y a travs de una combinacin de estos dos
parmetros se produce una cadena codificada. Mantengo la explicacin original del mtodo:

19/02/2014 20:59

Encriptacin

2 de 4

http://vexpert.mvps.org/articles/vbEncrypt.htm

EncryptionString, es un clsico sistema el cual toma el mensaje y una clave del usuario, y a travs de una combinacin de estos dos
parmetros se produce una cadena codificada. Mantengo la explicacin original del mtodo:
Texto a codificar:
Caracteres del Texto:
Cdigos ASCII:
Contrasea KEY:
Caracteres de KEY:
Suma de Cdigos ASCII:
En caracteres:

ENCRYPTION
E
N
C
69 78 67
K
E
Y
75 69 89
144 147 156

Texto codificado:

??

R
82
K
75
157
?

Y
89
E
69
158

P
80
Y
89
169

T
84
K
75
159
?

I
73
E
69
142

O
79
Y
89
168

N
78
K
75
153

El modo para usar la funcin EncryptionString es el siguiente:


'//Codifica
TextoCodificado = EncryptString(TextoOriginal, Contrasea, ENCRYPT)
'//Decodifica
TextoOriginal = EncryptString(TextoCodificado, Contrasea, DECRYPT)
La ventaja de esta tcnica es que es muy flexible de usar e intuitiva. Sin tener la mxima seguridad, es muy segura. Escribir un programa
para encriptar archivos resulta bastante simple por aquello de la contrasea. No ocurre lo mismo con el siguiente procedimiento:
ChrTran.
El cdigo 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,
Temp = TextASCIIS(i) +
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,
Temp = TextASCIIS(i) If Temp < 0 Then
Temp = Temp + 255

j + 1)
UserKeyASCIIS(j)

j + 1)
UserKeyASCIIS(j)

19/02/2014 20:59

Encriptacin

3 de 4

http://vexpert.mvps.org/articles/vbEncrypt.htm

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 prctica (por ejemplo las calculadoras comunes soportan solo hasta 69!).
Tengo que confesar que tuve que reescribir ChrTran porque presentaba errores de programacin y mucho cdigo para optimizar, el
resultado es sorprendente. Ni que decir que no tena en cuenta que en espaol usamos tildes y ees.
Como su abreviacin lo dice ChrTran transpone caracteres, usa dos claves de 255 caracteres (la carta ASCII) y produce un texto
codificado de origen aleatorio. Toma cada carcter del texto, encuentra su posicin en la primera clave, e intercambia este carcter por el
carcter en la misma posicin de la segunda clave. Es complicado de asimilar.
Lo ms difcil de ChrTran es el manejo de las claves. La primera clave (la sarta de bsqueda) podra 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()
'//
'//
'//
'//
'//
For

Se podra usar la sarta de bsqueda, ClaveDeBsqueda, como


otra cadena aleatoria con ClaveDeBsqueda = RandomChart()
aqui se mantiene un nivel de Encriptacin flexible, ms no
inseguro, al hacer ClaveDeBsqueda como la secuencia 0 a 255
de la carta ASCII:
i = 0 To 255
ClaveDeBsqueda = ClaveDeBsqueda + Chr$(i)

Next
'//Codifica
TextoCodificado = ChrTran(TextoOriginal, ClaveDeBsqueda, ClaveAleatoria)
'//Decodifica
TextoOriginal= ChrTran(TextoCodificado, ClaveAleatoria, ClaveDeBsqueda)
En la primera lnea se usa RandonChart, la cual es una funcin que retorna la carta ASCII en un orden aleatorio.
Como posiblemente se deduce, usar ChrTran para escribir un programa que trabaje encriptacin, representa una labor bastante
especializada, pero por supuesto nada del otro mundo.
El cdigo 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

19/02/2014 20:59

Encriptacin

4 de 4

http://vexpert.mvps.org/articles/vbEncrypt.htm
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

Aplicacin de Ejemplo
La figura que encabeza este articulo muestra la cara de la aplicacin EncryptProject, la cual es una herramienta que utiliza las tcnicas de
encriptacin descritas y lo cre con el propsito de proteger cdigo Visual Basic. Es decir, supn que trabajas en un proyecto grande, en
un equipo de programacin y deseas mantener en privado ciertos mdulos. Generalmente yo organizo mis proyectos por mdulos, en
carpetas aparte, as, EncryptProject tiene la finalidad de encriptar los mdulos Visual Basic de esta carpeta. As, cuando voy a trabajar,
decodifico, cuando me voy encripto.
Si desea usar EncryptProject , debe tener en cuanta esta precuacin:
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 percusin, debiera tener al menos una copia aparte del proyecto. Pero no se atemorice, el programa es seguro, lo peor
que le podra pasar al que lo use es olvidar la contrasea (EncryptProject pide verificacin de la contrasea 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 contrasea y use el comando [Encrypt]. Se pedir la verificacin de la contrasea. Despus de confirmar, se
encriptar el proyecto.

19/02/2014 20:59

También podría gustarte