Pcultimate.net

Bienvenido, invitado ( Identificarse | Registrarse )

 
Closed TopicStart new topic
> Criptografía En Vb
Krosty
mensaje Oct 14 2006, 06:11 PM
Publicado: #1


Demonio super satanico amo del mundo
Ícono de Grupo

Grupo: Webmaster
Mensajes: 1,761
Registrado: 13-February 06
Desde: Argentina
Miembro No.: 2



ASEGUREMOS NUESTROS DATOS DE FORMA CONFIABLE
Con la ayuda de las funciones de Microsoft CryptoAPI,
aumentar LA SEGURIDAD DE NUESTROS DATOS no
es complicado, aunque, por suerte, sí lo será descifrarlos
para aquél que no disponga de la clave correcta. En esta
nota, encontrarán la introducción al tema y un ejemplo
concreto.

Criptografía en VB


La criptografía no es nueva, y como la conocemos hoy en
día, comenzó a formarse a fines de los preciados años ‘70
de los hippies; aunque claro, no fueron ellos quienes la impulsaron,
sino instituciones militares y gubernamentales norteamericanas,
ansiosas de poder resguardar información importante.
De esa forma, muchos científicos y empresas comenzaron a
desarrollar algoritmos de cifrado, hasta que algunos lograron
estandarizarse, y muchos otros quedaron en el camino.
La criptografía transforma un texto legible en otro totalmente
confuso (texto cifrado, o ciphertext), con el objetivo principal
de que este último no pueda ser descifrado sin disponer
de la clave adecuada, o que hacerlo sea más costoso que el valor
de la información contenida, de modo que nadie pretenda
siquiera intentarlo. Además de esta valuable privacidad, existen
muchas técnicas criptográficas que también permiten verificar
la integridad de un texto (cerciorarse de que no haya
sido modificado) y su autenticidad, es decir, asegurarse de
que el texto haya sido escrito por quien dice haberlo hecho.
Antes de continuar, vamos a hacer una breve introducción a
L las técnicas criptográficas en general, para que quienes no estén
en tema también puedan aprovechar el resto de la nota.
Criptografía simétrica o de clave privada. Se caracteriza
porque la clave utilizada para cifrar un texto es la misma que
se necesita para descifrarlo luego. Son algoritmos rápidos,
aunque su principal desventaja es que en un esquema de comunicación,
el emisor y el receptor deben conocer la clave, y
entonces se hace necesaria la existencia de un canal seguro
para su intercambio. Cuanto más larga sea esta clave, más
tiempo le tomará a la fuerza bruta desencriptar un texto. Los
algoritmos simétricos más utilizados son:

• DES (Data Encryption Standard). Fue desarrollado por
IBM en 1974 y originalmente se llamaba “Lucifer” (¿tendrá
orígenes satánicos?). Utiliza claves numéricas de
56 bits, y es uno de los pioneros y más populares. Han surgido
variantes más poderosas, como 3DES o Triple DES.

• RC2, RC4, RC5.

• AES (Advanced Encryption Standard). Es un algoritmo en
ASEGUREMOS NUESTROS DATOS DE FORMA CONFIABLE

Con la ayuda de las funciones de Microsoft CryptoAPI,
aumentar LA SEGURIDAD DE NUESTROS DATOS no
es complicado, aunque, por suerte, sí lo será descifrarlos
para aquél que no disponga de la clave correcta. En esta
nota, encontrarán la introducción al tema y un ejemplo
concreto.

Mensaje modificado por Krosty el Oct 14 2006, 06:15 PM
Go to the top of the page
 
+Quote Post
Krosty
mensaje Oct 14 2006, 06:12 PM
Publicado: #2


Demonio super satanico amo del mundo
Ícono de Grupo

Grupo: Webmaster
Mensajes: 1,761
Registrado: 13-February 06
Desde: Argentina
Miembro No.: 2



