Una firma digital es un esquema matemático que se utiliza para demostrar la autenticidad de un mensaje o documento digital. Una firma digital válida le da al receptor la garantía que el mensaje ha sido creado por un emisor conocido, y que no ha sido alterado en el camino. Las firmas digitales se emplean por lo general en la distribución de software, en transacciones financieras, y en otros casos en los que sea importante detectar falsificaciones o manipulación indebida. (Resumen traducido de Digital Signature, Wikipedia).
Un certificado digital (también conocido como certificado de identidad) es un documento electrónico que utiliza una firma digital para vincular una clave pública con una identidad determinada - tal como el nombre de una persona o de una organización, sus direcciones, etc. Este certificado también puede usarse para verificar que una clave pública le pertenece a un individuo específico. (Resumen traducido de Public key certificate, Wikipedia)
Generando una firma digital mediante DSA (Digital Signature Algorithm):
Primera fase: Elección de los parámetros del algoritmo, los cuales pueden ser compartidos por varios usuarios del sistema.
(Nota: /dev/random es un archivo especial que se encuentra presente en sistemas operativos basados en Unix y se emplea como un generador de números aleatorios mediante el acceso a "ruido ambiental" recogido de drivers de dispositivos y otras fuentes).
Segunda fase: Cálculo de clave pública y privada para un usuario determinado.
Creo el archivo "archivo.sha1" con el hash sha1 de "archivo" (por eso filtro con awk la primer columna a fin de utilizar el hash propiamente dicho, ver las diferencias en las imágenes siguientes. Con print $0 muestro todo el contenido del archivo sin filtrar, pero a mí me interesa únicamente el hash, por ese motivo empleo print $1). Para esto se puede utilizar tanto el comando sha1sum como openssl dgst -sha -sha1.
Creo la firma digital del hash (archivo.sha1) correspondiente al archivo "archivo", con mi clave privada. Luego verifico con mi clave pública que la firma "firma" es la que corresponde al hash que contiene archivo.sha1:
De esta manera, si se pudo verificar la firma con la clave pública del emisor, significa que éste último es el único que puede haberla creado a partir de su clave pública.
Por último, en este link hay un excelente recurso para comprender los conceptos de clave pública y privada, y firmas / certificados digitales.
Mostrando entradas con la etiqueta VPN. Mostrar todas las entradas
Mostrando entradas con la etiqueta VPN. Mostrar todas las entradas
miércoles, 5 de diciembre de 2012
lunes, 3 de diciembre de 2012
Funciones hash
Una función hash genera una cadena de caracteres a partir de un mensaje o de un archivo para determinar si el mismo ha sido modificado en la cadena de transmisión (de ser así, el resultado de la función cambia) y de esa manera asegurar su integridad y autenticidad.
Para evitar la posibilidad de que tanto el mensaje (archivo) como su hash correspondiente sean modificados en el camino, el emisor puede utilizar un cifrador asimétrico para encriptar el hash con una clave pública. El problema con esto es que cualquiera que tenga la clave pública puede interceptar el mensaje con su hash, modificarlos, y enviarlos nuevamente.
La manera de evitar este último incoveniente es combinar un algoritmo simétrico con uno asimétrico, generando un secreto compartido (clave simétrica) entre emisor y receptor, el cual si bien no va a ser usado para encriptar, el emisor va a concatenar esta clave al contenido del mensaje original, y a eso le va a calcular el hash, para luego encriptar este último con la clave pública. Sin embargo, lo que se envía es el mensaje original sin la clave concatenada, y el hash encriptado. Cuando se recibe, se descifra el hash enviado, se concatena el mensaje con el secreto compartido, se le calcula el hash en destino y se calcula con el que se recibió - la igualdad de ambos asegura la autenticidad y la integridad de la transmisión.
En resumen:
SHA-1 emplea hashes de 160 bits, y el SHA-512 de 512 bits.
Ejemplos:
Para evitar la posibilidad de que tanto el mensaje (archivo) como su hash correspondiente sean modificados en el camino, el emisor puede utilizar un cifrador asimétrico para encriptar el hash con una clave pública. El problema con esto es que cualquiera que tenga la clave pública puede interceptar el mensaje con su hash, modificarlos, y enviarlos nuevamente.
La manera de evitar este último incoveniente es combinar un algoritmo simétrico con uno asimétrico, generando un secreto compartido (clave simétrica) entre emisor y receptor, el cual si bien no va a ser usado para encriptar, el emisor va a concatenar esta clave al contenido del mensaje original, y a eso le va a calcular el hash, para luego encriptar este último con la clave pública. Sin embargo, lo que se envía es el mensaje original sin la clave concatenada, y el hash encriptado. Cuando se recibe, se descifra el hash enviado, se concatena el mensaje con el secreto compartido, se le calcula el hash en destino y se calcula con el que se recibió - la igualdad de ambos asegura la autenticidad y la integridad de la transmisión.
En resumen:
- Se genera un secreto compartido entre emisor y receptor.
- El emisor concatena el mensaje original junto con el secreto compartido, y calcula el hash del resultado.
- Se envía el mensaje original y el hash obtenido en el punto 2 de forma separada.
- En el destino, se concatena el mensaje recibido y el secreto compartido.
- Se calcula el hash del resultado obtenido en el punto 4.
- Se compara el hash del punto 2 con el del punto 5.
SHA-1 emplea hashes de 160 bits, y el SHA-512 de 512 bits.
Ejemplos:
- Creo el archivo llamado "archivo" y le agrego la cadena "Yo uso CentOS :)".
- Calculo el hash MD5 de archivo.
- Le agrego un espacio (" ") a "archivo".
- Vuelvo a calcular el hash MD5 y comparo los hashes obtenidos.
- Creo el archivo "archivo" con el texto original ("Yo uso CentOS :)") y calculo los hashes SHA-1 (160 bits) y SHA-2 512 de 512 bits.
jueves, 29 de noviembre de 2012
Conceptos de criptografía (2da parte)
Cifradores asimétricos: Permiten encriptar un mensaje utilizando una clave y descifrarlo utilizando otra (claves pública y privada, respectivamente). En otras palabras, si alguien quiere enviarme un mensaje cifrado con mi clave pública (la cual puede distribuirse libremente), solamente yo voy a poder desencriptarlo utilizando mi clave privada (que es estrictamente personal y no debe compartirse bajo ningún punto de vista).
La generación de estas claves se basa en cálculos de números primos y logaritmos.
El algoritmo RSA es el más utilizado en el cifrado asimétrico (ver este link para una descripción completa de su funcionamiento con ejemplos).
Genero mi clave privada, obtengo la clave pública a partir de la misma, y la muestro:
Fig. 1: Generación de claves
Ahora voy a probar en encriptar un mensaje con esta clave pública (pruebo desde una máquina virtual simulando un emisor, que también podía ser otro usuario del mismo equipo)...
Fig. 2: Cifrado de mensajes
para luego descifrarlo utilizando mi clave privada:
Fig. 3: Desencriptar mensajes ("Yo uso Debian :)" es el contenido de "archivo", que me acabo de dar cuenta que no salió en la captura de pantalla correspondiente a la Figura 2)
Para tener en cuenta: al compartir la clave pública lo conveniente es distribuir el archivo pub.pem directamente en vez de "copiar y pegar" sus contenidos en un archivo vacío y darle el mismo nombre (al principio probé de esta última manera, pero al parecer por una cuestión de formato me daba el error "Unable to load Public Key").
martes, 27 de noviembre de 2012
Conceptos de criptografía (1era parte)
La criptografía actualmente se encarga del estudio de los algoritmos, protocolos y sistemas que se utilizan para dotar de seguridad a las comunicaciones, a la información y a las entidades que se comunican (José Pastor Franco, Miguel Ángel Sarasa López, José Luis Salazar Riaño,"Criptografía digital: fundamentos y aplicaciones",Ed. Prensas Universitarias de Zaragoza, 1998), permitiendo que los mensajes puedan ser leídos (descifrados) únicamente por el emisor de los mismos y el (o los) destinatario(s) deseado(s), pudiendo estos últimos tener la seguridad de que dichos mensajes proceden de quienes dicen ser los emisores, y que no han sido alterados en el camino. De esta manera, las palabras claves para la criptografía son privacidad, integridad, y autenticidad.
Tabla 1: Encriptación del mensaje
Tabla 2: Desencriptación del mensaje
Cifradores simétricos: encriptan y desencriptan la información utilizando la misma clave.
Por ejemplo, digamos que se quiere enviar el texto "gabriel" como mensaje cifrado, utilizando la cadena "0123" como clave.
Caracteres ASCII
|
Hex
|
| gabriel (código ASCII tomado de aquí) | 67 61 62 72 69 65 6C |
| 0123012 (la clave se repite secuencialmente hasta abarcar todos los caracteres que se desean encriptar) |
30 31 32 33 30 31 32 |
| Algoritmo de cifrado: OR Exclusivo (Mensaje cifrado) | 57 50 50 41 59 54 5E |
Caracteres ASCII
|
Hex
|
| Mensaje cifrado | 57 50 50 41 59 54 5E |
| 0123012 (la clave se repite secuencialmente hasta abarcar todos los caracteres que se desean encriptar) |
30 31 32 33 30 31 32 |
| Algoritmo de descifrado: OR Exclusivo (Mensaje original) | 67 61 62 72 69 65 6C |
Ejemplo 1: Encriptando con RC4 (algoritmo de cifrado simétrico por stream) mediante la API de OpenSSL
a) Envío la cadena de caracteres "HolaMundo" al archivo y lo leo con "cat":
b) Encripto el archivo "mensaje" tomándolo como entrada, y obteniendo "mensaje.enc" como salida (cuando pide la contraseña de encriptación se puede poner cualquier cadena de texto, yo puse "0123"):
c) Compruebo la encriptación del archivo:
d) Desencripto y comparo:
Ejemplo 2: Encriptando con 3DES (algoritmo de cifrado simétrico por bloques, que cifra un cierto mensaje 3 veces utilizando claves aleatorias de 64 bits, razón por la cual es un tanto "lento").
Suscribirse a:
Entradas (Atom)