Criptografía en VB
Figura 1. Un típico formulario para cambiar una clave.
La cantidad de asteriscos no tiene relación con el tamaño real
del password, ya que, en realidad, el programa no lo conoce
(sólo tiene el Hash que genera).
Figura 2. Nuestro ejemplo terminado. Permite encriptar y
desencriptar un texto con el algoritmo RC4, y aplicar el MD5.
Mariano BIRNIOS
mariano@tectimes.com
Programador experto; las siglas VB ya
son sinónimo de Mariano en la editorial.
66 u s e r s . t e c t i m e s . c o m
ProgramacionU#43.qxd 4/12/01 12:34 PM Page 66
u s e r s . t e c t i m e s . c o m 67
vías de desarrollo, que se espera reemplace al DES para
resguardar información altamente confidencial en los próximos
años.

Criptografía asimétrica o de clave pública. En este sistema
todas las personas o entes disponen de dos claves: una
privada y otra pública. Si un mensaje es encriptado con la
clave pública de una persona, éste sólo podrá ser descifrado
con la clave privada de ella (por ejemplo, si Moria le quiere
enviar un mensaje a Graciela, entonces Moria debe encriptarlo
con la clave pública de Graciela, para que sólo ella pueda
descifrarlo, con su clave privada que sólo ella conoce).
Además, si un mensaje es encriptado con la clave privada de
una persona, sólo podrá ser desencriptado con su clave pública,
haciendo la tarea de autenticación, es decir, afirmando
que el mensaje cifrado provino de la persona indicada.
Dada su mayor complejidad, los algoritmos de clave pública
son más lentos que los simétricos. Los más conocidos son:

• RSA. Es el más rápido y sencillo de los existentes.

• Diffie-Hellman. Se utiliza principalmente para intercambiar
claves simétricas en canales inseguros.
Hashing. Son algoritmos (basados en funciones hash) que
se aplican a un texto y devuelven como resultado un pequeño
“resumen” de un tamaño fijo de, al menos, 128 bits. El
proceso es irreversible, pero lo interesante es que la más mínima
modificación al texto original haría que el resultado del
hash fuera diferente. El uso más habitual de estos algoritmos
es para verificar la integridad de un texto: se envía un texto
cifrado junto con su resumen hash, y si luego el texto descifrado
genera el mismo resumen recibido, el mensaje está íntegro.
Básicamente, hay dos familias de algoritmos populares:

• MD2, MD4, MD5. El más usado, el MD5, genera resúmenes
de 128 bits.

• SHA (Secure Hash Algorithm). Es más joven que el MD5,
y genera resultados de 160 bits.

Certificados digitales. Son certificados que se utilizan para
probar la identidad de una persona (o cualquier ente) en una
comunicación, por ejemplo, en Internet. Para esto interviene
una organización (Certification Authority) que se encarga de
otorgar los certificados asociados a una clave pública.
Ahora bien, no todo lo que mencionamos hasta el momento
está a nuestro alcance. Y no es porque no tengamos el conocimiento
suficiente o las herramientas necesarias para utilizarlo,
sino porque los Estados Unidos no permiten que sus empresas
exporten ciertos algoritmos a otros países, por considerarlos
elementos de inteligencia militar, o algo así. Es el caso del famoso
PGP, sólo estando en los Estados Unidos es posible descargar
el programa de la Web para utilizarlo con todo su potencial.
El resto del mundo sólo se limita a utilizar una versión reducida
con menos algoritmos o claves de menor longitud. Esperemos
que este tipo de estupideces militares se acabe pronto...
En esta nota sólo vamos a ver cómo utilizar
algunas formas de criptografía simétrica
y hash desde VB.
Go to the top of the page
 
+Quote Post
Krosty
mensaje Oct 14 2006, 06:13 PM
Publicado: #3


Demonio super satanico amo del mundo
Ícono de Grupo

Grupo: Webmaster
Mensajes: 1,761
Registrado: 13-February 06
Desde: Argentina
Miembro No.: 2



Microsoft CryptoAPIs
Como se imaginarán, por suerte no es necesario
programar todos esos algoritmos
para poder utilizarlos, sino que basta con
hacerse amigo de las CryptoAPIs, y para
eso, mis queridos lectores, fue escrita esta
A lo largo de la nota,
vamos a ver los conceptos
necesarios para construir
un pequeño encriptador
utilizando las Microsoft
CryptoAPIs.

✚ Para saber más
Para encontrar más información, pueden consultar alguno de los siguientes links:

✚ msdn.Microsoft.com/library En la sección Platform SDK/Security/Cryptography/
CryptoAPI encontrarán toda la referencia a las CryptoAPIs.

✚ www.cryptovb.com Un sitio dedicado a la criptografía en Visual Basic.

✚ www.allapi.net Si bien este sitio es una guía general de funciones API,
tiene información y ejemplos de las CryptoAPIs.
ProgramacionU#43.qxd 4/12/01 12:34 PM Page 67

E X P E R T O S P R O G R A M A C I Ó N
LISTADO 1:
Function Encriptar(Texto As String, Password As
String) As String
Dim hProvider As Long
Dim hHash As Long
Dim hKey As Long
Dim Buffer As String
Dim BufferLen As Long
Dim DataLen As Long
CryptAcquireContext hProvider, vbNullChar,
MS_DEF_PROV, PROV_RSA_FULL, 0
CryptCreateHash hProvider, CALG_MD5, 0, 0,
hHash
CryptHashData hHash, Password, Len(Password), 0
CryptDeriveKey hProvider, CALG_RC4, hHash, 0,
hKey
DataLen = Len(Texto)
BufferLen = DataLen * 2
Buffer = Texto & String(DataLen, vbNullChar)
CryptEncrypt hKey, 0, True, 0, Buffer, Data-
Len, BufferLen
Buffer = Left(Buffer, DataLen)
CryptDestroyHash hHash
CryptDestroyKey hKey
CryptReleaseContext hProvider, 0
Encriptar = Buffer
End Function
68 u s e r s . t e c t i m e s . c o m
nota. Todo lo que necesitan es estar duchos en el manejo de
funciones API, aunque, si no es así, en el CD encontrarán el código
de algunas funciones criptográficas listas para utilizar.
Las APIs de criptografía se encuentran en el archivo advapi32.
dll, el mismo que contiene las funciones de acceso al Registro
de Windows. La macana es que las declaraciones de las
CryptoAPIs no se encuentran disponibles en el API Text Viewer
de VB, es decir que no podemos buscar allí las funciones para
copiar y pegar su declaración en nuestros proyectos. Todas las
declaraciones de las funciones se encuentran en el archivo
wincrypt.h, incluido en VC++ y escrito en C. Por eso en Internet
pululan “traducciones” de este archivo, adaptando las declaraciones
a Visual Basic. Así que, ojo al piojo, porque no todas
funcionan correctamente. El archivo modCryptoAPI.bas que
encontrarán en el CD contiene mi versión de las declaraciones,
que con los ejemplos y pruebas funcionaron correctamente.
Cryptographic Service Providers
Los CSPs o proveedores son el medio que Microsoft encontró
para organizar la gran familia de algoritmos y técnicas disponibles
a través de las CryptoAPIs. Antes de utilizar cualquier
servicio de estas APIs, será necesario iniciar uno de estos proveedores.
En la Tabla 1 se nombran los dos más comunes, aunque
sólo el básico está disponible fuera de los Estados Unidos.
La realidad indica que si queremos utilizar estas APIs y asegurarnos
de que van a funcionar en cualquier máquina, deberemos
quedarnos con el Microsoft Base Cryptographic Provider.
Además, cada proveedor es de un tipo determinado (Provider
Type), que en general indica qué clases de algoritmos están
disponibles con él. El tipo que siempre vamos a usar nosotros
es PROV_RSA_FULL, ya que es de propósito general y cuenta
con algoritmos de encriptación, hashing y firmas digitales.
Pasemos a la práctica. Lo primero que debemos hacer siempre
es obtener un handle al proveedor deseado. Para esto, utilizamos
la función CryptAquireContext:
Dim hProvider As Long
CryptAcquireContext hProvider, vbNullChar, MS_DEF-
_PROV, PROV_RSA_FULL, 0
En el primer parámetro pasamos una variable del tipo Long,
en la que se guardará el handle al proveedor, que luego deberemos
utilizar con el resto de las funciones. El tercer parámetro
indica el nombre del proveedor que vamos a usar (podemos
emplear las constantes declaradas en modCryptoAPIs), y
el cuarto indica el Provider Type (que para nosotros siempre
será PROV_RSA_FULL). El último parámetro son flags, que casi
no se usan. En todas las funciones que vamos a ver en la
nota, si hubo éxito, la función devuelve 1, y si hubo error, un
0 o False.
De ahora en más, no importa lo que vayamos a hacer con el
proveedor, seguramente necesitaremos la variable hProvider,
así que conservémosla bien.
Crear una clave
A pesar de que como “clave” uno tiende a pensar en una
palabra, una clave o key es un número para los algoritmos
criptográficos. La longitud de este número generalmente varía
entre 40 y 256 bits. Cuanto más larga, más segura será.
Ahora bien, para nosotros, los humanos, no es sencillo recordar
semejantes números, sino que nos sentimos más cómodos
poniendo nuestra fecha de cumpleaños, teléfonos, direcciones
y todo tipo de palabras que no deberíamos usar. En
fin, para utilizar cualquier algoritmo, necesitamos crear una
clave numérica, para lo cual tenemos dos vías principales:

• Generar la clave al azar, mediante la función CryptGen-
Key. (Aunque parezca tonto, esto puede llegar a ser muy
útil en algunas situaciones particulares).

• Generar la clave a partir de un string (un password).
¡Sí! Esto es lo que necesitamos, aunque no es lo más
sencillo, ya que antes deberemos aplicarle un hash al
texto del password y después generar la clave a partir
de éste.
ProgramacionU#43.qxd 4/12/01 12:34 PM Page 68
u s e r s . t e c t i m e s . c o m 69
Go to the top of the page
 
+Quote Post
Krosty
mensaje Oct 14 2006, 06:14 PM
Publicado: #4


Demonio super satanico amo del mundo
Ícono de Grupo

Grupo: Webmaster
Mensajes: 1,761
Registrado: 13-February 06
Desde: Argentina
Miembro No.: 2



Tabla 1
Los dos CSPs más habituales. Ambos son del tipo PROV_RSA_FULL, es decir, de propósito general (soportan encriptación de
datos y otras yerbas, como firmas digitales).
Proveedor Constante Descripción
Microsoft Base MS_DEF_PROV Es el más simple y popular. Nos permite utilizar RSA
Cryptographic Provider para el intercambio de claves, RC2, RC4 y DES
(este último, sólo en W2000 y con claves de 56 bits)
para encriptación, y MD2, MD5 y SHA para hashing.
Microsoft Enhanced MS_ENHANCED_PROV Agrega más algoritmos al anterior (por ejemplo, 3DES) y soporta
Cryptographic Provider claves de mayor longitud. Disponible sólo en EE.UU. y Canadá.
LISTADO 2:
Function Hash(Texto As String) As String
Dim hProvider As Long
Dim hHash As Long
Dim HashSize As Long
Dim Buffer() As Byte
Dim BufferLen As Long
CryptAcquireContext hProvider, vbNullChar,
MS_DEF_PROV, PROV_RSA_FULL, 0
CryptCreateHash hProvider, CALG_MD5, 0, 0,
hHash
CryptHashData hHash, Texto, Len(Texto), 0
BufferLen = 4
ReDim Buffer(BufferLen - 1)
CryptGetHashParam hHash, HP_HASHSIZE, Buffer(
0), BufferLen, 0
HashSize = Buffer(0)
ReDim Buffer(HashSize - 1)
CryptGetHashParam hHash, HP_HASHVAL, Buffer(
0), HashSize, 0
CryptDestroyHash hHash
CryptReleaseContext hProvider, 0
Hash = ArrayToString(Buffer)
End Function
encriptado puede terminar siendo más largo). La variable Buffer
contiene el texto a encriptar, seguido de caracteres nulos, para
llenar el tamaño necesario que debe tener el buffer.
Luego, la función CryptEncrypt es la que se encarga del proceso.
Como primer parámetro, recibe la clave a utilizar, que es
el hKey que obtuvimos anteriormente. Cuando termina su proceso,
la función deja en Buffer el texto encriptado, y guarda
En síntesis, el siguiente código genera una clave a partir de
un password en formato string:
CryptCreateHash hProvider, CALG_MD5, 0, 0, hHash
CryptHashData hHash, Password, Len(Password), 0
CryptDeriveKey hProvider, CALG_RC4, hHash, 0, hKey
Vayamos por partes. La primera función sólo crea un handle
(hHash) a un objeto hash, e indica el algoritmo de hashing a
utilizar (MD5). Luego, la función CryptHashData genera el
verdadero hash, a partir del texto contenido en Password (que
es un string común y corriente). Finalmente, la última función,
CryptDeriveKey, “deriva” el hash generado en una clave,
cuyo handle almacena en hKey. Ojo, hKey no contiene el
valor de la clave, sólo una especie de puntero hacia ésta.
Cuando posteriormente vayamos a encriptar un texto, necesitaremos
la variable hKey para indicar la clave a utilizar. Notemos
que al crear la clave se indica el algoritmo de encriptación
que posteriormente se va a utilizar con ella. En nuestro
caso, usamos RC4 (indicado en CALG_RC4). En la Tabla 2
pueden ver un listado con los algoritmos más habituales.
Encriptar un texto con la clave
Hasta aquí, sólo hemos realizado los dos primeros ítems del
proceso completo:

• Obtener un handle del proveedor deseado.

• Crear una clave a partir de una cadena de caracteres.

• Encriptar un texto con la clave generada.
El último paso, en el que realmente se encripta el texto, no
es más complicado que los anteriores:
DataLen = Len(Texto)
BufferLen = DataLen * 2
Buffer = Texto & String(DataLen, vbNullChar)
CryptEncrypt hKey, 0, True, 0, Buffer, DataLen, BufferLen
Buffer = Left(Buffer, DataLen)
La primera variable, DataLen, contiene la longitud del texto a
encriptar. La segunda variable, BufferLen, establece la longitud
máxima del buffer en el cual la función de encriptación guardará
su resultado. Se suele estimar que nunca podrá ser mayor que el
doble del tamaño del texto original (porque, claro está, el texto
ProgramacionU#43.qxd 4/12/01 12:34 PM Page 69
70 u s e r s . t e c t i m e s . c o m
E X P E R T O S P R O G R A M A C I Ó N
en DataLen la longitud de éste, para que podamos quedarnos
sólo con la parte válida del string (mediante la función Left).
Misión cumplida. Lo único que queda es cerrar los handles
utilizados, para liberar sus recursos:
CryptDestroyHash hHash
CryptDestroyKey hKey
CryptReleaseContext hProvider, 0
En el Listado 1 pueden ver todo esto en forma de una amigable
función, que recibe un texto a encriptar y el password
que se utilizará, y devuelve el texto ya encriptado.
Hay que tener en cuenta que, si bien las funciones lo soportan,
no hemos incluido el control de errores. Es decir, ¿qué pasa
si la función devuelve False? Eso quedará como tarea para
los lectores, pero cabe recordarlo para que no lo olviden a la
hora de depurar sus programas...
Hashing
Como expliqué brevemente al principio, las técnicas de
hashing permiten obtener un pequeño “resumen” (de generalmente
128 bits) a partir de cualquier texto. Si un ínfimo bit del
texto cambia, el resultado del hash será distinto. Además, del
resumen hash es imposible volver a obtener el texto original.
Hay dos usos principales que le podemos dar a esta técnica:
• Verificar la integridad de un texto.
• Almacenar una lista de passwords, sin necesidad de
guardarlos en su forma original.
El primer punto ya fue explicado y es sencillo: teniendo un
texto cifrado y el hash de su original, si al aplicar el mismo
algoritmo de hashing sobre el texto descifrado no coinciden
los resúmenes, el texto habrá cambiado y no será íntegro.
El segundo punto puede ser más útil para incorporar en nuestras
aplicaciones, si tenemos un sistema con varios usuarios y
passwords. Sucede que tenemos que guardar las claves de acceso
en algún lugar, para compararlas con las ingresadas por los
usuarios en cada sesión. ¿Dónde lo hacemos? Obviamente, el archivo
INI con la sección [Passwords] no es lo más indicado. En
fin, no importa dónde guardemos las claves, éstas pueden ser
descubiertas, y aunque guardáramos la lista cifrada, también necesitaríamos
un password para descifrarla... ¿Dónde lo guardamos?
¡Ya sé! Encriptamos ese password también, y entonces...
Lo que podemos hacer es guardar sólo el resumen hash asociado
a cada usuario, y luego comparar el resumen que genera
el password ingresado con el almacenado. Si alguien accede
a nuestra lista de claves:

• Sólo verá los resúmenes hash.

• No podrá saber con qué palabras se genera cada uno.

• Tampoco podrá obtener un password a partir del hash,
ya que, como se dijo anteriormente, ese proceso es imposible.
De hecho, éste es el método que utilizan varios sistemas para
guardar este tipo de información. Si son observadores, verán
que, al cambiar un password, generalmente la cantidad de
asteriscos que aparecen no se equipara con la de letras de la
clave (ver Figura 1). Esto se debe a que ni siquiera el programa
conoce la clave verdadera: sólo tiene el hash que genera.
El uso de estas técnicas con las CryptoAPIs se realiza mediante
las funciones CryptCreateHash, CryptDestroyHash,
CryptHashData, CryptGetHashParam y CryptSetHashParam.
Hay más, pero éstas son las principales. La idea es:

• Como siempre, obtener un handle a un CSP.

• Crear un handle a un objeto hash mediante CrypCreate-
Hash.

• Aplicar el hash a un texto, mediante CryptHashData.

• Obtener el tamaño del hash resultante, mediante Crypt-
GetHashParam.

• Obtener el hash resultante, otra vez mediante CryptGet-
HashParam.

• Cerrar los handles utilizados.
El Listado 2 contiene la función que hemos creado para aplicarle
un algoritmo de hash a un texto cualquiera. Un detalle para
tener en cuenta es que la función CryptGetHashParam, como
muchas otras CryptoAPIs, trabaja con un vector de bytes como
entrada y salida de datos, por lo que se dificulta un poco el hecho
de trabajar con strings (en C, bastaría con castear el parámetro).
Para pasar del vector a un string, hemos construido la
función ArrayToString, que pueden encontrar en el CD.
El ejemplo completo
Para terminar de analizar el tema, preparamos un ejemplo
completo que demuestra el uso de las funciones vistas en la
nota. Básicamente, permite encriptar/desencriptar un texto, y
aplicar y validar funciones de hash. Además, como extra, utiliza
algunas funciones para obtener información de los proveedores
disponibles en cada máquina (ver Figura 2).
Para terminar
Como suele suceder en estas notas, no hemos cubierto todas
las posibilidades. El mundo de la criptografía es sumamente
amplio, interesante y está en crecimiento, y las CryptoAPIs
sólo nos brindan una puerta para poder aprovechar todo eso
desde Visual Basic. Si quedaron hambrientos de más, pueden
darle un vistazo al recuadro “Para saber más”, que contiene
algunos links interesantes. ✕
Go to the top of the page
 
+Quote Post
Krosty
mensaje Oct 14 2006, 06:14 PM
Publicado: #5


Demonio super satanico amo del mundo
Ícono de Grupo

Grupo: Webmaster
Mensajes: 1,761
Registrado: 13-February 06
Desde: Argentina
Miembro No.: 2



Tabla 2
Los algoritmos más comunes y las constantes necesarias
para referenciarlos.
Algoritmo Constante Tipo
RC4 CALG_RC4 Encriptación
DES CALG_DES Encriptación
3DES CALG_3DES Encriptación
RSA CALG_RSA_KEYX Intercambio de claves
(asimétrico)
MD5 CALG_MD5 Hashing
SHA CALG_SHA Hashing
ProgramacionU#43.qxd 4/12/01 12:34 PM Page 70
Go to the top of the page
 
+Quote Post

Closed TopicStart new topic

 



AFILIATE - ENLAZANOS- VER AFILIADOS
RSS LoFi Fecha y Hora actual: 8th February 2012 - 09:28 AM